diff --git a/cps/db.py b/cps/db.py index 0a11fa95..9a89b4b7 100755 --- a/cps/db.py +++ b/cps/db.py @@ -52,23 +52,26 @@ books_languages_link = Table('books_languages_link', Base.metadata, cc = conn.execute("SELECT id, datatype FROM custom_columns") cc_ids = [] -cc_exceptions = ['bool', 'datetime', 'int', 'comments', 'float', 'composite','series' ] +cc_exceptions = [ 'datetime', 'int', 'comments', 'float', 'composite','series' ] books_custom_column_links = {} +cc_classes = {} for row in cc: if row.datatype not in cc_exceptions: books_custom_column_links[row.id] = Table('books_custom_column_' + str(row.id) + '_link', Base.metadata, Column('book', Integer, ForeignKey('books.id'), primary_key=True), Column('value', Integer, ForeignKey('custom_column_' + str(row.id) + '.id'), primary_key=True) ) - #books_custom_column_links[row.id]= - cc_ids.append(row.id) - -cc_classes = {} -for id in cc_ids: - ccdict={'__tablename__':'custom_column_' + str(id), - 'id':Column(Integer, primary_key=True), - 'value':Column(String)} - cc_classes[id] = type('Custom_Column_' + str(id), (Base,), ccdict) + cc_ids.append([row.id,row.datatype]) + if row.datatype == 'bool': + ccdict = {'__tablename__': 'custom_column_' + str(row.id), + 'id': Column(Integer, primary_key=True), + 'book': Column(Integer,ForeignKey('books.id')), + 'value': Column(Boolean)} + else: + ccdict={'__tablename__':'custom_column_' + str(row.id), + 'id':Column(Integer, primary_key=True), + 'value':Column(String)} + cc_classes[row.id] = type('Custom_Column_' + str(row.id), (Base,), ccdict) class Comments(Base): __tablename__ = 'comments' @@ -182,6 +185,7 @@ class Books(Base): last_modified = Column(String) path = Column(String) has_cover = Column(Integer) + uuid = Column(String) authors = relationship('Authors', secondary=books_authors_link, backref='books') tags = relationship('Tags', secondary=books_tags_link, backref='books') @@ -205,7 +209,10 @@ class Books(Base): def __repr__(self): return u"".format(self.title, self.sort, self.author_sort, self.timestamp, self.pubdate, self.series_index, self.last_modified ,self.path, self.has_cover) for id in cc_ids: - setattr(Books, 'custom_column_' + str(id), relationship(cc_classes[id], secondary=books_custom_column_links[id], backref='books')) + if id[1] == 'bool': + setattr(Books, 'custom_column_' + str(id[0]), relationship(cc_classes[id[0]], primaryjoin=(Books.id==cc_classes[id[0]].book), backref='books')) + else: + setattr(Books, 'custom_column_' + str(id[0]), relationship(cc_classes[id[0]], secondary=books_custom_column_links[id[0]], backref='books')) class Custom_Columns(Base): __tablename__ = 'custom_columns' diff --git a/cps/helper.py b/cps/helper.py index 3cbc4534..ac76b6fc 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -18,6 +18,7 @@ from email.MIMEBase import MIMEBase from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.generator import Generator +from flask_babel import gettext as _ import subprocess def update_download(book_id, user_id): @@ -72,8 +73,8 @@ def send_mail(book_id, kindle_mail): msg = MIMEMultipart() msg['From'] = settings["mail_from"] msg['To'] = kindle_mail - msg['Subject'] = 'Send to Kindle' - text = 'This email has been sent via calibre web.' + msg['Subject'] = _('Send to Kindle') + text = _('This email has been sent via calibre web.') msg.attach(MIMEText(text)) use_ssl = settings.get('mail_use_ssl', 0) @@ -95,7 +96,7 @@ def send_mail(book_id, kindle_mail): formats["pdf"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".pdf") if len(formats) == 0: - return "Could not find any formats suitable for sending by email" + return _("Could not find any formats suitable for sending by email") if 'mobi' in formats: msg.attach(get_attachment(formats['mobi'])) @@ -104,13 +105,13 @@ def send_mail(book_id, kindle_mail): if filepath is not None: msg.attach(get_attachment(filepath)) elif filepath is None: - return "Could not convert epub to mobi" + return _("Could not convert epub to mobi") elif 'pdf' in formats: msg.attach(get_attachment(formats['pdf'])) elif 'pdf' in formats: msg.attach(get_attachment(formats['pdf'])) else: - return "Could not find any formats suitable for sending by email" + return _("Could not find any formats suitable for sending by email") # convert MIME message to string fp = StringIO() @@ -134,7 +135,7 @@ def send_mail(book_id, kindle_mail): mailserver.quit() except (socket.error, smtplib.SMTPRecipientsRefused, smtplib.SMTPException), e: app.logger.error(traceback.print_exc()) - return "Failed to send mail: %s" % str(e) + return _("Failed to send mail: %s" % str(e)) return None @@ -154,8 +155,8 @@ def get_attachment(file_path): return attachment except IOError: traceback.print_exc() - message = ('The requested file could not be read. Maybe wrong ' - 'permissions?') + message = (_('The requested file could not be read. Maybe wrong '\ + 'permissions?')) return None def get_valid_filename(value, replace_whitespace=True): diff --git a/cps/static/css/style.css b/cps/static/css/style.css index 7db1eb1e..630767f7 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -6,6 +6,7 @@ } body{background:#f2f2f2}body h2{font-weight:normal;color:#444} +body { margin-bottom: 40px;} a{color: #45b29d}a:hover{color: #444;} .navigation .nav-head{text-transform:uppercase;color:#999;margin:20px 0}.navigation .nav-head:nth-child(1n+2){border-top:1px solid #ccc;padding-top:20px} .navigation li a{color:#444;text-decoration:none;display:block;padding:10px}.navigation li a:hover{background:rgba(153,153,153,0.4);border-radius:5px} diff --git a/cps/static/js/edit_books.js b/cps/static/js/edit_books.js index 81a25a36..a26b20a9 100644 --- a/cps/static/js/edit_books.js +++ b/cps/static/js/edit_books.js @@ -131,3 +131,49 @@ } ) }); + + var languages = new Bloodhound({ + name: 'languages', + datumTokenizer: function(datum) { + return [datum.name]; + }, + queryTokenizer: function(query) { + return [query]; + }, + remote: { + url: '/get_languages_json?q=', + replace: function(url, query) { + url_query = url+encodeURIComponent(query); + return url_query; + } + } + }); + + function language_source(query, cb) { + var bh_adapter = languages.ttAdapter(); + + var tokens = query.split(","); + var current_language = tokens[tokens.length-1].trim(); + + tokens.splice(tokens.length-1, 1); // remove last element + var prefix = ""; + for (var i = 0; i < tokens.length; i++) { + var tag = tokens[i].trim(); + prefix += tag + ", "; + } + + prefixed_source(prefix, current_language, cb, bh_adapter); + } + + var promise = languages.initialize(); + promise.done(function(){ + $("#languages").typeahead( + { + highlight: true, minLength: 0, + hint: true + }, { + name: 'languages', displayKey: 'name', + source: language_source + } + ) + }); diff --git a/cps/templates/authors.html b/cps/templates/authors.html deleted file mode 100644 index 65f2ec82..00000000 --- a/cps/templates/authors.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "layout.html" %} -{% block body %} -
-

{{title}}

- -
-{% endblock %} diff --git a/cps/templates/categories.html b/cps/templates/categories.html deleted file mode 100644 index 5308569a..00000000 --- a/cps/templates/categories.html +++ /dev/null @@ -1,11 +0,0 @@ -{% extends "layout.html" %} -{% block body %} -
-

{{title}}

- -
-{% endblock %} diff --git a/cps/templates/detail.html b/cps/templates/detail.html index f9b4b229..16d66151 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -35,13 +35,13 @@ {% endif %} {% if entry.series|length > 0 %} -

Book {{entry.series_index}} of {{entry.series[0].name}}

+

{{_('Book')}} {{entry.series_index}} {{_('of')}} {{entry.series[0].name}}

{% endif %} {% if entry.languages.__len__() > 0 %}

- language: {{entry.languages[0].lang_code}} + {{_('language')}}: {% for language in entry.languages %} {{language.language_name}}{% if not loop.last %},{% endif %}{% endfor %}

{% endif %} @@ -69,7 +69,15 @@ {% if c.datatype == 'rating' %} {{ '%d' % (column.value / 2) }} {% else %} - {{ column.value }} + {% if c.datatype == 'bool' %} + {% if column.value == true %} + + {% else %} + + {% endif %} + {% else %} + {{ column.value }} + {% endif %} {% endif %} {% endfor %}
@@ -81,18 +89,18 @@ {% if entry.comments|length > 0 %} -

Description:

+

{{_('Description:')}}

{{entry.comments[0].text|safe}} {% endif %} - {% if g.user.is_authenticated() %} + {% if g.user.is_authenticated %}
diff --git a/cps/templates/index.xml b/cps/templates/index.xml index b7d8c959..d315ffd1 100644 --- a/cps/templates/index.xml +++ b/cps/templates/index.xml @@ -5,19 +5,14 @@ href="{{url_for('feed_index')}}" type="application/atom+xml;profile=opds-catalog;kind=navigation"/> - - Calibre Web - 2010-01-10T10:03:10Z Calibre Web https://github.com/janeczku/calibre-web @@ -25,32 +20,53 @@ - Hot Books + {{_('Hot Books')}} - 2010-01-10T10:01:01Z - urn:uuid:d49e8018-a0e0-499e-9423-7c175fa0c56e - Popular publications from this catalog based on Rating. + {{url_for('feed_hot')}} + {{_('Popular publications from this catalog based on Rating.')}} - New Books - {{_('New Books')}} + - 2010-01-10T10:01:01Z - urn:uuid:d49e8018-a0e0-499e-9423-7c175fa0c56e - The latest Books + {{url_for('feed_new')}} + {{_('The latest Books')}} - Random Books - {{_('Random Books')}} + - 2010-01-10T10:01:01Z - urn:uuid:d49e8018-a0e0-499e-9423-7c175fa0c56e - Show Random Books + {{url_for('feed_discover')}} + {{_('Show Random Books')}} + + {{_('Authors')}} + + {{url_for('feed_authorindex')}} + {{_('Books ordered by Author')}} + + + {{_('Category list')}} + + {{url_for('feed_categoryindex')}} + {{_('Books ordered by category')}} + + + {{_('Series list')}} + + {{url_for('feed_seriesindex')}} + {{_('Books ordered by series')}} + diff --git a/cps/templates/languages.html b/cps/templates/languages.html new file mode 100644 index 00000000..4077a584 --- /dev/null +++ b/cps/templates/languages.html @@ -0,0 +1,12 @@ +{% extends "layout.html" %} +{% block body %} +

{{title}}

+
+ {% for lang in languages %} +
+
{{lang_counter[loop.index0].bookcount}}
+ +
+ {% endfor %} +
+{% endblock %} diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 318e20c4..cc658987 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -43,7 +43,7 @@
@@ -109,30 +112,46 @@ {% endfor %}
+ {% if g.user.is_authenticated or g.user.is_anonymous() %}
+ {% endif %}
{% block body %}{% endblock %} {% if pagination %} @@ -159,4 +178,4 @@
{% block js %}{% endblock %} - \ No newline at end of file + diff --git a/cps/templates/list.html b/cps/templates/list.html new file mode 100644 index 00000000..07911535 --- /dev/null +++ b/cps/templates/list.html @@ -0,0 +1,12 @@ +{% extends "layout.html" %} +{% block body %} +

{{title}}

+
+ {% for entry in entries %} +
+
{{entry.count}}
+ +
+ {% endfor %} +
+{% endblock %} diff --git a/cps/templates/login.html b/cps/templates/login.html index 320b0bb4..94557875 100644 --- a/cps/templates/login.html +++ b/cps/templates/login.html @@ -1,22 +1,22 @@ {% extends "layout.html" %} {% block body %}
-

Login

+

{{_('Login')}}

- - + +
- - + +
- +
{% if error %} diff --git a/cps/templates/osd.xml b/cps/templates/osd.xml index c43fe9ff..c569712b 100644 --- a/cps/templates/osd.xml +++ b/cps/templates/osd.xml @@ -23,9 +23,9 @@ http://example.com/websearch.ico --> - + Search Data Copyright 1971-2012, Project Gutenberg, All Rights Reserved. open diff --git a/cps/templates/read.html b/cps/templates/read.html index 44fea970..66d8ebc1 100644 --- a/cps/templates/read.html +++ b/cps/templates/read.html @@ -133,7 +133,7 @@

Settings

- Reflow text when sidebars are open. + {{_(Reflow text when sidebars are open.)}}

diff --git a/cps/templates/readpdf.html b/cps/templates/readpdf.html index e1d2ad26..4b039d20 100644 --- a/cps/templates/readpdf.html +++ b/cps/templates/readpdf.html @@ -26,7 +26,7 @@ See https://github.com/adobe-type-tools/cmap-resources - PDF.js viewer + {{_(PDF.js viewer)}} diff --git a/cps/templates/readtxt.html b/cps/templates/readtxt.html index 09520ebd..e333395d 100644 --- a/cps/templates/readtxt.html +++ b/cps/templates/readtxt.html @@ -3,7 +3,7 @@ - Basic txt Reader + {{_(Basic txt Reader)}} diff --git a/cps/templates/register.html b/cps/templates/register.html index 205de9d4..0da82dfa 100644 --- a/cps/templates/register.html +++ b/cps/templates/register.html @@ -1,21 +1,21 @@ {% extends "layout.html" %} {% block body %}
-

Register a new account

+

{{_('Register a new account')}}

- - + +
- - + +
- - + +
- +
{% if error %} diff --git a/cps/templates/search.html b/cps/templates/search.html index ecd5648c..23c00329 100644 --- a/cps/templates/search.html +++ b/cps/templates/search.html @@ -3,10 +3,10 @@
{% if entries|length < 1 %} -

No Results for: {{searchterm}}

-

Please try a diffrent Search

+

{{_('No Results for:')}} {{searchterm}}

+

{{_('Please try a diffrent Search')}}

{% else %} -

{{entries|length}} Results for: {{searchterm}}

+

{{entries|length}} {{_('Results for:')}} {{searchterm}}

{%endif%}
diff --git a/cps/templates/search_form.html b/cps/templates/search_form.html index e6a0fef5..e5563820 100644 --- a/cps/templates/search_form.html +++ b/cps/templates/search_form.html @@ -3,14 +3,14 @@
- +
- +
- +
{% for tag in tags %} @@ -20,7 +20,7 @@ {% endfor %}
- +
{% for tag in tags %} @@ -30,7 +30,7 @@ {% endfor %}
- +
{% endblock %} @@ -39,8 +39,8 @@ "|tojson }}') - self.assert_equal(rv, '"\\u003c/script\\u003e"') - rv = render('{{ "<\0/script>"|tojson }}') - self.assert_equal(rv, '"\\u003c\\u0000/script\\u003e"') - rv = render('{{ "') - assert out == 'just a small example link to a webpage' - - def test_filesizeformat(self): - tmpl = env.from_string( - '{{ 100|filesizeformat }}|' - '{{ 1000|filesizeformat }}|' - '{{ 1000000|filesizeformat }}|' - '{{ 1000000000|filesizeformat }}|' - '{{ 1000000000000|filesizeformat }}|' - '{{ 100|filesizeformat(true) }}|' - '{{ 1000|filesizeformat(true) }}|' - '{{ 1000000|filesizeformat(true) }}|' - '{{ 1000000000|filesizeformat(true) }}|' - '{{ 1000000000000|filesizeformat(true) }}' - ) - out = tmpl.render() - self.assert_equal(out, ( - '100 Bytes|1.0 kB|1.0 MB|1.0 GB|1.0 TB|100 Bytes|' - '1000 Bytes|976.6 KiB|953.7 MiB|931.3 GiB' - )) - - def test_filesizeformat_issue59(self): - tmpl = env.from_string( - '{{ 300|filesizeformat }}|' - '{{ 3000|filesizeformat }}|' - '{{ 3000000|filesizeformat }}|' - '{{ 3000000000|filesizeformat }}|' - '{{ 3000000000000|filesizeformat }}|' - '{{ 300|filesizeformat(true) }}|' - '{{ 3000|filesizeformat(true) }}|' - '{{ 3000000|filesizeformat(true) }}' - ) - out = tmpl.render() - self.assert_equal(out, ( - '300 Bytes|3.0 kB|3.0 MB|3.0 GB|3.0 TB|300 Bytes|' - '2.9 KiB|2.9 MiB' - )) - - - def test_first(self): - tmpl = env.from_string('{{ foo|first }}') - out = tmpl.render(foo=list(range(10))) - assert out == '0' - - def test_float(self): - tmpl = env.from_string('{{ "42"|float }}|' - '{{ "ajsghasjgd"|float }}|' - '{{ "32.32"|float }}') - out = tmpl.render() - assert out == '42.0|0.0|32.32' - - def test_format(self): - tmpl = env.from_string('''{{ "%s|%s"|format("a", "b") }}''') - out = tmpl.render() - assert out == 'a|b' - - def test_indent(self): - tmpl = env.from_string('{{ foo|indent(2) }}|{{ foo|indent(2, true) }}') - text = '\n'.join([' '.join(['foo', 'bar'] * 2)] * 2) - out = tmpl.render(foo=text) - assert out == ('foo bar foo bar\n foo bar foo bar| ' - 'foo bar foo bar\n foo bar foo bar') - - def test_int(self): - tmpl = env.from_string('{{ "42"|int }}|{{ "ajsghasjgd"|int }}|' - '{{ "32.32"|int }}') - out = tmpl.render() - assert out == '42|0|32' - - def test_join(self): - tmpl = env.from_string('{{ [1, 2, 3]|join("|") }}') - out = tmpl.render() - assert out == '1|2|3' - - env2 = Environment(autoescape=True) - tmpl = env2.from_string('{{ ["", "foo"|safe]|join }}') - assert tmpl.render() == '<foo>foo' - - def test_join_attribute(self): - class User(object): - def __init__(self, username): - self.username = username - tmpl = env.from_string('''{{ users|join(', ', 'username') }}''') - assert tmpl.render(users=map(User, ['foo', 'bar'])) == 'foo, bar' - - def test_last(self): - tmpl = env.from_string('''{{ foo|last }}''') - out = tmpl.render(foo=list(range(10))) - assert out == '9' - - def test_length(self): - tmpl = env.from_string('''{{ "hello world"|length }}''') - out = tmpl.render() - assert out == '11' - - def test_lower(self): - tmpl = env.from_string('''{{ "FOO"|lower }}''') - out = tmpl.render() - assert out == 'foo' - - def test_pprint(self): - from pprint import pformat - tmpl = env.from_string('''{{ data|pprint }}''') - data = list(range(1000)) - assert tmpl.render(data=data) == pformat(data) - - def test_random(self): - tmpl = env.from_string('''{{ seq|random }}''') - seq = list(range(100)) - for _ in range(10): - assert int(tmpl.render(seq=seq)) in seq - - def test_reverse(self): - tmpl = env.from_string('{{ "foobar"|reverse|join }}|' - '{{ [1, 2, 3]|reverse|list }}') - assert tmpl.render() == 'raboof|[3, 2, 1]' - - def test_string(self): - x = [1, 2, 3, 4, 5] - tmpl = env.from_string('''{{ obj|string }}''') - assert tmpl.render(obj=x) == text_type(x) - - def test_title(self): - tmpl = env.from_string('''{{ "foo bar"|title }}''') - assert tmpl.render() == "Foo Bar" - tmpl = env.from_string('''{{ "foo's bar"|title }}''') - assert tmpl.render() == "Foo's Bar" - tmpl = env.from_string('''{{ "foo bar"|title }}''') - assert tmpl.render() == "Foo Bar" - tmpl = env.from_string('''{{ "f bar f"|title }}''') - assert tmpl.render() == "F Bar F" - tmpl = env.from_string('''{{ "foo-bar"|title }}''') - assert tmpl.render() == "Foo-Bar" - tmpl = env.from_string('''{{ "foo\tbar"|title }}''') - assert tmpl.render() == "Foo\tBar" - - def test_truncate(self): - tmpl = env.from_string( - '{{ data|truncate(15, true, ">>>") }}|' - '{{ data|truncate(15, false, ">>>") }}|' - '{{ smalldata|truncate(15) }}' - ) - out = tmpl.render(data='foobar baz bar' * 1000, - smalldata='foobar baz bar') - assert out == 'foobar baz barf>>>|foobar baz >>>|foobar baz bar' - - def test_upper(self): - tmpl = env.from_string('{{ "foo"|upper }}') - assert tmpl.render() == 'FOO' - - def test_urlize(self): - tmpl = env.from_string('{{ "foo http://www.example.com/ bar"|urlize }}') - assert tmpl.render() == 'foo '\ - 'http://www.example.com/ bar' - - def test_wordcount(self): - tmpl = env.from_string('{{ "foo bar baz"|wordcount }}') - assert tmpl.render() == '3' - - def test_block(self): - tmpl = env.from_string('{% filter lower|escape %}{% endfilter %}') - assert tmpl.render() == '<hehe>' - - def test_chaining(self): - tmpl = env.from_string('''{{ ['', '']|first|upper|escape }}''') - assert tmpl.render() == '<FOO>' - - def test_sum(self): - tmpl = env.from_string('''{{ [1, 2, 3, 4, 5, 6]|sum }}''') - assert tmpl.render() == '21' - - def test_sum_attributes(self): - tmpl = env.from_string('''{{ values|sum('value') }}''') - assert tmpl.render(values=[ - {'value': 23}, - {'value': 1}, - {'value': 18}, - ]) == '42' - - def test_sum_attributes_nested(self): - tmpl = env.from_string('''{{ values|sum('real.value') }}''') - assert tmpl.render(values=[ - {'real': {'value': 23}}, - {'real': {'value': 1}}, - {'real': {'value': 18}}, - ]) == '42' - - def test_sum_attributes_tuple(self): - tmpl = env.from_string('''{{ values.items()|sum('1') }}''') - assert tmpl.render(values={ - 'foo': 23, - 'bar': 1, - 'baz': 18, - }) == '42' - - def test_abs(self): - tmpl = env.from_string('''{{ -1|abs }}|{{ 1|abs }}''') - assert tmpl.render() == '1|1', tmpl.render() - - def test_round_positive(self): - tmpl = env.from_string('{{ 2.7|round }}|{{ 2.1|round }}|' - "{{ 2.1234|round(3, 'floor') }}|" - "{{ 2.1|round(0, 'ceil') }}") - assert tmpl.render() == '3.0|2.0|2.123|3.0', tmpl.render() - - def test_round_negative(self): - tmpl = env.from_string('{{ 21.3|round(-1)}}|' - "{{ 21.3|round(-1, 'ceil')}}|" - "{{ 21.3|round(-1, 'floor')}}") - assert tmpl.render() == '20.0|30.0|20.0',tmpl.render() - - def test_xmlattr(self): - tmpl = env.from_string("{{ {'foo': 42, 'bar': 23, 'fish': none, " - "'spam': missing, 'blub:blub': ''}|xmlattr }}") - out = tmpl.render().split() - assert len(out) == 3 - assert 'foo="42"' in out - assert 'bar="23"' in out - assert 'blub:blub="<?>"' in out - - def test_sort1(self): - tmpl = env.from_string('{{ [2, 3, 1]|sort }}|{{ [2, 3, 1]|sort(true) }}') - assert tmpl.render() == '[1, 2, 3]|[3, 2, 1]' - - def test_sort2(self): - tmpl = env.from_string('{{ "".join(["c", "A", "b", "D"]|sort) }}') - assert tmpl.render() == 'AbcD' - - def test_sort3(self): - tmpl = env.from_string('''{{ ['foo', 'Bar', 'blah']|sort }}''') - assert tmpl.render() == "['Bar', 'blah', 'foo']" - - def test_sort4(self): - @implements_to_string - class Magic(object): - def __init__(self, value): - self.value = value - def __str__(self): - return text_type(self.value) - tmpl = env.from_string('''{{ items|sort(attribute='value')|join }}''') - assert tmpl.render(items=map(Magic, [3, 2, 4, 1])) == '1234' - - def test_groupby(self): - tmpl = env.from_string(''' - {%- for grouper, list in [{'foo': 1, 'bar': 2}, - {'foo': 2, 'bar': 3}, - {'foo': 1, 'bar': 1}, - {'foo': 3, 'bar': 4}]|groupby('foo') -%} - {{ grouper }}{% for x in list %}: {{ x.foo }}, {{ x.bar }}{% endfor %}| - {%- endfor %}''') - assert tmpl.render().split('|') == [ - "1: 1, 2: 1, 1", - "2: 2, 3", - "3: 3, 4", - "" - ] - - def test_groupby_tuple_index(self): - tmpl = env.from_string(''' - {%- for grouper, list in [('a', 1), ('a', 2), ('b', 1)]|groupby(0) -%} - {{ grouper }}{% for x in list %}:{{ x.1 }}{% endfor %}| - {%- endfor %}''') - assert tmpl.render() == 'a:1:2|b:1|' - - def test_groupby_multidot(self): - class Date(object): - def __init__(self, day, month, year): - self.day = day - self.month = month - self.year = year - class Article(object): - def __init__(self, title, *date): - self.date = Date(*date) - self.title = title - articles = [ - Article('aha', 1, 1, 1970), - Article('interesting', 2, 1, 1970), - Article('really?', 3, 1, 1970), - Article('totally not', 1, 1, 1971) - ] - tmpl = env.from_string(''' - {%- for year, list in articles|groupby('date.year') -%} - {{ year }}{% for x in list %}[{{ x.title }}]{% endfor %}| - {%- endfor %}''') - assert tmpl.render(articles=articles).split('|') == [ - '1970[aha][interesting][really?]', - '1971[totally not]', - '' - ] - - def test_filtertag(self): - tmpl = env.from_string("{% filter upper|replace('FOO', 'foo') %}" - "foobar{% endfilter %}") - assert tmpl.render() == 'fooBAR' - - def test_replace(self): - env = Environment() - tmpl = env.from_string('{{ string|replace("o", 42) }}') - assert tmpl.render(string='') == '' - env = Environment(autoescape=True) - tmpl = env.from_string('{{ string|replace("o", 42) }}') - assert tmpl.render(string='') == '<f4242>' - tmpl = env.from_string('{{ string|replace("<", 42) }}') - assert tmpl.render(string='') == '42foo>' - tmpl = env.from_string('{{ string|replace("o", ">x<") }}') - assert tmpl.render(string=Markup('foo')) == 'f>x<>x<' - - def test_forceescape(self): - tmpl = env.from_string('{{ x|forceescape }}') - assert tmpl.render(x=Markup('
')) == u'<div />' - - def test_safe(self): - env = Environment(autoescape=True) - tmpl = env.from_string('{{ "
foo
"|safe }}') - assert tmpl.render() == '
foo
' - tmpl = env.from_string('{{ "
foo
" }}') - assert tmpl.render() == '<div>foo</div>' - - def test_urlencode(self): - env = Environment(autoescape=True) - tmpl = env.from_string('{{ "Hello, world!"|urlencode }}') - assert tmpl.render() == 'Hello%2C%20world%21' - tmpl = env.from_string('{{ o|urlencode }}') - assert tmpl.render(o=u"Hello, world\u203d") == "Hello%2C%20world%E2%80%BD" - assert tmpl.render(o=(("f", 1),)) == "f=1" - assert tmpl.render(o=(('f', 1), ("z", 2))) == "f=1&z=2" - assert tmpl.render(o=((u"\u203d", 1),)) == "%E2%80%BD=1" - assert tmpl.render(o={u"\u203d": 1}) == "%E2%80%BD=1" - assert tmpl.render(o={0: 1}) == "0=1" - - def test_simple_map(self): - env = Environment() - tmpl = env.from_string('{{ ["1", "2", "3"]|map("int")|sum }}') - self.assertEqual(tmpl.render(), '6') - - def test_attribute_map(self): - class User(object): - def __init__(self, name): - self.name = name - env = Environment() - users = [ - User('john'), - User('jane'), - User('mike'), - ] - tmpl = env.from_string('{{ users|map(attribute="name")|join("|") }}') - self.assertEqual(tmpl.render(users=users), 'john|jane|mike') - - def test_empty_map(self): - env = Environment() - tmpl = env.from_string('{{ none|map("upper")|list }}') - self.assertEqual(tmpl.render(), '[]') - - def test_simple_select(self): - env = Environment() - tmpl = env.from_string('{{ [1, 2, 3, 4, 5]|select("odd")|join("|") }}') - self.assertEqual(tmpl.render(), '1|3|5') - - def test_bool_select(self): - env = Environment() - tmpl = env.from_string('{{ [none, false, 0, 1, 2, 3, 4, 5]|select|join("|") }}') - self.assertEqual(tmpl.render(), '1|2|3|4|5') - - def test_simple_reject(self): - env = Environment() - tmpl = env.from_string('{{ [1, 2, 3, 4, 5]|reject("odd")|join("|") }}') - self.assertEqual(tmpl.render(), '2|4') - - def test_bool_reject(self): - env = Environment() - tmpl = env.from_string('{{ [none, false, 0, 1, 2, 3, 4, 5]|reject|join("|") }}') - self.assertEqual(tmpl.render(), 'None|False|0') - - def test_simple_select_attr(self): - class User(object): - def __init__(self, name, is_active): - self.name = name - self.is_active = is_active - env = Environment() - users = [ - User('john', True), - User('jane', True), - User('mike', False), - ] - tmpl = env.from_string('{{ users|selectattr("is_active")|' - 'map(attribute="name")|join("|") }}') - self.assertEqual(tmpl.render(users=users), 'john|jane') - - def test_simple_reject_attr(self): - class User(object): - def __init__(self, name, is_active): - self.name = name - self.is_active = is_active - env = Environment() - users = [ - User('john', True), - User('jane', True), - User('mike', False), - ] - tmpl = env.from_string('{{ users|rejectattr("is_active")|' - 'map(attribute="name")|join("|") }}') - self.assertEqual(tmpl.render(users=users), 'mike') - - def test_func_select_attr(self): - class User(object): - def __init__(self, id, name): - self.id = id - self.name = name - env = Environment() - users = [ - User(1, 'john'), - User(2, 'jane'), - User(3, 'mike'), - ] - tmpl = env.from_string('{{ users|selectattr("id", "odd")|' - 'map(attribute="name")|join("|") }}') - self.assertEqual(tmpl.render(users=users), 'john|mike') - - def test_func_reject_attr(self): - class User(object): - def __init__(self, id, name): - self.id = id - self.name = name - env = Environment() - users = [ - User(1, 'john'), - User(2, 'jane'), - User(3, 'mike'), - ] - tmpl = env.from_string('{{ users|rejectattr("id", "odd")|' - 'map(attribute="name")|join("|") }}') - self.assertEqual(tmpl.render(users=users), 'jane') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(FilterTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/imports.py b/vendor/jinja2/testsuite/imports.py deleted file mode 100644 index c3caeac3..00000000 --- a/vendor/jinja2/testsuite/imports.py +++ /dev/null @@ -1,157 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.imports - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the import features (with includes). - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Environment, DictLoader -from jinja2.exceptions import TemplateNotFound, TemplatesNotFound - - -test_env = Environment(loader=DictLoader(dict( - module='{% macro test() %}[{{ foo }}|{{ bar }}]{% endmacro %}', - header='[{{ foo }}|{{ 23 }}]', - o_printer='({{ o }})' -))) -test_env.globals['bar'] = 23 - - -class ImportsTestCase(JinjaTestCase): - - def test_context_imports(self): - t = test_env.from_string('{% import "module" as m %}{{ m.test() }}') - assert t.render(foo=42) == '[|23]' - t = test_env.from_string('{% import "module" as m without context %}{{ m.test() }}') - assert t.render(foo=42) == '[|23]' - t = test_env.from_string('{% import "module" as m with context %}{{ m.test() }}') - assert t.render(foo=42) == '[42|23]' - t = test_env.from_string('{% from "module" import test %}{{ test() }}') - assert t.render(foo=42) == '[|23]' - t = test_env.from_string('{% from "module" import test without context %}{{ test() }}') - assert t.render(foo=42) == '[|23]' - t = test_env.from_string('{% from "module" import test with context %}{{ test() }}') - assert t.render(foo=42) == '[42|23]' - - def test_trailing_comma(self): - test_env.from_string('{% from "foo" import bar, baz with context %}') - test_env.from_string('{% from "foo" import bar, baz, with context %}') - test_env.from_string('{% from "foo" import bar, with context %}') - test_env.from_string('{% from "foo" import bar, with, context %}') - test_env.from_string('{% from "foo" import bar, with with context %}') - - def test_exports(self): - m = test_env.from_string(''' - {% macro toplevel() %}...{% endmacro %} - {% macro __private() %}...{% endmacro %} - {% set variable = 42 %} - {% for item in [1] %} - {% macro notthere() %}{% endmacro %} - {% endfor %} - ''').module - assert m.toplevel() == '...' - assert not hasattr(m, '__missing') - assert m.variable == 42 - assert not hasattr(m, 'notthere') - - -class IncludesTestCase(JinjaTestCase): - - def test_context_include(self): - t = test_env.from_string('{% include "header" %}') - assert t.render(foo=42) == '[42|23]' - t = test_env.from_string('{% include "header" with context %}') - assert t.render(foo=42) == '[42|23]' - t = test_env.from_string('{% include "header" without context %}') - assert t.render(foo=42) == '[|23]' - - def test_choice_includes(self): - t = test_env.from_string('{% include ["missing", "header"] %}') - assert t.render(foo=42) == '[42|23]' - - t = test_env.from_string('{% include ["missing", "missing2"] ignore missing %}') - assert t.render(foo=42) == '' - - t = test_env.from_string('{% include ["missing", "missing2"] %}') - self.assert_raises(TemplateNotFound, t.render) - try: - t.render() - except TemplatesNotFound as e: - assert e.templates == ['missing', 'missing2'] - assert e.name == 'missing2' - else: - assert False, 'thou shalt raise' - - def test_includes(t, **ctx): - ctx['foo'] = 42 - assert t.render(ctx) == '[42|23]' - - t = test_env.from_string('{% include ["missing", "header"] %}') - test_includes(t) - t = test_env.from_string('{% include x %}') - test_includes(t, x=['missing', 'header']) - t = test_env.from_string('{% include [x, "header"] %}') - test_includes(t, x='missing') - t = test_env.from_string('{% include x %}') - test_includes(t, x='header') - t = test_env.from_string('{% include x %}') - test_includes(t, x='header') - t = test_env.from_string('{% include [x] %}') - test_includes(t, x='header') - - def test_include_ignoring_missing(self): - t = test_env.from_string('{% include "missing" %}') - self.assert_raises(TemplateNotFound, t.render) - for extra in '', 'with context', 'without context': - t = test_env.from_string('{% include "missing" ignore missing ' + - extra + ' %}') - assert t.render() == '' - - def test_context_include_with_overrides(self): - env = Environment(loader=DictLoader(dict( - main="{% for item in [1, 2, 3] %}{% include 'item' %}{% endfor %}", - item="{{ item }}" - ))) - assert env.get_template("main").render() == "123" - - def test_included_block_override(self): - env = Environment(loader=DictLoader(dict( - main="{% extends 'base' %}{% block b %}1337{% endblock %}", - base="{% include 'inc' %}", - inc="{% block b %}42{% endblock %}" - ))) - assert env.get_template("main").render() == "1337" - - def test_included_block_override_with_super(self): - env = Environment(loader=DictLoader(dict( - main="{% extends 'base' %}{% block b %}1337|{{ super() }}{% endblock %}", - base="{% include 'inc' %}", - inc="{% block b %}42{% endblock %}" - ))) - assert env.get_template("main").render() == "1337|42" - - def test_unoptimized_scopes(self): - t = test_env.from_string(""" - {% macro outer(o) %} - {% macro inner() %} - {% include "o_printer" %} - {% endmacro %} - {{ inner() }} - {% endmacro %} - {{ outer("FOO") }} - """) - assert t.render().strip() == '(FOO)' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(ImportsTestCase)) - suite.addTest(unittest.makeSuite(IncludesTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/inheritance.py b/vendor/jinja2/testsuite/inheritance.py deleted file mode 100644 index e0f51cda..00000000 --- a/vendor/jinja2/testsuite/inheritance.py +++ /dev/null @@ -1,250 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.inheritance - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the template inheritance feature. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Environment, DictLoader, TemplateError - - -LAYOUTTEMPLATE = '''\ -|{% block block1 %}block 1 from layout{% endblock %} -|{% block block2 %}block 2 from layout{% endblock %} -|{% block block3 %} -{% block block4 %}nested block 4 from layout{% endblock %} -{% endblock %}|''' - -LEVEL1TEMPLATE = '''\ -{% extends "layout" %} -{% block block1 %}block 1 from level1{% endblock %}''' - -LEVEL2TEMPLATE = '''\ -{% extends "level1" %} -{% block block2 %}{% block block5 %}nested block 5 from level2{% -endblock %}{% endblock %}''' - -LEVEL3TEMPLATE = '''\ -{% extends "level2" %} -{% block block5 %}block 5 from level3{% endblock %} -{% block block4 %}block 4 from level3{% endblock %} -''' - -LEVEL4TEMPLATE = '''\ -{% extends "level3" %} -{% block block3 %}block 3 from level4{% endblock %} -''' - -WORKINGTEMPLATE = '''\ -{% extends "layout" %} -{% block block1 %} - {% if false %} - {% block block2 %} - this should workd - {% endblock %} - {% endif %} -{% endblock %} -''' - -DOUBLEEXTENDS = '''\ -{% extends "layout" %} -{% extends "layout" %} -{% block block1 %} - {% if false %} - {% block block2 %} - this should workd - {% endblock %} - {% endif %} -{% endblock %} -''' - - -env = Environment(loader=DictLoader({ - 'layout': LAYOUTTEMPLATE, - 'level1': LEVEL1TEMPLATE, - 'level2': LEVEL2TEMPLATE, - 'level3': LEVEL3TEMPLATE, - 'level4': LEVEL4TEMPLATE, - 'working': WORKINGTEMPLATE, - 'doublee': DOUBLEEXTENDS, -}), trim_blocks=True) - - -class InheritanceTestCase(JinjaTestCase): - - def test_layout(self): - tmpl = env.get_template('layout') - assert tmpl.render() == ('|block 1 from layout|block 2 from ' - 'layout|nested block 4 from layout|') - - def test_level1(self): - tmpl = env.get_template('level1') - assert tmpl.render() == ('|block 1 from level1|block 2 from ' - 'layout|nested block 4 from layout|') - - def test_level2(self): - tmpl = env.get_template('level2') - assert tmpl.render() == ('|block 1 from level1|nested block 5 from ' - 'level2|nested block 4 from layout|') - - def test_level3(self): - tmpl = env.get_template('level3') - assert tmpl.render() == ('|block 1 from level1|block 5 from level3|' - 'block 4 from level3|') - - def test_level4(sel): - tmpl = env.get_template('level4') - assert tmpl.render() == ('|block 1 from level1|block 5 from ' - 'level3|block 3 from level4|') - - def test_super(self): - env = Environment(loader=DictLoader({ - 'a': '{% block intro %}INTRO{% endblock %}|' - 'BEFORE|{% block data %}INNER{% endblock %}|AFTER', - 'b': '{% extends "a" %}{% block data %}({{ ' - 'super() }}){% endblock %}', - 'c': '{% extends "b" %}{% block intro %}--{{ ' - 'super() }}--{% endblock %}\n{% block data ' - '%}[{{ super() }}]{% endblock %}' - })) - tmpl = env.get_template('c') - assert tmpl.render() == '--INTRO--|BEFORE|[(INNER)]|AFTER' - - def test_working(self): - tmpl = env.get_template('working') - - def test_reuse_blocks(self): - tmpl = env.from_string('{{ self.foo() }}|{% block foo %}42' - '{% endblock %}|{{ self.foo() }}') - assert tmpl.render() == '42|42|42' - - def test_preserve_blocks(self): - env = Environment(loader=DictLoader({ - 'a': '{% if false %}{% block x %}A{% endblock %}{% endif %}{{ self.x() }}', - 'b': '{% extends "a" %}{% block x %}B{{ super() }}{% endblock %}' - })) - tmpl = env.get_template('b') - assert tmpl.render() == 'BA' - - def test_dynamic_inheritance(self): - env = Environment(loader=DictLoader({ - 'master1': 'MASTER1{% block x %}{% endblock %}', - 'master2': 'MASTER2{% block x %}{% endblock %}', - 'child': '{% extends master %}{% block x %}CHILD{% endblock %}' - })) - tmpl = env.get_template('child') - for m in range(1, 3): - assert tmpl.render(master='master%d' % m) == 'MASTER%dCHILD' % m - - def test_multi_inheritance(self): - env = Environment(loader=DictLoader({ - 'master1': 'MASTER1{% block x %}{% endblock %}', - 'master2': 'MASTER2{% block x %}{% endblock %}', - 'child': '''{% if master %}{% extends master %}{% else %}{% extends - 'master1' %}{% endif %}{% block x %}CHILD{% endblock %}''' - })) - tmpl = env.get_template('child') - assert tmpl.render(master='master2') == 'MASTER2CHILD' - assert tmpl.render(master='master1') == 'MASTER1CHILD' - assert tmpl.render() == 'MASTER1CHILD' - - def test_scoped_block(self): - env = Environment(loader=DictLoader({ - 'master.html': '{% for item in seq %}[{% block item scoped %}' - '{% endblock %}]{% endfor %}' - })) - t = env.from_string('{% extends "master.html" %}{% block item %}' - '{{ item }}{% endblock %}') - assert t.render(seq=list(range(5))) == '[0][1][2][3][4]' - - def test_super_in_scoped_block(self): - env = Environment(loader=DictLoader({ - 'master.html': '{% for item in seq %}[{% block item scoped %}' - '{{ item }}{% endblock %}]{% endfor %}' - })) - t = env.from_string('{% extends "master.html" %}{% block item %}' - '{{ super() }}|{{ item * 2 }}{% endblock %}') - assert t.render(seq=list(range(5))) == '[0|0][1|2][2|4][3|6][4|8]' - - def test_scoped_block_after_inheritance(self): - env = Environment(loader=DictLoader({ - 'layout.html': ''' - {% block useless %}{% endblock %} - ''', - 'index.html': ''' - {%- extends 'layout.html' %} - {% from 'helpers.html' import foo with context %} - {% block useless %} - {% for x in [1, 2, 3] %} - {% block testing scoped %} - {{ foo(x) }} - {% endblock %} - {% endfor %} - {% endblock %} - ''', - 'helpers.html': ''' - {% macro foo(x) %}{{ the_foo + x }}{% endmacro %} - ''' - })) - rv = env.get_template('index.html').render(the_foo=42).split() - assert rv == ['43', '44', '45'] - - -class BugFixTestCase(JinjaTestCase): - - def test_fixed_macro_scoping_bug(self): - assert Environment(loader=DictLoader({ - 'test.html': '''\ - {% extends 'details.html' %} - - {% macro my_macro() %} - my_macro - {% endmacro %} - - {% block inner_box %} - {{ my_macro() }} - {% endblock %} - ''', - 'details.html': '''\ - {% extends 'standard.html' %} - - {% macro my_macro() %} - my_macro - {% endmacro %} - - {% block content %} - {% block outer_box %} - outer_box - {% block inner_box %} - inner_box - {% endblock %} - {% endblock %} - {% endblock %} - ''', - 'standard.html': ''' - {% block content %} {% endblock %} - ''' - })).get_template("test.html").render().split() == [u'outer_box', u'my_macro'] - - def test_double_extends(self): - """Ensures that a template with more than 1 {% extends ... %} usage - raises a ``TemplateError``. - """ - try: - tmpl = env.get_template('doublee') - except Exception as e: - assert isinstance(e, TemplateError) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(InheritanceTestCase)) - suite.addTest(unittest.makeSuite(BugFixTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/lexnparse.py b/vendor/jinja2/testsuite/lexnparse.py deleted file mode 100644 index bd1c94cd..00000000 --- a/vendor/jinja2/testsuite/lexnparse.py +++ /dev/null @@ -1,593 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.lexnparse - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - All the unittests regarding lexing, parsing and syntax. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Environment, Template, TemplateSyntaxError, \ - UndefinedError, nodes -from jinja2._compat import next, iteritems, text_type, PY2 -from jinja2.lexer import Token, TokenStream, TOKEN_EOF, \ - TOKEN_BLOCK_BEGIN, TOKEN_BLOCK_END - -env = Environment() - - -# how does a string look like in jinja syntax? -if PY2: - def jinja_string_repr(string): - return repr(string)[1:] -else: - jinja_string_repr = repr - - -class TokenStreamTestCase(JinjaTestCase): - test_tokens = [Token(1, TOKEN_BLOCK_BEGIN, ''), - Token(2, TOKEN_BLOCK_END, ''), - ] - - def test_simple(self): - ts = TokenStream(self.test_tokens, "foo", "bar") - assert ts.current.type is TOKEN_BLOCK_BEGIN - assert bool(ts) - assert not bool(ts.eos) - next(ts) - assert ts.current.type is TOKEN_BLOCK_END - assert bool(ts) - assert not bool(ts.eos) - next(ts) - assert ts.current.type is TOKEN_EOF - assert not bool(ts) - assert bool(ts.eos) - - def test_iter(self): - token_types = [t.type for t in TokenStream(self.test_tokens, "foo", "bar")] - assert token_types == ['block_begin', 'block_end', ] - - -class LexerTestCase(JinjaTestCase): - - def test_raw1(self): - tmpl = env.from_string('{% raw %}foo{% endraw %}|' - '{%raw%}{{ bar }}|{% baz %}{% endraw %}') - assert tmpl.render() == 'foo|{{ bar }}|{% baz %}' - - def test_raw2(self): - tmpl = env.from_string('1 {%- raw -%} 2 {%- endraw -%} 3') - assert tmpl.render() == '123' - - def test_balancing(self): - env = Environment('{%', '%}', '${', '}') - tmpl = env.from_string('''{% for item in seq - %}${{'foo': item}|upper}{% endfor %}''') - assert tmpl.render(seq=list(range(3))) == "{'FOO': 0}{'FOO': 1}{'FOO': 2}" - - def test_comments(self): - env = Environment('', '{', '}') - tmpl = env.from_string('''\ -
    - -
  • {item}
  • - -
''') - assert tmpl.render(seq=list(range(3))) == ("
    \n
  • 0
  • \n " - "
  • 1
  • \n
  • 2
  • \n
") - - def test_string_escapes(self): - for char in u'\0', u'\u2668', u'\xe4', u'\t', u'\r', u'\n': - tmpl = env.from_string('{{ %s }}' % jinja_string_repr(char)) - assert tmpl.render() == char - assert env.from_string('{{ "\N{HOT SPRINGS}" }}').render() == u'\u2668' - - def test_bytefallback(self): - from pprint import pformat - tmpl = env.from_string(u'''{{ 'foo'|pprint }}|{{ 'bär'|pprint }}''') - assert tmpl.render() == pformat('foo') + '|' + pformat(u'bär') - - def test_operators(self): - from jinja2.lexer import operators - for test, expect in iteritems(operators): - if test in '([{}])': - continue - stream = env.lexer.tokenize('{{ %s }}' % test) - next(stream) - assert stream.current.type == expect - - def test_normalizing(self): - for seq in '\r', '\r\n', '\n': - env = Environment(newline_sequence=seq) - tmpl = env.from_string('1\n2\r\n3\n4\n') - result = tmpl.render() - assert result.replace(seq, 'X') == '1X2X3X4' - - def test_trailing_newline(self): - for keep in [True, False]: - env = Environment(keep_trailing_newline=keep) - for template,expected in [ - ('', {}), - ('no\nnewline', {}), - ('with\nnewline\n', {False: 'with\nnewline'}), - ('with\nseveral\n\n\n', {False: 'with\nseveral\n\n'}), - ]: - tmpl = env.from_string(template) - expect = expected.get(keep, template) - result = tmpl.render() - assert result == expect, (keep, template, result, expect) - -class ParserTestCase(JinjaTestCase): - - def test_php_syntax(self): - env = Environment('', '', '') - tmpl = env.from_string('''\ -\ - - -''') - assert tmpl.render(seq=list(range(5))) == '01234' - - def test_erb_syntax(self): - env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>') - tmpl = env.from_string('''\ -<%# I'm a comment, I'm not interesting %>\ -<% for item in seq -%> - <%= item %> -<%- endfor %>''') - assert tmpl.render(seq=list(range(5))) == '01234' - - def test_comment_syntax(self): - env = Environment('', '${', '}', '') - tmpl = env.from_string('''\ -\ - - ${item} -''') - assert tmpl.render(seq=list(range(5))) == '01234' - - def test_balancing(self): - tmpl = env.from_string('''{{{'foo':'bar'}.foo}}''') - assert tmpl.render() == 'bar' - - def test_start_comment(self): - tmpl = env.from_string('''{# foo comment -and bar comment #} -{% macro blub() %}foo{% endmacro %} -{{ blub() }}''') - assert tmpl.render().strip() == 'foo' - - def test_line_syntax(self): - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%') - tmpl = env.from_string('''\ -<%# regular comment %> -% for item in seq: - ${item} -% endfor''') - assert [int(x.strip()) for x in tmpl.render(seq=list(range(5))).split()] == \ - list(range(5)) - - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##') - tmpl = env.from_string('''\ -<%# regular comment %> -% for item in seq: - ${item} ## the rest of the stuff -% endfor''') - assert [int(x.strip()) for x in tmpl.render(seq=list(range(5))).split()] == \ - list(range(5)) - - def test_line_syntax_priority(self): - # XXX: why is the whitespace there in front of the newline? - env = Environment('{%', '%}', '${', '}', '/*', '*/', '##', '#') - tmpl = env.from_string('''\ -/* ignore me. - I'm a multiline comment */ -## for item in seq: -* ${item} # this is just extra stuff -## endfor''') - assert tmpl.render(seq=[1, 2]).strip() == '* 1\n* 2' - env = Environment('{%', '%}', '${', '}', '/*', '*/', '#', '##') - tmpl = env.from_string('''\ -/* ignore me. - I'm a multiline comment */ -# for item in seq: -* ${item} ## this is just extra stuff - ## extra stuff i just want to ignore -# endfor''') - assert tmpl.render(seq=[1, 2]).strip() == '* 1\n\n* 2' - - def test_error_messages(self): - def assert_error(code, expected): - try: - Template(code) - except TemplateSyntaxError as e: - assert str(e) == expected, 'unexpected error message' - else: - assert False, 'that was supposed to be an error' - - assert_error('{% for item in seq %}...{% endif %}', - "Encountered unknown tag 'endif'. Jinja was looking " - "for the following tags: 'endfor' or 'else'. The " - "innermost block that needs to be closed is 'for'.") - assert_error('{% if foo %}{% for item in seq %}...{% endfor %}{% endfor %}', - "Encountered unknown tag 'endfor'. Jinja was looking for " - "the following tags: 'elif' or 'else' or 'endif'. The " - "innermost block that needs to be closed is 'if'.") - assert_error('{% if foo %}', - "Unexpected end of template. Jinja was looking for the " - "following tags: 'elif' or 'else' or 'endif'. The " - "innermost block that needs to be closed is 'if'.") - assert_error('{% for item in seq %}', - "Unexpected end of template. Jinja was looking for the " - "following tags: 'endfor' or 'else'. The innermost block " - "that needs to be closed is 'for'.") - assert_error('{% block foo-bar-baz %}', - "Block names in Jinja have to be valid Python identifiers " - "and may not contain hyphens, use an underscore instead.") - assert_error('{% unknown_tag %}', - "Encountered unknown tag 'unknown_tag'.") - - -class SyntaxTestCase(JinjaTestCase): - - def test_call(self): - env = Environment() - env.globals['foo'] = lambda a, b, c, e, g: a + b + c + e + g - tmpl = env.from_string("{{ foo('a', c='d', e='f', *['b'], **{'g': 'h'}) }}") - assert tmpl.render() == 'abdfh' - - def test_slicing(self): - tmpl = env.from_string('{{ [1, 2, 3][:] }}|{{ [1, 2, 3][::-1] }}') - assert tmpl.render() == '[1, 2, 3]|[3, 2, 1]' - - def test_attr(self): - tmpl = env.from_string("{{ foo.bar }}|{{ foo['bar'] }}") - assert tmpl.render(foo={'bar': 42}) == '42|42' - - def test_subscript(self): - tmpl = env.from_string("{{ foo[0] }}|{{ foo[-1] }}") - assert tmpl.render(foo=[0, 1, 2]) == '0|2' - - def test_tuple(self): - tmpl = env.from_string('{{ () }}|{{ (1,) }}|{{ (1, 2) }}') - assert tmpl.render() == '()|(1,)|(1, 2)' - - def test_math(self): - tmpl = env.from_string('{{ (1 + 1 * 2) - 3 / 2 }}|{{ 2**3 }}') - assert tmpl.render() == '1.5|8' - - def test_div(self): - tmpl = env.from_string('{{ 3 // 2 }}|{{ 3 / 2 }}|{{ 3 % 2 }}') - assert tmpl.render() == '1|1.5|1' - - def test_unary(self): - tmpl = env.from_string('{{ +3 }}|{{ -3 }}') - assert tmpl.render() == '3|-3' - - def test_concat(self): - tmpl = env.from_string("{{ [1, 2] ~ 'foo' }}") - assert tmpl.render() == '[1, 2]foo' - - def test_compare(self): - tmpl = env.from_string('{{ 1 > 0 }}|{{ 1 >= 1 }}|{{ 2 < 3 }}|' - '{{ 2 == 2 }}|{{ 1 <= 1 }}') - assert tmpl.render() == 'True|True|True|True|True' - - def test_inop(self): - tmpl = env.from_string('{{ 1 in [1, 2, 3] }}|{{ 1 not in [1, 2, 3] }}') - assert tmpl.render() == 'True|False' - - def test_literals(self): - tmpl = env.from_string('{{ [] }}|{{ {} }}|{{ () }}') - assert tmpl.render().lower() == '[]|{}|()' - - def test_bool(self): - tmpl = env.from_string('{{ true and false }}|{{ false ' - 'or true }}|{{ not false }}') - assert tmpl.render() == 'False|True|True' - - def test_grouping(self): - tmpl = env.from_string('{{ (true and false) or (false and true) and not false }}') - assert tmpl.render() == 'False' - - def test_django_attr(self): - tmpl = env.from_string('{{ [1, 2, 3].0 }}|{{ [[1]].0.0 }}') - assert tmpl.render() == '1|1' - - def test_conditional_expression(self): - tmpl = env.from_string('''{{ 0 if true else 1 }}''') - assert tmpl.render() == '0' - - def test_short_conditional_expression(self): - tmpl = env.from_string('<{{ 1 if false }}>') - assert tmpl.render() == '<>' - - tmpl = env.from_string('<{{ (1 if false).bar }}>') - self.assert_raises(UndefinedError, tmpl.render) - - def test_filter_priority(self): - tmpl = env.from_string('{{ "foo"|upper + "bar"|upper }}') - assert tmpl.render() == 'FOOBAR' - - def test_function_calls(self): - tests = [ - (True, '*foo, bar'), - (True, '*foo, *bar'), - (True, '*foo, bar=42'), - (True, '**foo, *bar'), - (True, '**foo, bar'), - (False, 'foo, bar'), - (False, 'foo, bar=42'), - (False, 'foo, bar=23, *args'), - (False, 'a, b=c, *d, **e'), - (False, '*foo, **bar') - ] - for should_fail, sig in tests: - if should_fail: - self.assert_raises(TemplateSyntaxError, - env.from_string, '{{ foo(%s) }}' % sig) - else: - env.from_string('foo(%s)' % sig) - - def test_tuple_expr(self): - for tmpl in [ - '{{ () }}', - '{{ (1, 2) }}', - '{{ (1, 2,) }}', - '{{ 1, }}', - '{{ 1, 2 }}', - '{% for foo, bar in seq %}...{% endfor %}', - '{% for x in foo, bar %}...{% endfor %}', - '{% for x in foo, %}...{% endfor %}' - ]: - assert env.from_string(tmpl) - - def test_trailing_comma(self): - tmpl = env.from_string('{{ (1, 2,) }}|{{ [1, 2,] }}|{{ {1: 2,} }}') - assert tmpl.render().lower() == '(1, 2)|[1, 2]|{1: 2}' - - def test_block_end_name(self): - env.from_string('{% block foo %}...{% endblock foo %}') - self.assert_raises(TemplateSyntaxError, env.from_string, - '{% block x %}{% endblock y %}') - - def test_constant_casing(self): - for const in True, False, None: - tmpl = env.from_string('{{ %s }}|{{ %s }}|{{ %s }}' % ( - str(const), str(const).lower(), str(const).upper() - )) - assert tmpl.render() == '%s|%s|' % (const, const) - - def test_test_chaining(self): - self.assert_raises(TemplateSyntaxError, env.from_string, - '{{ foo is string is sequence }}') - assert env.from_string('{{ 42 is string or 42 is number }}' - ).render() == 'True' - - def test_string_concatenation(self): - tmpl = env.from_string('{{ "foo" "bar" "baz" }}') - assert tmpl.render() == 'foobarbaz' - - def test_notin(self): - bar = range(100) - tmpl = env.from_string('''{{ not 42 in bar }}''') - assert tmpl.render(bar=bar) == text_type(not 42 in bar) - - def test_implicit_subscribed_tuple(self): - class Foo(object): - def __getitem__(self, x): - return x - t = env.from_string('{{ foo[1, 2] }}') - assert t.render(foo=Foo()) == u'(1, 2)' - - def test_raw2(self): - tmpl = env.from_string('{% raw %}{{ FOO }} and {% BAR %}{% endraw %}') - assert tmpl.render() == '{{ FOO }} and {% BAR %}' - - def test_const(self): - tmpl = env.from_string('{{ true }}|{{ false }}|{{ none }}|' - '{{ none is defined }}|{{ missing is defined }}') - assert tmpl.render() == 'True|False|None|True|False' - - def test_neg_filter_priority(self): - node = env.parse('{{ -1|foo }}') - assert isinstance(node.body[0].nodes[0], nodes.Filter) - assert isinstance(node.body[0].nodes[0].node, nodes.Neg) - - def test_const_assign(self): - constass1 = '''{% set true = 42 %}''' - constass2 = '''{% for none in seq %}{% endfor %}''' - for tmpl in constass1, constass2: - self.assert_raises(TemplateSyntaxError, env.from_string, tmpl) - - def test_localset(self): - tmpl = env.from_string('''{% set foo = 0 %}\ -{% for item in [1, 2] %}{% set foo = 1 %}{% endfor %}\ -{{ foo }}''') - assert tmpl.render() == '0' - - def test_parse_unary(self): - tmpl = env.from_string('{{ -foo["bar"] }}') - assert tmpl.render(foo={'bar': 42}) == '-42' - tmpl = env.from_string('{{ -foo["bar"]|abs }}') - assert tmpl.render(foo={'bar': 42}) == '42' - - -class LstripBlocksTestCase(JinjaTestCase): - - def test_lstrip(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {% if True %}\n {% endif %}''') - assert tmpl.render() == "\n" - - def test_lstrip_trim(self): - env = Environment(lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string(''' {% if True %}\n {% endif %}''') - assert tmpl.render() == "" - - def test_no_lstrip(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {%+ if True %}\n {%+ endif %}''') - assert tmpl.render() == " \n " - - def test_lstrip_endline(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' hello{% if True %}\n goodbye{% endif %}''') - assert tmpl.render() == " hello\n goodbye" - - def test_lstrip_inline(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {% if True %}hello {% endif %}''') - assert tmpl.render() == 'hello ' - - def test_lstrip_nested(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {% if True %}a {% if True %}b {% endif %}c {% endif %}''') - assert tmpl.render() == 'a b c ' - - def test_lstrip_left_chars(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' abc {% if True %} - hello{% endif %}''') - assert tmpl.render() == ' abc \n hello' - - def test_lstrip_embeded_strings(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {% set x = " {% str %} " %}{{ x }}''') - assert tmpl.render() == ' {% str %} ' - - def test_lstrip_preserve_leading_newlines(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string('''\n\n\n{% set hello = 1 %}''') - assert tmpl.render() == '\n\n\n' - - def test_lstrip_comment(self): - env = Environment(lstrip_blocks=True, trim_blocks=False) - tmpl = env.from_string(''' {# if True #} -hello - {#endif#}''') - assert tmpl.render() == '\nhello\n' - - def test_lstrip_angle_bracket_simple(self): - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string(''' <% if True %>hello <% endif %>''') - assert tmpl.render() == 'hello ' - - def test_lstrip_angle_bracket_comment(self): - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string(''' <%# if True %>hello <%# endif %>''') - assert tmpl.render() == 'hello ' - - def test_lstrip_angle_bracket(self): - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ - <%# regular comment %> - <% for item in seq %> -${item} ## the rest of the stuff - <% endfor %>''') - assert tmpl.render(seq=range(5)) == \ - ''.join('%s\n' % x for x in range(5)) - - def test_lstrip_angle_bracket_compact(self): - env = Environment('<%', '%>', '${', '}', '<%#', '%>', '%', '##', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ - <%#regular comment%> - <%for item in seq%> -${item} ## the rest of the stuff - <%endfor%>''') - assert tmpl.render(seq=range(5)) == \ - ''.join('%s\n' % x for x in range(5)) - - def test_php_syntax_with_manual(self): - env = Environment('', '', '', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ - - - - ''') - assert tmpl.render(seq=range(5)) == '01234' - - def test_php_syntax(self): - env = Environment('', '', '', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ - - - - ''') - assert tmpl.render(seq=range(5)) == ''.join(' %s\n' % x for x in range(5)) - - def test_php_syntax_compact(self): - env = Environment('', '', '', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ - - - - ''') - assert tmpl.render(seq=range(5)) == ''.join(' %s\n' % x for x in range(5)) - - def test_erb_syntax(self): - env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>', - lstrip_blocks=True, trim_blocks=True) - #env.from_string('') - #for n,r in env.lexer.rules.iteritems(): - # print n - #print env.lexer.rules['root'][0][0].pattern - #print "'%s'" % tmpl.render(seq=range(5)) - tmpl = env.from_string('''\ -<%# I'm a comment, I'm not interesting %> - <% for item in seq %> - <%= item %> - <% endfor %> -''') - assert tmpl.render(seq=range(5)) == ''.join(' %s\n' % x for x in range(5)) - - def test_erb_syntax_with_manual(self): - env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ -<%# I'm a comment, I'm not interesting %> - <% for item in seq -%> - <%= item %> - <%- endfor %>''') - assert tmpl.render(seq=range(5)) == '01234' - - def test_erb_syntax_no_lstrip(self): - env = Environment('<%', '%>', '<%=', '%>', '<%#', '%>', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ -<%# I'm a comment, I'm not interesting %> - <%+ for item in seq -%> - <%= item %> - <%- endfor %>''') - assert tmpl.render(seq=range(5)) == ' 01234' - - def test_comment_syntax(self): - env = Environment('', '${', '}', '', - lstrip_blocks=True, trim_blocks=True) - tmpl = env.from_string('''\ -\ - - ${item} -''') - assert tmpl.render(seq=range(5)) == '01234' - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TokenStreamTestCase)) - suite.addTest(unittest.makeSuite(LexerTestCase)) - suite.addTest(unittest.makeSuite(ParserTestCase)) - suite.addTest(unittest.makeSuite(SyntaxTestCase)) - suite.addTest(unittest.makeSuite(LstripBlocksTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/loader.py b/vendor/jinja2/testsuite/loader.py deleted file mode 100644 index a7350aab..00000000 --- a/vendor/jinja2/testsuite/loader.py +++ /dev/null @@ -1,226 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.loader - ~~~~~~~~~~~~~~~~~~~~~~~ - - Test the loaders. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import os -import sys -import tempfile -import shutil -import unittest - -from jinja2.testsuite import JinjaTestCase, dict_loader, \ - package_loader, filesystem_loader, function_loader, \ - choice_loader, prefix_loader - -from jinja2 import Environment, loaders -from jinja2._compat import PYPY, PY2 -from jinja2.loaders import split_template_path -from jinja2.exceptions import TemplateNotFound - - -class LoaderTestCase(JinjaTestCase): - - def test_dict_loader(self): - env = Environment(loader=dict_loader) - tmpl = env.get_template('justdict.html') - assert tmpl.render().strip() == 'FOO' - self.assert_raises(TemplateNotFound, env.get_template, 'missing.html') - - def test_package_loader(self): - env = Environment(loader=package_loader) - tmpl = env.get_template('test.html') - assert tmpl.render().strip() == 'BAR' - self.assert_raises(TemplateNotFound, env.get_template, 'missing.html') - - def test_filesystem_loader(self): - env = Environment(loader=filesystem_loader) - tmpl = env.get_template('test.html') - assert tmpl.render().strip() == 'BAR' - tmpl = env.get_template('foo/test.html') - assert tmpl.render().strip() == 'FOO' - self.assert_raises(TemplateNotFound, env.get_template, 'missing.html') - - def test_choice_loader(self): - env = Environment(loader=choice_loader) - tmpl = env.get_template('justdict.html') - assert tmpl.render().strip() == 'FOO' - tmpl = env.get_template('test.html') - assert tmpl.render().strip() == 'BAR' - self.assert_raises(TemplateNotFound, env.get_template, 'missing.html') - - def test_function_loader(self): - env = Environment(loader=function_loader) - tmpl = env.get_template('justfunction.html') - assert tmpl.render().strip() == 'FOO' - self.assert_raises(TemplateNotFound, env.get_template, 'missing.html') - - def test_prefix_loader(self): - env = Environment(loader=prefix_loader) - tmpl = env.get_template('a/test.html') - assert tmpl.render().strip() == 'BAR' - tmpl = env.get_template('b/justdict.html') - assert tmpl.render().strip() == 'FOO' - self.assert_raises(TemplateNotFound, env.get_template, 'missing') - - def test_caching(self): - changed = False - class TestLoader(loaders.BaseLoader): - def get_source(self, environment, template): - return u'foo', None, lambda: not changed - env = Environment(loader=TestLoader(), cache_size=-1) - tmpl = env.get_template('template') - assert tmpl is env.get_template('template') - changed = True - assert tmpl is not env.get_template('template') - changed = False - - env = Environment(loader=TestLoader(), cache_size=0) - assert env.get_template('template') \ - is not env.get_template('template') - - env = Environment(loader=TestLoader(), cache_size=2) - t1 = env.get_template('one') - t2 = env.get_template('two') - assert t2 is env.get_template('two') - assert t1 is env.get_template('one') - t3 = env.get_template('three') - assert 'one' in env.cache - assert 'two' not in env.cache - assert 'three' in env.cache - - def test_dict_loader_cache_invalidates(self): - mapping = {'foo': "one"} - env = Environment(loader=loaders.DictLoader(mapping)) - assert env.get_template('foo').render() == "one" - mapping['foo'] = "two" - assert env.get_template('foo').render() == "two" - - def test_split_template_path(self): - assert split_template_path('foo/bar') == ['foo', 'bar'] - assert split_template_path('./foo/bar') == ['foo', 'bar'] - self.assert_raises(TemplateNotFound, split_template_path, '../foo') - - -class ModuleLoaderTestCase(JinjaTestCase): - archive = None - - def compile_down(self, zip='deflated', py_compile=False): - super(ModuleLoaderTestCase, self).setup() - log = [] - self.reg_env = Environment(loader=prefix_loader) - if zip is not None: - self.archive = tempfile.mkstemp(suffix='.zip')[1] - else: - self.archive = tempfile.mkdtemp() - self.reg_env.compile_templates(self.archive, zip=zip, - log_function=log.append, - py_compile=py_compile) - self.mod_env = Environment(loader=loaders.ModuleLoader(self.archive)) - return ''.join(log) - - def teardown(self): - super(ModuleLoaderTestCase, self).teardown() - if hasattr(self, 'mod_env'): - if os.path.isfile(self.archive): - os.remove(self.archive) - else: - shutil.rmtree(self.archive) - self.archive = None - - def test_log(self): - log = self.compile_down() - assert 'Compiled "a/foo/test.html" as ' \ - 'tmpl_a790caf9d669e39ea4d280d597ec891c4ef0404a' in log - assert 'Finished compiling templates' in log - assert 'Could not compile "a/syntaxerror.html": ' \ - 'Encountered unknown tag \'endif\'' in log - - def _test_common(self): - tmpl1 = self.reg_env.get_template('a/test.html') - tmpl2 = self.mod_env.get_template('a/test.html') - assert tmpl1.render() == tmpl2.render() - - tmpl1 = self.reg_env.get_template('b/justdict.html') - tmpl2 = self.mod_env.get_template('b/justdict.html') - assert tmpl1.render() == tmpl2.render() - - def test_deflated_zip_compile(self): - self.compile_down(zip='deflated') - self._test_common() - - def test_stored_zip_compile(self): - self.compile_down(zip='stored') - self._test_common() - - def test_filesystem_compile(self): - self.compile_down(zip=None) - self._test_common() - - def test_weak_references(self): - self.compile_down() - tmpl = self.mod_env.get_template('a/test.html') - key = loaders.ModuleLoader.get_template_key('a/test.html') - name = self.mod_env.loader.module.__name__ - - assert hasattr(self.mod_env.loader.module, key) - assert name in sys.modules - - # unset all, ensure the module is gone from sys.modules - self.mod_env = tmpl = None - - try: - import gc - gc.collect() - except: - pass - - assert name not in sys.modules - - # This test only makes sense on non-pypy python 2 - if PY2 and not PYPY: - def test_byte_compilation(self): - log = self.compile_down(py_compile=True) - assert 'Byte-compiled "a/test.html"' in log - tmpl1 = self.mod_env.get_template('a/test.html') - mod = self.mod_env.loader.module. \ - tmpl_3c4ddf650c1a73df961a6d3d2ce2752f1b8fd490 - assert mod.__file__.endswith('.pyc') - - def test_choice_loader(self): - log = self.compile_down() - - self.mod_env.loader = loaders.ChoiceLoader([ - self.mod_env.loader, - loaders.DictLoader({'DICT_SOURCE': 'DICT_TEMPLATE'}) - ]) - - tmpl1 = self.mod_env.get_template('a/test.html') - self.assert_equal(tmpl1.render(), 'BAR') - tmpl2 = self.mod_env.get_template('DICT_SOURCE') - self.assert_equal(tmpl2.render(), 'DICT_TEMPLATE') - - def test_prefix_loader(self): - log = self.compile_down() - - self.mod_env.loader = loaders.PrefixLoader({ - 'MOD': self.mod_env.loader, - 'DICT': loaders.DictLoader({'test.html': 'DICT_TEMPLATE'}) - }) - - tmpl1 = self.mod_env.get_template('MOD/a/test.html') - self.assert_equal(tmpl1.render(), 'BAR') - tmpl2 = self.mod_env.get_template('DICT/test.html') - self.assert_equal(tmpl2.render(), 'DICT_TEMPLATE') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(LoaderTestCase)) - suite.addTest(unittest.makeSuite(ModuleLoaderTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/regression.py b/vendor/jinja2/testsuite/regression.py deleted file mode 100644 index c5f7d5c6..00000000 --- a/vendor/jinja2/testsuite/regression.py +++ /dev/null @@ -1,279 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.regression - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests corner cases and bugs. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Template, Environment, DictLoader, TemplateSyntaxError, \ - TemplateNotFound, PrefixLoader -from jinja2._compat import text_type - -env = Environment() - - -class CornerTestCase(JinjaTestCase): - - def test_assigned_scoping(self): - t = env.from_string(''' - {%- for item in (1, 2, 3, 4) -%} - [{{ item }}] - {%- endfor %} - {{- item -}} - ''') - assert t.render(item=42) == '[1][2][3][4]42' - - t = env.from_string(''' - {%- for item in (1, 2, 3, 4) -%} - [{{ item }}] - {%- endfor %} - {%- set item = 42 %} - {{- item -}} - ''') - assert t.render() == '[1][2][3][4]42' - - t = env.from_string(''' - {%- set item = 42 %} - {%- for item in (1, 2, 3, 4) -%} - [{{ item }}] - {%- endfor %} - {{- item -}} - ''') - assert t.render() == '[1][2][3][4]42' - - def test_closure_scoping(self): - t = env.from_string(''' - {%- set wrapper = "" %} - {%- for item in (1, 2, 3, 4) %} - {%- macro wrapper() %}[{{ item }}]{% endmacro %} - {{- wrapper() }} - {%- endfor %} - {{- wrapper -}} - ''') - assert t.render() == '[1][2][3][4]' - - t = env.from_string(''' - {%- for item in (1, 2, 3, 4) %} - {%- macro wrapper() %}[{{ item }}]{% endmacro %} - {{- wrapper() }} - {%- endfor %} - {%- set wrapper = "" %} - {{- wrapper -}} - ''') - assert t.render() == '[1][2][3][4]' - - t = env.from_string(''' - {%- for item in (1, 2, 3, 4) %} - {%- macro wrapper() %}[{{ item }}]{% endmacro %} - {{- wrapper() }} - {%- endfor %} - {{- wrapper -}} - ''') - assert t.render(wrapper=23) == '[1][2][3][4]23' - - -class BugTestCase(JinjaTestCase): - - def test_keyword_folding(self): - env = Environment() - env.filters['testing'] = lambda value, some: value + some - assert env.from_string("{{ 'test'|testing(some='stuff') }}") \ - .render() == 'teststuff' - - def test_extends_output_bugs(self): - env = Environment(loader=DictLoader({ - 'parent.html': '(({% block title %}{% endblock %}))' - })) - - t = env.from_string('{% if expr %}{% extends "parent.html" %}{% endif %}' - '[[{% block title %}title{% endblock %}]]' - '{% for item in [1, 2, 3] %}({{ item }}){% endfor %}') - assert t.render(expr=False) == '[[title]](1)(2)(3)' - assert t.render(expr=True) == '((title))' - - def test_urlize_filter_escaping(self): - tmpl = env.from_string('{{ "http://www.example.org/http://www.example.org/<foo' - - def test_loop_call_loop(self): - tmpl = env.from_string(''' - - {% macro test() %} - {{ caller() }} - {% endmacro %} - - {% for num1 in range(5) %} - {% call test() %} - {% for num2 in range(10) %} - {{ loop.index }} - {% endfor %} - {% endcall %} - {% endfor %} - - ''') - - assert tmpl.render().split() == [text_type(x) for x in range(1, 11)] * 5 - - def test_weird_inline_comment(self): - env = Environment(line_statement_prefix='%') - self.assert_raises(TemplateSyntaxError, env.from_string, - '% for item in seq {# missing #}\n...% endfor') - - def test_old_macro_loop_scoping_bug(self): - tmpl = env.from_string('{% for i in (1, 2) %}{{ i }}{% endfor %}' - '{% macro i() %}3{% endmacro %}{{ i() }}') - assert tmpl.render() == '123' - - def test_partial_conditional_assignments(self): - tmpl = env.from_string('{% if b %}{% set a = 42 %}{% endif %}{{ a }}') - assert tmpl.render(a=23) == '23' - assert tmpl.render(b=True) == '42' - - def test_stacked_locals_scoping_bug(self): - env = Environment(line_statement_prefix='#') - t = env.from_string('''\ -# for j in [1, 2]: -# set x = 1 -# for i in [1, 2]: -# print x -# if i % 2 == 0: -# set x = x + 1 -# endif -# endfor -# endfor -# if a -# print 'A' -# elif b -# print 'B' -# elif c == d -# print 'C' -# else -# print 'D' -# endif - ''') - assert t.render(a=0, b=False, c=42, d=42.0) == '1111C' - - def test_stacked_locals_scoping_bug_twoframe(self): - t = Template(''' - {% set x = 1 %} - {% for item in foo %} - {% if item == 1 %} - {% set x = 2 %} - {% endif %} - {% endfor %} - {{ x }} - ''') - rv = t.render(foo=[1]).strip() - assert rv == u'1' - - def test_call_with_args(self): - t = Template("""{% macro dump_users(users) -%} -
    - {%- for user in users -%} -
  • {{ user.username|e }}

    {{ caller(user) }}
  • - {%- endfor -%} -
- {%- endmacro -%} - - {% call(user) dump_users(list_of_user) -%} -
-
Realname
-
{{ user.realname|e }}
-
Description
-
{{ user.description }}
-
- {% endcall %}""") - - assert [x.strip() for x in t.render(list_of_user=[{ - 'username':'apo', - 'realname':'something else', - 'description':'test' - }]).splitlines()] == [ - u'
  • apo

    ', - u'
    Realname
    ', - u'
    something else
    ', - u'
    Description
    ', - u'
    test
    ', - u'
    ', - u'
' - ] - - def test_empty_if_condition_fails(self): - self.assert_raises(TemplateSyntaxError, Template, '{% if %}....{% endif %}') - self.assert_raises(TemplateSyntaxError, Template, '{% if foo %}...{% elif %}...{% endif %}') - self.assert_raises(TemplateSyntaxError, Template, '{% for x in %}..{% endfor %}') - - def test_recursive_loop_bug(self): - tpl1 = Template(""" - {% for p in foo recursive%} - {{p.bar}} - {% for f in p.fields recursive%} - {{f.baz}} - {{p.bar}} - {% if f.rec %} - {{ loop(f.sub) }} - {% endif %} - {% endfor %} - {% endfor %} - """) - - tpl2 = Template(""" - {% for p in foo%} - {{p.bar}} - {% for f in p.fields recursive%} - {{f.baz}} - {{p.bar}} - {% if f.rec %} - {{ loop(f.sub) }} - {% endif %} - {% endfor %} - {% endfor %} - """) - - def test_else_loop_bug(self): - t = Template(''' - {% for x in y %} - {{ loop.index0 }} - {% else %} - {% for i in range(3) %}{{ i }}{% endfor %} - {% endfor %} - ''') - self.assertEqual(t.render(y=[]).strip(), '012') - - def test_correct_prefix_loader_name(self): - env = Environment(loader=PrefixLoader({ - 'foo': DictLoader({}) - })) - try: - env.get_template('foo/bar.html') - except TemplateNotFound as e: - assert e.name == 'foo/bar.html' - else: - assert False, 'expected error here' - - def test_contextfunction_callable_classes(self): - from jinja2.utils import contextfunction - class CallableClass(object): - @contextfunction - def __call__(self, ctx): - return ctx.resolve('hello') - - tpl = Template("""{{ callableclass() }}""") - output = tpl.render(callableclass = CallableClass(), hello = 'TEST') - expected = 'TEST' - - self.assert_equal(output, expected) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(CornerTestCase)) - suite.addTest(unittest.makeSuite(BugTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/res/templates/broken.html b/vendor/jinja2/testsuite/res/templates/broken.html deleted file mode 100644 index 77669fae..00000000 --- a/vendor/jinja2/testsuite/res/templates/broken.html +++ /dev/null @@ -1,3 +0,0 @@ -Before -{{ fail() }} -After diff --git a/vendor/jinja2/testsuite/res/templates/foo/test.html b/vendor/jinja2/testsuite/res/templates/foo/test.html deleted file mode 100644 index b7d6715e..00000000 --- a/vendor/jinja2/testsuite/res/templates/foo/test.html +++ /dev/null @@ -1 +0,0 @@ -FOO diff --git a/vendor/jinja2/testsuite/res/templates/syntaxerror.html b/vendor/jinja2/testsuite/res/templates/syntaxerror.html deleted file mode 100644 index f21b8179..00000000 --- a/vendor/jinja2/testsuite/res/templates/syntaxerror.html +++ /dev/null @@ -1,4 +0,0 @@ -Foo -{% for item in broken %} - ... -{% endif %} diff --git a/vendor/jinja2/testsuite/res/templates/test.html b/vendor/jinja2/testsuite/res/templates/test.html deleted file mode 100644 index ba578e48..00000000 --- a/vendor/jinja2/testsuite/res/templates/test.html +++ /dev/null @@ -1 +0,0 @@ -BAR diff --git a/vendor/jinja2/testsuite/security.py b/vendor/jinja2/testsuite/security.py deleted file mode 100644 index 246d0f07..00000000 --- a/vendor/jinja2/testsuite/security.py +++ /dev/null @@ -1,166 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.security - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Checks the sandbox and other security features. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Environment -from jinja2.sandbox import SandboxedEnvironment, \ - ImmutableSandboxedEnvironment, unsafe -from jinja2 import Markup, escape -from jinja2.exceptions import SecurityError, TemplateSyntaxError, \ - TemplateRuntimeError -from jinja2._compat import text_type - - -class PrivateStuff(object): - - def bar(self): - return 23 - - @unsafe - def foo(self): - return 42 - - def __repr__(self): - return 'PrivateStuff' - - -class PublicStuff(object): - bar = lambda self: 23 - _foo = lambda self: 42 - - def __repr__(self): - return 'PublicStuff' - - -class SandboxTestCase(JinjaTestCase): - - def test_unsafe(self): - env = SandboxedEnvironment() - self.assert_raises(SecurityError, env.from_string("{{ foo.foo() }}").render, - foo=PrivateStuff()) - self.assert_equal(env.from_string("{{ foo.bar() }}").render(foo=PrivateStuff()), '23') - - self.assert_raises(SecurityError, env.from_string("{{ foo._foo() }}").render, - foo=PublicStuff()) - self.assert_equal(env.from_string("{{ foo.bar() }}").render(foo=PublicStuff()), '23') - self.assert_equal(env.from_string("{{ foo.__class__ }}").render(foo=42), '') - self.assert_equal(env.from_string("{{ foo.func_code }}").render(foo=lambda:None), '') - # security error comes from __class__ already. - self.assert_raises(SecurityError, env.from_string( - "{{ foo.__class__.__subclasses__() }}").render, foo=42) - - def test_immutable_environment(self): - env = ImmutableSandboxedEnvironment() - self.assert_raises(SecurityError, env.from_string( - '{{ [].append(23) }}').render) - self.assert_raises(SecurityError, env.from_string( - '{{ {1:2}.clear() }}').render) - - def test_restricted(self): - env = SandboxedEnvironment() - self.assert_raises(TemplateSyntaxError, env.from_string, - "{% for item.attribute in seq %}...{% endfor %}") - self.assert_raises(TemplateSyntaxError, env.from_string, - "{% for foo, bar.baz in seq %}...{% endfor %}") - - def test_markup_operations(self): - # adding two strings should escape the unsafe one - unsafe = '' - safe = Markup('username') - assert unsafe + safe == text_type(escape(unsafe)) + text_type(safe) - - # string interpolations are safe to use too - assert Markup('%s') % '' == \ - '<bad user>' - assert Markup('%(username)s') % { - 'username': '' - } == '<bad user>' - - # an escaped object is markup too - assert type(Markup('foo') + 'bar') is Markup - - # and it implements __html__ by returning itself - x = Markup("foo") - assert x.__html__() is x - - # it also knows how to treat __html__ objects - class Foo(object): - def __html__(self): - return 'awesome' - def __unicode__(self): - return 'awesome' - assert Markup(Foo()) == 'awesome' - assert Markup('%s') % Foo() == \ - 'awesome' - - # escaping and unescaping - assert escape('"<>&\'') == '"<>&'' - assert Markup("Foo & Bar").striptags() == "Foo & Bar" - assert Markup("<test>").unescape() == "" - - def test_template_data(self): - env = Environment(autoescape=True) - t = env.from_string('{% macro say_hello(name) %}' - '

Hello {{ name }}!

{% endmacro %}' - '{{ say_hello("foo") }}') - escaped_out = '

Hello <blink>foo</blink>!

' - assert t.render() == escaped_out - assert text_type(t.module) == escaped_out - assert escape(t.module) == escaped_out - assert t.module.say_hello('foo') == escaped_out - assert escape(t.module.say_hello('foo')) == escaped_out - - def test_attr_filter(self): - env = SandboxedEnvironment() - tmpl = env.from_string('{{ cls|attr("__subclasses__")() }}') - self.assert_raises(SecurityError, tmpl.render, cls=int) - - def test_binary_operator_intercepting(self): - def disable_op(left, right): - raise TemplateRuntimeError('that operator so does not work') - for expr, ctx, rv in ('1 + 2', {}, '3'), ('a + 2', {'a': 2}, '4'): - env = SandboxedEnvironment() - env.binop_table['+'] = disable_op - t = env.from_string('{{ %s }}' % expr) - assert t.render(ctx) == rv - env.intercepted_binops = frozenset(['+']) - t = env.from_string('{{ %s }}' % expr) - try: - t.render(ctx) - except TemplateRuntimeError as e: - pass - else: - self.fail('expected runtime error') - - def test_unary_operator_intercepting(self): - def disable_op(arg): - raise TemplateRuntimeError('that operator so does not work') - for expr, ctx, rv in ('-1', {}, '-1'), ('-a', {'a': 2}, '-2'): - env = SandboxedEnvironment() - env.unop_table['-'] = disable_op - t = env.from_string('{{ %s }}' % expr) - assert t.render(ctx) == rv - env.intercepted_unops = frozenset(['-']) - t = env.from_string('{{ %s }}' % expr) - try: - t.render(ctx) - except TemplateRuntimeError as e: - pass - else: - self.fail('expected runtime error') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SandboxTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/tests.py b/vendor/jinja2/testsuite/tests.py deleted file mode 100644 index 3ece7a8f..00000000 --- a/vendor/jinja2/testsuite/tests.py +++ /dev/null @@ -1,93 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.tests - ~~~~~~~~~~~~~~~~~~~~~~ - - Who tests the tests? - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import unittest -from jinja2.testsuite import JinjaTestCase - -from jinja2 import Markup, Environment - -env = Environment() - - -class TestsTestCase(JinjaTestCase): - - def test_defined(self): - tmpl = env.from_string('{{ missing is defined }}|{{ true is defined }}') - assert tmpl.render() == 'False|True' - - def test_even(self): - tmpl = env.from_string('''{{ 1 is even }}|{{ 2 is even }}''') - assert tmpl.render() == 'False|True' - - def test_odd(self): - tmpl = env.from_string('''{{ 1 is odd }}|{{ 2 is odd }}''') - assert tmpl.render() == 'True|False' - - def test_lower(self): - tmpl = env.from_string('''{{ "foo" is lower }}|{{ "FOO" is lower }}''') - assert tmpl.render() == 'True|False' - - def test_typechecks(self): - tmpl = env.from_string(''' - {{ 42 is undefined }} - {{ 42 is defined }} - {{ 42 is none }} - {{ none is none }} - {{ 42 is number }} - {{ 42 is string }} - {{ "foo" is string }} - {{ "foo" is sequence }} - {{ [1] is sequence }} - {{ range is callable }} - {{ 42 is callable }} - {{ range(5) is iterable }} - {{ {} is mapping }} - {{ mydict is mapping }} - {{ [] is mapping }} - ''') - class MyDict(dict): - pass - assert tmpl.render(mydict=MyDict()).split() == [ - 'False', 'True', 'False', 'True', 'True', 'False', - 'True', 'True', 'True', 'True', 'False', 'True', - 'True', 'True', 'False' - ] - - def test_sequence(self): - tmpl = env.from_string( - '{{ [1, 2, 3] is sequence }}|' - '{{ "foo" is sequence }}|' - '{{ 42 is sequence }}' - ) - assert tmpl.render() == 'True|True|False' - - def test_upper(self): - tmpl = env.from_string('{{ "FOO" is upper }}|{{ "foo" is upper }}') - assert tmpl.render() == 'True|False' - - def test_sameas(self): - tmpl = env.from_string('{{ foo is sameas false }}|' - '{{ 0 is sameas false }}') - assert tmpl.render(foo=False) == 'True|False' - - def test_no_paren_for_arg1(self): - tmpl = env.from_string('{{ foo is sameas none }}') - assert tmpl.render(foo=None) == 'True' - - def test_escaped(self): - env = Environment(autoescape=True) - tmpl = env.from_string('{{ x is escaped }}|{{ y is escaped }}') - assert tmpl.render(x='foo', y=Markup('foo')) == 'False|True' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestsTestCase)) - return suite diff --git a/vendor/jinja2/testsuite/utils.py b/vendor/jinja2/testsuite/utils.py deleted file mode 100644 index cab9b09a..00000000 --- a/vendor/jinja2/testsuite/utils.py +++ /dev/null @@ -1,82 +0,0 @@ -# -*- coding: utf-8 -*- -""" - jinja2.testsuite.utils - ~~~~~~~~~~~~~~~~~~~~~~ - - Tests utilities jinja uses. - - :copyright: (c) 2010 by the Jinja Team. - :license: BSD, see LICENSE for more details. -""" -import gc -import unittest - -import pickle - -from jinja2.testsuite import JinjaTestCase - -from jinja2.utils import LRUCache, escape, object_type_repr - - -class LRUCacheTestCase(JinjaTestCase): - - def test_simple(self): - d = LRUCache(3) - d["a"] = 1 - d["b"] = 2 - d["c"] = 3 - d["a"] - d["d"] = 4 - assert len(d) == 3 - assert 'a' in d and 'c' in d and 'd' in d and 'b' not in d - - def test_pickleable(self): - cache = LRUCache(2) - cache["foo"] = 42 - cache["bar"] = 23 - cache["foo"] - - for protocol in range(3): - copy = pickle.loads(pickle.dumps(cache, protocol)) - assert copy.capacity == cache.capacity - assert copy._mapping == cache._mapping - assert copy._queue == cache._queue - - -class HelpersTestCase(JinjaTestCase): - - def test_object_type_repr(self): - class X(object): - pass - self.assert_equal(object_type_repr(42), 'int object') - self.assert_equal(object_type_repr([]), 'list object') - self.assert_equal(object_type_repr(X()), - 'jinja2.testsuite.utils.X object') - self.assert_equal(object_type_repr(None), 'None') - self.assert_equal(object_type_repr(Ellipsis), 'Ellipsis') - - -class MarkupLeakTestCase(JinjaTestCase): - - def test_markup_leaks(self): - counts = set() - for count in range(20): - for item in range(1000): - escape("foo") - escape("") - escape(u"foo") - escape(u"") - counts.add(len(gc.get_objects())) - assert len(counts) == 1, 'ouch, c extension seems to leak objects' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(LRUCacheTestCase)) - suite.addTest(unittest.makeSuite(HelpersTestCase)) - - # this test only tests the c extension - if not hasattr(escape, 'func_code'): - suite.addTest(unittest.makeSuite(MarkupLeakTestCase)) - - return suite diff --git a/vendor/jinja2/utils.py b/vendor/jinja2/utils.py index ddc47da0..cdd4cd3a 100644 --- a/vendor/jinja2/utils.py +++ b/vendor/jinja2/utils.py @@ -11,8 +11,9 @@ import re import errno from collections import deque +from threading import Lock from jinja2._compat import text_type, string_types, implements_iterator, \ - allocate_lock, url_quote + url_quote _word_split_re = re.compile(r'(\s+)') @@ -149,7 +150,7 @@ def open_if_exists(filename, mode='rb'): try: return open(filename, mode) except IOError as e: - if e.errno not in (errno.ENOENT, errno.EISDIR): + if e.errno not in (errno.ENOENT, errno.EISDIR, errno.EINVAL): raise @@ -182,7 +183,7 @@ def pformat(obj, verbose=False): return pformat(obj) -def urlize(text, trim_url_limit=None, nofollow=False): +def urlize(text, trim_url_limit=None, nofollow=False, target=None): """Converts any URLs in text into clickable links. Works on http://, https:// and www. links. Links can have trailing punctuation (periods, commas, close-parens) and leading punctuation (opening parens) and @@ -193,12 +194,18 @@ def urlize(text, trim_url_limit=None, nofollow=False): If nofollow is True, the URLs in link text will get a rel="nofollow" attribute. + + If target is not None, a target attribute will be added to the link. """ trim_url = lambda x, limit=trim_url_limit: limit is not None \ and (x[:limit] + (len(x) >=limit and '...' or '')) or x words = _word_split_re.split(text_type(escape(text))) nofollow_attr = nofollow and ' rel="nofollow"' or '' + if target is not None and isinstance(target, string_types): + target_attr = ' target="%s"' % target + else: + target_attr = '' for i, word in enumerate(words): match = _punctuation_re.match(word) if match: @@ -213,12 +220,12 @@ def urlize(text, trim_url_limit=None, nofollow=False): middle.endswith('.net') or middle.endswith('.com') )): - middle = '%s' % (middle, - nofollow_attr, trim_url(middle)) + middle = '%s' % (middle, + nofollow_attr, target_attr, trim_url(middle)) if middle.startswith('http://') or \ middle.startswith('https://'): - middle = '%s' % (middle, - nofollow_attr, trim_url(middle)) + middle = '%s' % (middle, + nofollow_attr, target_attr, trim_url(middle)) if '@' in middle and not middle.startswith('www.') and \ not ':' in middle and _simple_email_re.match(middle): middle = '%s' % (middle, middle) @@ -228,7 +235,7 @@ def urlize(text, trim_url_limit=None, nofollow=False): def generate_lorem_ipsum(n=5, html=True, min=20, max=100): - """Generate some lorem impsum for the template.""" + """Generate some lorem ipsum for the template.""" from jinja2.constants import LOREM_IPSUM_WORDS from random import choice, randrange words = LOREM_IPSUM_WORDS.split() @@ -276,7 +283,7 @@ def generate_lorem_ipsum(n=5, html=True, min=20, max=100): return Markup(u'\n'.join(u'

%s

' % escape(x) for x in result)) -def unicode_urlencode(obj, charset='utf-8'): +def unicode_urlencode(obj, charset='utf-8', for_qs=False): """URL escapes a single bytestring or unicode string with the given charset if applicable to URL safe quoting under all rules that need to be considered under all supported Python versions. @@ -288,7 +295,11 @@ def unicode_urlencode(obj, charset='utf-8'): obj = text_type(obj) if isinstance(obj, text_type): obj = obj.encode(charset) - return text_type(url_quote(obj)) + safe = for_qs and b'' or b'/' + rv = text_type(url_quote(obj, safe)) + if for_qs: + rv = rv.replace('%20', '+') + return rv class LRUCache(object): @@ -309,7 +320,7 @@ class LRUCache(object): self._popleft = self._queue.popleft self._pop = self._queue.pop self._remove = self._queue.remove - self._wlock = allocate_lock() + self._wlock = Lock() self._append = self._queue.append def __getstate__(self): diff --git a/vendor/markupsafe/AUTHORS b/vendor/markupsafe/AUTHORS new file mode 100644 index 00000000..f7e2942e --- /dev/null +++ b/vendor/markupsafe/AUTHORS @@ -0,0 +1,13 @@ +MarkupSafe is written and maintained by Armin Ronacher and +various contributors: + +Development Lead +```````````````` + +- Armin Ronacher + +Patches and Suggestions +``````````````````````` + +- Georg Brandl +- Mickaël Guérin diff --git a/vendor/markupsafe/LICENSE b/vendor/markupsafe/LICENSE new file mode 100644 index 00000000..5d269389 --- /dev/null +++ b/vendor/markupsafe/LICENSE @@ -0,0 +1,33 @@ +Copyright (c) 2010 by Armin Ronacher and contributors. See AUTHORS +for more details. + +Some rights reserved. + +Redistribution and use in source and binary forms of the software as well +as documentation, with or without modification, are permitted provided +that the following conditions are met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE COPYRIGHT HOLDERS AND +CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT +NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE AND DOCUMENTATION, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +DAMAGE. diff --git a/vendor/markupsafe/__init__.py b/vendor/markupsafe/__init__.py index 25f00d3a..27554015 100644 --- a/vendor/markupsafe/__init__.py +++ b/vendor/markupsafe/__init__.py @@ -9,8 +9,10 @@ :license: BSD, see LICENSE for more details. """ import re +import string +from collections import Mapping from markupsafe._compat import text_type, string_types, int_types, \ - unichr, PY2 + unichr, iteritems, PY2 __all__ = ['Markup', 'soft_unicode', 'escape', 'escape_silent'] @@ -41,7 +43,7 @@ class Markup(text_type): >>> class Foo(object): ... def __html__(self): ... return 'foo' - ... + ... >>> Markup(Foo()) Markup(u'foo') @@ -117,7 +119,8 @@ class Markup(text_type): rsplit.__doc__ = text_type.rsplit.__doc__ def splitlines(self, *args, **kwargs): - return list(map(self.__class__, text_type.splitlines(self, *args, **kwargs))) + return list(map(self.__class__, text_type.splitlines( + self, *args, **kwargs))) splitlines.__doc__ = text_type.splitlines.__doc__ def unescape(self): @@ -164,11 +167,11 @@ class Markup(text_type): return cls(rv) return rv - def make_wrapper(name): + def make_simple_escaping_wrapper(name): orig = getattr(text_type, name) def func(self, *args, **kwargs): args = _escape_argspec(list(args), enumerate(args), self.escape) - #_escape_argspec(kwargs, kwargs.iteritems(), None) + _escape_argspec(kwargs, iteritems(kwargs), self.escape) return self.__class__(orig(self, *args, **kwargs)) func.__name__ = orig.__name__ func.__doc__ = orig.__doc__ @@ -178,7 +181,7 @@ class Markup(text_type): 'title', 'lower', 'upper', 'replace', 'ljust', \ 'rjust', 'lstrip', 'rstrip', 'center', 'strip', \ 'translate', 'expandtabs', 'swapcase', 'zfill': - locals()[method] = make_wrapper(method) + locals()[method] = make_simple_escaping_wrapper(method) # new in python 2.5 if hasattr(text_type, 'partition'): @@ -191,13 +194,74 @@ class Markup(text_type): # new in python 2.6 if hasattr(text_type, 'format'): - format = make_wrapper('format') + def format(*args, **kwargs): + self, args = args[0], args[1:] + formatter = EscapeFormatter(self.escape) + kwargs = _MagicFormatMapping(args, kwargs) + return self.__class__(formatter.vformat(self, args, kwargs)) + + def __html_format__(self, format_spec): + if format_spec: + raise ValueError('Unsupported format specification ' + 'for Markup.') + return self # not in python 3 if hasattr(text_type, '__getslice__'): - __getslice__ = make_wrapper('__getslice__') + __getslice__ = make_simple_escaping_wrapper('__getslice__') - del method, make_wrapper + del method, make_simple_escaping_wrapper + + +class _MagicFormatMapping(Mapping): + """This class implements a dummy wrapper to fix a bug in the Python + standard library for string formatting. + + See http://bugs.python.org/issue13598 for information about why + this is necessary. + """ + + def __init__(self, args, kwargs): + self._args = args + self._kwargs = kwargs + self._last_index = 0 + + def __getitem__(self, key): + if key == '': + idx = self._last_index + self._last_index += 1 + try: + return self._args[idx] + except LookupError: + pass + key = str(idx) + return self._kwargs[key] + + def __iter__(self): + return iter(self._kwargs) + + def __len__(self): + return len(self._kwargs) + + +if hasattr(text_type, 'format'): + class EscapeFormatter(string.Formatter): + + def __init__(self, escape): + self.escape = escape + + def format_field(self, value, format_spec): + if hasattr(value, '__html_format__'): + rv = value.__html_format__(format_spec) + elif hasattr(value, '__html__'): + if format_spec: + raise ValueError('No format specification allowed ' + 'when formatting an object with ' + 'its __html__ method.') + rv = value.__html__() + else: + rv = string.Formatter.format_field(self, value, format_spec) + return text_type(self.escape(rv)) def _escape_argspec(obj, iterable, escape): diff --git a/vendor/markupsafe/_compat.py b/vendor/markupsafe/_compat.py index 29e4a3da..62e5632a 100644 --- a/vendor/markupsafe/_compat.py +++ b/vendor/markupsafe/_compat.py @@ -17,8 +17,10 @@ if not PY2: string_types = (str,) unichr = chr int_types = (int,) + iteritems = lambda x: iter(x.items()) else: text_type = unicode string_types = (str, unicode) unichr = unichr int_types = (int, long) + iteritems = lambda x: x.iteritems() diff --git a/vendor/markupsafe/_speedups.so b/vendor/markupsafe/_speedups.so deleted file mode 100755 index 5743ec09..00000000 Binary files a/vendor/markupsafe/_speedups.so and /dev/null differ diff --git a/vendor/markupsafe/tests.py b/vendor/markupsafe/tests.py index b34cc6ee..63699362 100644 --- a/vendor/markupsafe/tests.py +++ b/vendor/markupsafe/tests.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- import gc +import sys import unittest from markupsafe import Markup, escape, escape_silent from markupsafe._compat import text_type @@ -42,7 +43,7 @@ class MarkupTestCase(unittest.TestCase): __str__ = __unicode__ assert Markup(Foo()) == 'awesome' assert Markup('%s') % Foo() == \ - 'awesome' + 'awesome' def test_tuple_interpol(self): self.assertEqual(Markup('%s:%s') % ( @@ -65,6 +66,60 @@ class MarkupTestCase(unittest.TestCase): assert Markup("Foo & Bar").striptags() == "Foo & Bar" assert Markup("<test>").unescape() == "" + def test_formatting(self): + for actual, expected in ( + (Markup('%i') % 3.14, '3'), + (Markup('%.2f') % 3.14159, '3.14'), + (Markup('%s %s %s') % ('<', 123, '>'), '< 123 >'), + (Markup('{awesome}').format(awesome=''), + '<awesome>'), + (Markup('{0[1][bar]}').format([0, {'bar': ''}]), + '<bar/>'), + (Markup('{0[1][bar]}').format([0, {'bar': Markup('')}]), + '')): + assert actual == expected, "%r should be %r!" % (actual, expected) + + # This is new in 2.7 + if sys.version_info >= (2, 7): + def test_formatting_empty(self): + formatted = Markup('{}').format(0) + assert formatted == Markup('0') + + def test_custom_formatting(self): + class HasHTMLOnly(object): + def __html__(self): + return Markup('') + + class HasHTMLAndFormat(object): + def __html__(self): + return Markup('') + def __html_format__(self, spec): + return Markup('') + + assert Markup('{0}').format(HasHTMLOnly()) == Markup('') + assert Markup('{0}').format(HasHTMLAndFormat()) == Markup('') + + def test_complex_custom_formatting(self): + class User(object): + def __init__(self, id, username): + self.id = id + self.username = username + def __html_format__(self, format_spec): + if format_spec == 'link': + return Markup('{1}').format( + self.id, + self.__html__(), + ) + elif format_spec: + raise ValueError('Invalid format spec') + return self.__html__() + def __html__(self): + return Markup('{0}').format(self.username) + + user = User(1, 'foo') + assert Markup('

User: {0:link}').format(user) == \ + Markup('

User: foo') + def test_all_set(self): import markupsafe as markup for item in markup.__all__: diff --git a/vendor/pytz/LICENSE.txt b/vendor/pytz/LICENSE.txt new file mode 100644 index 00000000..5e12fcca --- /dev/null +++ b/vendor/pytz/LICENSE.txt @@ -0,0 +1,19 @@ +Copyright (c) 2003-2009 Stuart Bishop + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/vendor/pytz/__init__.py b/vendor/pytz/__init__.py new file mode 100644 index 00000000..f4ff913f --- /dev/null +++ b/vendor/pytz/__init__.py @@ -0,0 +1,1322 @@ +''' +datetime.tzinfo timezone definitions generated from the +Olson timezone database: + + ftp://elsie.nci.nih.gov/pub/tz*.tar.gz + +See the datetime section of the Python Library Reference for information +on how to use these modules. +''' + +# The Olson database has historically been updated about 4 times a year +OLSON_VERSION = '2006p' +VERSION = OLSON_VERSION +#VERSION = OLSON_VERSION + '.2' +__version__ = OLSON_VERSION + +OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling + +__all__ = [ + 'timezone', 'all_timezones', 'common_timezones', 'utc', + 'AmbiguousTimeError', 'country_timezones', '_', + ] + +import sys, datetime, os.path, gettext +from tzinfo import AmbiguousTimeError, unpickler + +# Enable this when we get some translations? +# We want an i18n API that is useful to programs using Python's gettext +# module, as well as the Zope3 i18n package. Perhaps we should just provide +# the POT file and translations, and leave it up to callers to make use +# of them. +# +# t = gettext.translation( +# 'pytz', os.path.join(os.path.dirname(__file__), 'locales'), +# fallback=True +# ) +# def _(timezone_name): +# """Translate a timezone name using the current locale, returning Unicode""" +# return t.ugettext(timezone_name) + +def timezone(zone): + ''' Return a datetime.tzinfo implementation for the given timezone + + >>> from datetime import datetime, timedelta + >>> utc = timezone('UTC') + >>> eastern = timezone('US/Eastern') + >>> eastern.zone + 'US/Eastern' + >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) + >>> loc_dt = utc_dt.astimezone(eastern) + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> loc_dt.strftime(fmt) + '2002-10-27 01:00:00 EST (-0500)' + >>> (loc_dt - timedelta(minutes=10)).strftime(fmt) + '2002-10-27 00:50:00 EST (-0500)' + >>> eastern.normalize(loc_dt - timedelta(minutes=10)).strftime(fmt) + '2002-10-27 01:50:00 EDT (-0400)' + >>> (loc_dt + timedelta(minutes=10)).strftime(fmt) + '2002-10-27 01:10:00 EST (-0500)' + ''' + zone = _munge_zone(zone) + if zone.upper() == 'UTC': + return utc + zone_bits = ['zoneinfo'] + zone.split('/') + + # Load zone's module + module_name = '.'.join(zone_bits) + try: + module = __import__(module_name, globals(), locals()) + except ImportError: + raise KeyError, zone + rv = module + for bit in zone_bits[1:]: + rv = getattr(rv, bit) + + # Return instance from that module + rv = getattr(rv, zone_bits[-1]) + assert type(rv) != type(sys) + return rv + + +def _munge_zone(zone): + ''' Convert a zone into a string suitable for use as a Python identifier + ''' + return zone.replace('+', '_plus_').replace('-', '_minus_') + + +ZERO = datetime.timedelta(0) +HOUR = datetime.timedelta(hours=1) + + +class UTC(datetime.tzinfo): + """UTC + + Identical to the reference UTC implementation given in Python docs except + that it unpickles using the single module global instance defined beneath + this class declaration. + + Also contains extra attributes and methods to match other pytz tzinfo + instances. + """ + zone = "UTC" + + def utcoffset(self, dt): + return ZERO + + def tzname(self, dt): + return "UTC" + + def dst(self, dt): + return ZERO + + def __reduce__(self): + return _UTC, () + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError, 'Not naive datetime (tzinfo is already set)' + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime''' + if dt.tzinfo is None: + raise ValueError, 'Naive time - no tzinfo set' + return dt.replace(tzinfo=self) + + def __repr__(self): + return "" + + def __str__(self): + return "UTC" + + +UTC = utc = UTC() # UTC is a singleton + + +def _UTC(): + """Factory function for utc unpickling. + + Makes sure that unpickling a utc instance always returns the same + module global. + + These examples belong in the UTC class above, but it is obscured; or in + the README.txt, but we are not depending on Python 2.4 so integrating + the README.txt examples with the unit tests is not trivial. + + >>> import datetime, pickle + >>> dt = datetime.datetime(2005, 3, 1, 14, 13, 21, tzinfo=utc) + >>> naive = dt.replace(tzinfo=None) + >>> p = pickle.dumps(dt, 1) + >>> naive_p = pickle.dumps(naive, 1) + >>> len(p), len(naive_p), len(p) - len(naive_p) + (60, 43, 17) + >>> new = pickle.loads(p) + >>> new == dt + True + >>> new is dt + False + >>> new.tzinfo is dt.tzinfo + True + >>> utc is UTC is timezone('UTC') + True + >>> utc is timezone('GMT') + False + """ + return utc +_UTC.__safe_for_unpickling__ = True + + +def _p(*args): + """Factory function for unpickling pytz tzinfo instances. + + Just a wrapper around tzinfo.unpickler to save a few bytes in each pickle + by shortening the path. + """ + return unpickler(*args) +_p.__safe_for_unpickling__ = True + +_country_timezones_cache = {} + +def country_timezones(iso3166_code): + """Return a list of timezones used in a particular country. + + iso3166_code is the two letter code used to identify the country. + + >>> country_timezones('ch') + ['Europe/Zurich'] + >>> country_timezones('CH') + ['Europe/Zurich'] + >>> country_timezones('XXX') + Traceback (most recent call last): + ... + KeyError: 'XXX' + """ + iso3166_code = iso3166_code.upper() + if not _country_timezones_cache: + try: + from pkg_resources import resource_stream + zone_tab = resource_stream(__name__, 'zone.tab') + except ImportError: + zone_tab = open(os.path.join(os.path.dirname(__file__), 'zone.tab')) + for line in zone_tab: + if line.startswith('#'): + continue + code, coordinates, zone = line.split(None, 4)[:3] + try: + _country_timezones_cache[code].append(zone) + except KeyError: + _country_timezones_cache[code] = [zone] + return _country_timezones_cache[iso3166_code] + +# Time-zone info based solely on fixed offsets + +class _FixedOffset(datetime.tzinfo): + + zone = None # to match the standard pytz API + + def __init__(self, minutes): + if abs(minutes) >= 1440: + raise ValueError("absolute offset is too large", minutes) + self._minutes = minutes + self._offset = datetime.timedelta(minutes=minutes) + + def utcoffset(self, dt): + return self._offset + + def __reduce__(self): + return FixedOffset, (self._minutes, ) + + def dst(self, dt): + return None + + def tzname(self, dt): + return None + + def __repr__(self): + return 'pytz.FixedOffset(%d)' % self._minutes + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError, 'Not naive datetime (tzinfo is already set)' + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime''' + if dt.tzinfo is None: + raise ValueError, 'Naive time - no tzinfo set' + return dt.replace(tzinfo=self) + +def FixedOffset(offset, _tzinfos = {}): + """return a fixed-offset timezone based off a number of minutes. + + >>> one = FixedOffset(-330) + >>> one + pytz.FixedOffset(-330) + >>> one.utcoffset(datetime.datetime.now()) + datetime.timedelta(-1, 66600) + + >>> two = FixedOffset(1380) + >>> two + pytz.FixedOffset(1380) + >>> two.utcoffset(datetime.datetime.now()) + datetime.timedelta(0, 82800) + + The datetime.timedelta must be between the range of -1 and 1 day, + non-inclusive. + + >>> FixedOffset(1440) + Traceback (most recent call last): + ... + ValueError: ('absolute offset is too large', 1440) + + >>> FixedOffset(-1440) + Traceback (most recent call last): + ... + ValueError: ('absolute offset is too large', -1440) + + An offset of 0 is special-cased to return UTC. + + >>> FixedOffset(0) is UTC + True + + There should always be only one instance of a FixedOffset per timedelta. + This should be true for multiple creation calls. + + >>> FixedOffset(-330) is one + True + >>> FixedOffset(1380) is two + True + + It should also be true for pickling. + + >>> import pickle + >>> pickle.loads(pickle.dumps(one)) is one + True + >>> pickle.loads(pickle.dumps(two)) is two + True + + """ + + if offset == 0: + return UTC + + info = _tzinfos.get(offset) + if info is None: + # We haven't seen this one before. we need to save it. + + # Use setdefault to avoid a race condition and make sure we have + # only one + info = _tzinfos.setdefault(offset, _FixedOffset(offset)) + + return info + +FixedOffset.__safe_for_unpickling__ = True + +def _test(): + import doctest, os, sys + sys.path.insert(0, os.pardir) + import pytz + return doctest.testmod(pytz) + +if __name__ == '__main__': + _test() + +common_timezones = \ +['Africa/Abidjan', + 'Africa/Accra', + 'Africa/Addis_Ababa', + 'Africa/Algiers', + 'Africa/Asmera', + 'Africa/Bamako', + 'Africa/Bangui', + 'Africa/Banjul', + 'Africa/Bissau', + 'Africa/Blantyre', + 'Africa/Brazzaville', + 'Africa/Bujumbura', + 'Africa/Cairo', + 'Africa/Casablanca', + 'Africa/Ceuta', + 'Africa/Conakry', + 'Africa/Dakar', + 'Africa/Dar_es_Salaam', + 'Africa/Djibouti', + 'Africa/Douala', + 'Africa/El_Aaiun', + 'Africa/Freetown', + 'Africa/Gaborone', + 'Africa/Harare', + 'Africa/Johannesburg', + 'Africa/Kampala', + 'Africa/Khartoum', + 'Africa/Kigali', + 'Africa/Kinshasa', + 'Africa/Lagos', + 'Africa/Libreville', + 'Africa/Lome', + 'Africa/Luanda', + 'Africa/Lubumbashi', + 'Africa/Lusaka', + 'Africa/Malabo', + 'Africa/Maputo', + 'Africa/Maseru', + 'Africa/Mbabane', + 'Africa/Mogadishu', + 'Africa/Monrovia', + 'Africa/Nairobi', + 'Africa/Ndjamena', + 'Africa/Niamey', + 'Africa/Nouakchott', + 'Africa/Ouagadougou', + 'Africa/Porto-Novo', + 'Africa/Sao_Tome', + 'Africa/Timbuktu', + 'Africa/Tripoli', + 'Africa/Tunis', + 'Africa/Windhoek', + 'America/Adak', + 'America/Anchorage', + 'America/Anguilla', + 'America/Antigua', + 'America/Araguaina', + 'America/Aruba', + 'America/Asuncion', + 'America/Atikokan', + 'America/Atka', + 'America/Bahia', + 'America/Barbados', + 'America/Belem', + 'America/Belize', + 'America/Blanc-Sablon', + 'America/Boa_Vista', + 'America/Bogota', + 'America/Boise', + 'America/Buenos_Aires', + 'America/Cambridge_Bay', + 'America/Campo_Grande', + 'America/Cancun', + 'America/Caracas', + 'America/Catamarca', + 'America/Cayenne', + 'America/Cayman', + 'America/Chicago', + 'America/Chihuahua', + 'America/Coral_Harbour', + 'America/Cordoba', + 'America/Costa_Rica', + 'America/Cuiaba', + 'America/Curacao', + 'America/Danmarkshavn', + 'America/Dawson', + 'America/Dawson_Creek', + 'America/Denver', + 'America/Detroit', + 'America/Dominica', + 'America/Edmonton', + 'America/Eirunepe', + 'America/El_Salvador', + 'America/Ensenada', + 'America/Fort_Wayne', + 'America/Fortaleza', + 'America/Glace_Bay', + 'America/Godthab', + 'America/Goose_Bay', + 'America/Grand_Turk', + 'America/Grenada', + 'America/Guadeloupe', + 'America/Guatemala', + 'America/Guayaquil', + 'America/Guyana', + 'America/Halifax', + 'America/Havana', + 'America/Hermosillo', + 'America/Indianapolis', + 'America/Inuvik', + 'America/Iqaluit', + 'America/Jamaica', + 'America/Jujuy', + 'America/Juneau', + 'America/Knox_IN', + 'America/La_Paz', + 'America/Lima', + 'America/Los_Angeles', + 'America/Louisville', + 'America/Maceio', + 'America/Managua', + 'America/Manaus', + 'America/Martinique', + 'America/Mazatlan', + 'America/Mendoza', + 'America/Menominee', + 'America/Merida', + 'America/Mexico_City', + 'America/Miquelon', + 'America/Moncton', + 'America/Monterrey', + 'America/Montevideo', + 'America/Montreal', + 'America/Montserrat', + 'America/Nassau', + 'America/New_York', + 'America/Nipigon', + 'America/Nome', + 'America/Noronha', + 'America/Panama', + 'America/Pangnirtung', + 'America/Paramaribo', + 'America/Phoenix', + 'America/Port-au-Prince', + 'America/Port_of_Spain', + 'America/Porto_Acre', + 'America/Porto_Velho', + 'America/Puerto_Rico', + 'America/Rainy_River', + 'America/Rankin_Inlet', + 'America/Recife', + 'America/Regina', + 'America/Rio_Branco', + 'America/Rosario', + 'America/Santiago', + 'America/Santo_Domingo', + 'America/Sao_Paulo', + 'America/Scoresbysund', + 'America/Shiprock', + 'America/St_Johns', + 'America/St_Kitts', + 'America/St_Lucia', + 'America/St_Thomas', + 'America/St_Vincent', + 'America/Swift_Current', + 'America/Tegucigalpa', + 'America/Thule', + 'America/Thunder_Bay', + 'America/Tijuana', + 'America/Toronto', + 'America/Tortola', + 'America/Vancouver', + 'America/Virgin', + 'America/Whitehorse', + 'America/Winnipeg', + 'America/Yakutat', + 'America/Yellowknife', + 'Antarctica/Casey', + 'Antarctica/Davis', + 'Antarctica/DumontDUrville', + 'Antarctica/Mawson', + 'Antarctica/McMurdo', + 'Antarctica/Palmer', + 'Antarctica/Rothera', + 'Antarctica/South_Pole', + 'Antarctica/Syowa', + 'Antarctica/Vostok', + 'Arctic/Longyearbyen', + 'Asia/Aden', + 'Asia/Almaty', + 'Asia/Amman', + 'Asia/Anadyr', + 'Asia/Aqtau', + 'Asia/Aqtobe', + 'Asia/Ashgabat', + 'Asia/Ashkhabad', + 'Asia/Baghdad', + 'Asia/Bahrain', + 'Asia/Baku', + 'Asia/Bangkok', + 'Asia/Beirut', + 'Asia/Bishkek', + 'Asia/Brunei', + 'Asia/Calcutta', + 'Asia/Choibalsan', + 'Asia/Chongqing', + 'Asia/Chungking', + 'Asia/Colombo', + 'Asia/Dacca', + 'Asia/Damascus', + 'Asia/Dhaka', + 'Asia/Dili', + 'Asia/Dubai', + 'Asia/Dushanbe', + 'Asia/Gaza', + 'Asia/Harbin', + 'Asia/Hong_Kong', + 'Asia/Hovd', + 'Asia/Irkutsk', + 'Asia/Istanbul', + 'Asia/Jakarta', + 'Asia/Jayapura', + 'Asia/Jerusalem', + 'Asia/Kabul', + 'Asia/Kamchatka', + 'Asia/Karachi', + 'Asia/Kashgar', + 'Asia/Katmandu', + 'Asia/Krasnoyarsk', + 'Asia/Kuala_Lumpur', + 'Asia/Kuching', + 'Asia/Kuwait', + 'Asia/Macao', + 'Asia/Macau', + 'Asia/Magadan', + 'Asia/Makassar', + 'Asia/Manila', + 'Asia/Muscat', + 'Asia/Nicosia', + 'Asia/Novosibirsk', + 'Asia/Omsk', + 'Asia/Oral', + 'Asia/Phnom_Penh', + 'Asia/Pontianak', + 'Asia/Pyongyang', + 'Asia/Qatar', + 'Asia/Qyzylorda', + 'Asia/Rangoon', + 'Asia/Riyadh', + 'Asia/Saigon', + 'Asia/Sakhalin', + 'Asia/Samarkand', + 'Asia/Seoul', + 'Asia/Shanghai', + 'Asia/Singapore', + 'Asia/Taipei', + 'Asia/Tashkent', + 'Asia/Tbilisi', + 'Asia/Tehran', + 'Asia/Tel_Aviv', + 'Asia/Thimbu', + 'Asia/Thimphu', + 'Asia/Tokyo', + 'Asia/Ujung_Pandang', + 'Asia/Ulaanbaatar', + 'Asia/Ulan_Bator', + 'Asia/Urumqi', + 'Asia/Vientiane', + 'Asia/Vladivostok', + 'Asia/Yakutsk', + 'Asia/Yekaterinburg', + 'Asia/Yerevan', + 'Atlantic/Azores', + 'Atlantic/Bermuda', + 'Atlantic/Canary', + 'Atlantic/Cape_Verde', + 'Atlantic/Faeroe', + 'Atlantic/Jan_Mayen', + 'Atlantic/Madeira', + 'Atlantic/Reykjavik', + 'Atlantic/South_Georgia', + 'Atlantic/St_Helena', + 'Atlantic/Stanley', + 'Australia/ACT', + 'Australia/Adelaide', + 'Australia/Brisbane', + 'Australia/Broken_Hill', + 'Australia/Canberra', + 'Australia/Currie', + 'Australia/Darwin', + 'Australia/Hobart', + 'Australia/LHI', + 'Australia/Lindeman', + 'Australia/Lord_Howe', + 'Australia/Melbourne', + 'Australia/NSW', + 'Australia/North', + 'Australia/Perth', + 'Australia/Queensland', + 'Australia/South', + 'Australia/Sydney', + 'Australia/Tasmania', + 'Australia/Victoria', + 'Australia/West', + 'Australia/Yancowinna', + 'Brazil/Acre', + 'Brazil/DeNoronha', + 'Brazil/East', + 'Brazil/West', + 'Canada/Atlantic', + 'Canada/Central', + 'Canada/East-Saskatchewan', + 'Canada/Eastern', + 'Canada/Mountain', + 'Canada/Newfoundland', + 'Canada/Pacific', + 'Canada/Saskatchewan', + 'Canada/Yukon', + 'Chile/Continental', + 'Chile/EasterIsland', + 'Europe/Amsterdam', + 'Europe/Andorra', + 'Europe/Athens', + 'Europe/Belfast', + 'Europe/Belgrade', + 'Europe/Berlin', + 'Europe/Bratislava', + 'Europe/Brussels', + 'Europe/Bucharest', + 'Europe/Budapest', + 'Europe/Chisinau', + 'Europe/Copenhagen', + 'Europe/Dublin', + 'Europe/Gibraltar', + 'Europe/Guernsey', + 'Europe/Helsinki', + 'Europe/Isle_of_Man', + 'Europe/Istanbul', + 'Europe/Jersey', + 'Europe/Kaliningrad', + 'Europe/Kiev', + 'Europe/Lisbon', + 'Europe/Ljubljana', + 'Europe/London', + 'Europe/Luxembourg', + 'Europe/Madrid', + 'Europe/Malta', + 'Europe/Mariehamn', + 'Europe/Minsk', + 'Europe/Monaco', + 'Europe/Moscow', + 'Europe/Nicosia', + 'Europe/Oslo', + 'Europe/Paris', + 'Europe/Podgorica', + 'Europe/Prague', + 'Europe/Riga', + 'Europe/Rome', + 'Europe/Samara', + 'Europe/San_Marino', + 'Europe/Sarajevo', + 'Europe/Simferopol', + 'Europe/Skopje', + 'Europe/Sofia', + 'Europe/Stockholm', + 'Europe/Tallinn', + 'Europe/Tirane', + 'Europe/Tiraspol', + 'Europe/Uzhgorod', + 'Europe/Vaduz', + 'Europe/Vatican', + 'Europe/Vienna', + 'Europe/Vilnius', + 'Europe/Volgograd', + 'Europe/Warsaw', + 'Europe/Zagreb', + 'Europe/Zaporozhye', + 'Europe/Zurich', + 'GMT', + 'Indian/Antananarivo', + 'Indian/Chagos', + 'Indian/Christmas', + 'Indian/Cocos', + 'Indian/Comoro', + 'Indian/Kerguelen', + 'Indian/Mahe', + 'Indian/Maldives', + 'Indian/Mauritius', + 'Indian/Mayotte', + 'Indian/Reunion', + 'Mexico/BajaNorte', + 'Mexico/BajaSur', + 'Mexico/General', + 'Pacific/Apia', + 'Pacific/Auckland', + 'Pacific/Chatham', + 'Pacific/Easter', + 'Pacific/Efate', + 'Pacific/Enderbury', + 'Pacific/Fakaofo', + 'Pacific/Fiji', + 'Pacific/Funafuti', + 'Pacific/Galapagos', + 'Pacific/Gambier', + 'Pacific/Guadalcanal', + 'Pacific/Guam', + 'Pacific/Honolulu', + 'Pacific/Johnston', + 'Pacific/Kiritimati', + 'Pacific/Kosrae', + 'Pacific/Kwajalein', + 'Pacific/Majuro', + 'Pacific/Marquesas', + 'Pacific/Midway', + 'Pacific/Nauru', + 'Pacific/Niue', + 'Pacific/Norfolk', + 'Pacific/Noumea', + 'Pacific/Pago_Pago', + 'Pacific/Palau', + 'Pacific/Pitcairn', + 'Pacific/Ponape', + 'Pacific/Port_Moresby', + 'Pacific/Rarotonga', + 'Pacific/Saipan', + 'Pacific/Samoa', + 'Pacific/Tahiti', + 'Pacific/Tarawa', + 'Pacific/Tongatapu', + 'Pacific/Truk', + 'Pacific/Wake', + 'Pacific/Wallis', + 'Pacific/Yap', + 'US/Alaska', + 'US/Aleutian', + 'US/Arizona', + 'US/Central', + 'US/East-Indiana', + 'US/Eastern', + 'US/Hawaii', + 'US/Indiana-Starke', + 'US/Michigan', + 'US/Mountain', + 'US/Pacific', + 'US/Pacific-New', + 'US/Samoa', + 'UTC'] + +all_timezones = \ +['Africa/Abidjan', + 'Africa/Accra', + 'Africa/Addis_Ababa', + 'Africa/Algiers', + 'Africa/Asmera', + 'Africa/Bamako', + 'Africa/Bangui', + 'Africa/Banjul', + 'Africa/Bissau', + 'Africa/Blantyre', + 'Africa/Brazzaville', + 'Africa/Bujumbura', + 'Africa/Cairo', + 'Africa/Casablanca', + 'Africa/Ceuta', + 'Africa/Conakry', + 'Africa/Dakar', + 'Africa/Dar_es_Salaam', + 'Africa/Djibouti', + 'Africa/Douala', + 'Africa/El_Aaiun', + 'Africa/Freetown', + 'Africa/Gaborone', + 'Africa/Harare', + 'Africa/Johannesburg', + 'Africa/Kampala', + 'Africa/Khartoum', + 'Africa/Kigali', + 'Africa/Kinshasa', + 'Africa/Lagos', + 'Africa/Libreville', + 'Africa/Lome', + 'Africa/Luanda', + 'Africa/Lubumbashi', + 'Africa/Lusaka', + 'Africa/Malabo', + 'Africa/Maputo', + 'Africa/Maseru', + 'Africa/Mbabane', + 'Africa/Mogadishu', + 'Africa/Monrovia', + 'Africa/Nairobi', + 'Africa/Ndjamena', + 'Africa/Niamey', + 'Africa/Nouakchott', + 'Africa/Ouagadougou', + 'Africa/Porto-Novo', + 'Africa/Sao_Tome', + 'Africa/Timbuktu', + 'Africa/Tripoli', + 'Africa/Tunis', + 'Africa/Windhoek', + 'America/Adak', + 'America/Anchorage', + 'America/Anguilla', + 'America/Antigua', + 'America/Araguaina', + 'America/Argentina/Buenos_Aires', + 'America/Argentina/Catamarca', + 'America/Argentina/ComodRivadavia', + 'America/Argentina/Cordoba', + 'America/Argentina/Jujuy', + 'America/Argentina/La_Rioja', + 'America/Argentina/Mendoza', + 'America/Argentina/Rio_Gallegos', + 'America/Argentina/San_Juan', + 'America/Argentina/Tucuman', + 'America/Argentina/Ushuaia', + 'America/Aruba', + 'America/Asuncion', + 'America/Atikokan', + 'America/Atka', + 'America/Bahia', + 'America/Barbados', + 'America/Belem', + 'America/Belize', + 'America/Blanc-Sablon', + 'America/Boa_Vista', + 'America/Bogota', + 'America/Boise', + 'America/Buenos_Aires', + 'America/Cambridge_Bay', + 'America/Campo_Grande', + 'America/Cancun', + 'America/Caracas', + 'America/Catamarca', + 'America/Cayenne', + 'America/Cayman', + 'America/Chicago', + 'America/Chihuahua', + 'America/Coral_Harbour', + 'America/Cordoba', + 'America/Costa_Rica', + 'America/Cuiaba', + 'America/Curacao', + 'America/Danmarkshavn', + 'America/Dawson', + 'America/Dawson_Creek', + 'America/Denver', + 'America/Detroit', + 'America/Dominica', + 'America/Edmonton', + 'America/Eirunepe', + 'America/El_Salvador', + 'America/Ensenada', + 'America/Fort_Wayne', + 'America/Fortaleza', + 'America/Glace_Bay', + 'America/Godthab', + 'America/Goose_Bay', + 'America/Grand_Turk', + 'America/Grenada', + 'America/Guadeloupe', + 'America/Guatemala', + 'America/Guayaquil', + 'America/Guyana', + 'America/Halifax', + 'America/Havana', + 'America/Hermosillo', + 'America/Indiana/Indianapolis', + 'America/Indiana/Knox', + 'America/Indiana/Marengo', + 'America/Indiana/Petersburg', + 'America/Indiana/Vevay', + 'America/Indiana/Vincennes', + 'America/Indianapolis', + 'America/Inuvik', + 'America/Iqaluit', + 'America/Jamaica', + 'America/Jujuy', + 'America/Juneau', + 'America/Kentucky/Louisville', + 'America/Kentucky/Monticello', + 'America/Knox_IN', + 'America/La_Paz', + 'America/Lima', + 'America/Los_Angeles', + 'America/Louisville', + 'America/Maceio', + 'America/Managua', + 'America/Manaus', + 'America/Martinique', + 'America/Mazatlan', + 'America/Mendoza', + 'America/Menominee', + 'America/Merida', + 'America/Mexico_City', + 'America/Miquelon', + 'America/Moncton', + 'America/Monterrey', + 'America/Montevideo', + 'America/Montreal', + 'America/Montserrat', + 'America/Nassau', + 'America/New_York', + 'America/Nipigon', + 'America/Nome', + 'America/Noronha', + 'America/North_Dakota/Center', + 'America/North_Dakota/New_Salem', + 'America/Panama', + 'America/Pangnirtung', + 'America/Paramaribo', + 'America/Phoenix', + 'America/Port-au-Prince', + 'America/Port_of_Spain', + 'America/Porto_Acre', + 'America/Porto_Velho', + 'America/Puerto_Rico', + 'America/Rainy_River', + 'America/Rankin_Inlet', + 'America/Recife', + 'America/Regina', + 'America/Rio_Branco', + 'America/Rosario', + 'America/Santiago', + 'America/Santo_Domingo', + 'America/Sao_Paulo', + 'America/Scoresbysund', + 'America/Shiprock', + 'America/St_Johns', + 'America/St_Kitts', + 'America/St_Lucia', + 'America/St_Thomas', + 'America/St_Vincent', + 'America/Swift_Current', + 'America/Tegucigalpa', + 'America/Thule', + 'America/Thunder_Bay', + 'America/Tijuana', + 'America/Toronto', + 'America/Tortola', + 'America/Vancouver', + 'America/Virgin', + 'America/Whitehorse', + 'America/Winnipeg', + 'America/Yakutat', + 'America/Yellowknife', + 'Antarctica/Casey', + 'Antarctica/Davis', + 'Antarctica/DumontDUrville', + 'Antarctica/Mawson', + 'Antarctica/McMurdo', + 'Antarctica/Palmer', + 'Antarctica/Rothera', + 'Antarctica/South_Pole', + 'Antarctica/Syowa', + 'Antarctica/Vostok', + 'Arctic/Longyearbyen', + 'Asia/Aden', + 'Asia/Almaty', + 'Asia/Amman', + 'Asia/Anadyr', + 'Asia/Aqtau', + 'Asia/Aqtobe', + 'Asia/Ashgabat', + 'Asia/Ashkhabad', + 'Asia/Baghdad', + 'Asia/Bahrain', + 'Asia/Baku', + 'Asia/Bangkok', + 'Asia/Beirut', + 'Asia/Bishkek', + 'Asia/Brunei', + 'Asia/Calcutta', + 'Asia/Choibalsan', + 'Asia/Chongqing', + 'Asia/Chungking', + 'Asia/Colombo', + 'Asia/Dacca', + 'Asia/Damascus', + 'Asia/Dhaka', + 'Asia/Dili', + 'Asia/Dubai', + 'Asia/Dushanbe', + 'Asia/Gaza', + 'Asia/Harbin', + 'Asia/Hong_Kong', + 'Asia/Hovd', + 'Asia/Irkutsk', + 'Asia/Istanbul', + 'Asia/Jakarta', + 'Asia/Jayapura', + 'Asia/Jerusalem', + 'Asia/Kabul', + 'Asia/Kamchatka', + 'Asia/Karachi', + 'Asia/Kashgar', + 'Asia/Katmandu', + 'Asia/Krasnoyarsk', + 'Asia/Kuala_Lumpur', + 'Asia/Kuching', + 'Asia/Kuwait', + 'Asia/Macao', + 'Asia/Macau', + 'Asia/Magadan', + 'Asia/Makassar', + 'Asia/Manila', + 'Asia/Muscat', + 'Asia/Nicosia', + 'Asia/Novosibirsk', + 'Asia/Omsk', + 'Asia/Oral', + 'Asia/Phnom_Penh', + 'Asia/Pontianak', + 'Asia/Pyongyang', + 'Asia/Qatar', + 'Asia/Qyzylorda', + 'Asia/Rangoon', + 'Asia/Riyadh', + 'Asia/Saigon', + 'Asia/Sakhalin', + 'Asia/Samarkand', + 'Asia/Seoul', + 'Asia/Shanghai', + 'Asia/Singapore', + 'Asia/Taipei', + 'Asia/Tashkent', + 'Asia/Tbilisi', + 'Asia/Tehran', + 'Asia/Tel_Aviv', + 'Asia/Thimbu', + 'Asia/Thimphu', + 'Asia/Tokyo', + 'Asia/Ujung_Pandang', + 'Asia/Ulaanbaatar', + 'Asia/Ulan_Bator', + 'Asia/Urumqi', + 'Asia/Vientiane', + 'Asia/Vladivostok', + 'Asia/Yakutsk', + 'Asia/Yekaterinburg', + 'Asia/Yerevan', + 'Atlantic/Azores', + 'Atlantic/Bermuda', + 'Atlantic/Canary', + 'Atlantic/Cape_Verde', + 'Atlantic/Faeroe', + 'Atlantic/Jan_Mayen', + 'Atlantic/Madeira', + 'Atlantic/Reykjavik', + 'Atlantic/South_Georgia', + 'Atlantic/St_Helena', + 'Atlantic/Stanley', + 'Australia/ACT', + 'Australia/Adelaide', + 'Australia/Brisbane', + 'Australia/Broken_Hill', + 'Australia/Canberra', + 'Australia/Currie', + 'Australia/Darwin', + 'Australia/Hobart', + 'Australia/LHI', + 'Australia/Lindeman', + 'Australia/Lord_Howe', + 'Australia/Melbourne', + 'Australia/NSW', + 'Australia/North', + 'Australia/Perth', + 'Australia/Queensland', + 'Australia/South', + 'Australia/Sydney', + 'Australia/Tasmania', + 'Australia/Victoria', + 'Australia/West', + 'Australia/Yancowinna', + 'Brazil/Acre', + 'Brazil/DeNoronha', + 'Brazil/East', + 'Brazil/West', + 'CET', + 'CST6CDT', + 'Canada/Atlantic', + 'Canada/Central', + 'Canada/East-Saskatchewan', + 'Canada/Eastern', + 'Canada/Mountain', + 'Canada/Newfoundland', + 'Canada/Pacific', + 'Canada/Saskatchewan', + 'Canada/Yukon', + 'Chile/Continental', + 'Chile/EasterIsland', + 'Cuba', + 'EET', + 'EST', + 'EST5EDT', + 'Egypt', + 'Eire', + 'Etc/GMT', + 'Etc/GMT+0', + 'Etc/GMT+1', + 'Etc/GMT+10', + 'Etc/GMT+11', + 'Etc/GMT+12', + 'Etc/GMT+2', + 'Etc/GMT+3', + 'Etc/GMT+4', + 'Etc/GMT+5', + 'Etc/GMT+6', + 'Etc/GMT+7', + 'Etc/GMT+8', + 'Etc/GMT+9', + 'Etc/GMT-0', + 'Etc/GMT-1', + 'Etc/GMT-10', + 'Etc/GMT-11', + 'Etc/GMT-12', + 'Etc/GMT-13', + 'Etc/GMT-14', + 'Etc/GMT-2', + 'Etc/GMT-3', + 'Etc/GMT-4', + 'Etc/GMT-5', + 'Etc/GMT-6', + 'Etc/GMT-7', + 'Etc/GMT-8', + 'Etc/GMT-9', + 'Etc/GMT0', + 'Etc/Greenwich', + 'Etc/UCT', + 'Etc/UTC', + 'Etc/Universal', + 'Etc/Zulu', + 'Europe/Amsterdam', + 'Europe/Andorra', + 'Europe/Athens', + 'Europe/Belfast', + 'Europe/Belgrade', + 'Europe/Berlin', + 'Europe/Bratislava', + 'Europe/Brussels', + 'Europe/Bucharest', + 'Europe/Budapest', + 'Europe/Chisinau', + 'Europe/Copenhagen', + 'Europe/Dublin', + 'Europe/Gibraltar', + 'Europe/Guernsey', + 'Europe/Helsinki', + 'Europe/Isle_of_Man', + 'Europe/Istanbul', + 'Europe/Jersey', + 'Europe/Kaliningrad', + 'Europe/Kiev', + 'Europe/Lisbon', + 'Europe/Ljubljana', + 'Europe/London', + 'Europe/Luxembourg', + 'Europe/Madrid', + 'Europe/Malta', + 'Europe/Mariehamn', + 'Europe/Minsk', + 'Europe/Monaco', + 'Europe/Moscow', + 'Europe/Nicosia', + 'Europe/Oslo', + 'Europe/Paris', + 'Europe/Podgorica', + 'Europe/Prague', + 'Europe/Riga', + 'Europe/Rome', + 'Europe/Samara', + 'Europe/San_Marino', + 'Europe/Sarajevo', + 'Europe/Simferopol', + 'Europe/Skopje', + 'Europe/Sofia', + 'Europe/Stockholm', + 'Europe/Tallinn', + 'Europe/Tirane', + 'Europe/Tiraspol', + 'Europe/Uzhgorod', + 'Europe/Vaduz', + 'Europe/Vatican', + 'Europe/Vienna', + 'Europe/Vilnius', + 'Europe/Volgograd', + 'Europe/Warsaw', + 'Europe/Zagreb', + 'Europe/Zaporozhye', + 'Europe/Zurich', + 'GB', + 'GB-Eire', + 'GMT', + 'GMT+0', + 'GMT-0', + 'GMT0', + 'Greenwich', + 'HST', + 'Hongkong', + 'Iceland', + 'Indian/Antananarivo', + 'Indian/Chagos', + 'Indian/Christmas', + 'Indian/Cocos', + 'Indian/Comoro', + 'Indian/Kerguelen', + 'Indian/Mahe', + 'Indian/Maldives', + 'Indian/Mauritius', + 'Indian/Mayotte', + 'Indian/Reunion', + 'Iran', + 'Israel', + 'Jamaica', + 'Japan', + 'Kwajalein', + 'Libya', + 'MET', + 'MST', + 'MST7MDT', + 'Mexico/BajaNorte', + 'Mexico/BajaSur', + 'Mexico/General', + 'NZ', + 'NZ-CHAT', + 'Navajo', + 'PRC', + 'PST8PDT', + 'Pacific/Apia', + 'Pacific/Auckland', + 'Pacific/Chatham', + 'Pacific/Easter', + 'Pacific/Efate', + 'Pacific/Enderbury', + 'Pacific/Fakaofo', + 'Pacific/Fiji', + 'Pacific/Funafuti', + 'Pacific/Galapagos', + 'Pacific/Gambier', + 'Pacific/Guadalcanal', + 'Pacific/Guam', + 'Pacific/Honolulu', + 'Pacific/Johnston', + 'Pacific/Kiritimati', + 'Pacific/Kosrae', + 'Pacific/Kwajalein', + 'Pacific/Majuro', + 'Pacific/Marquesas', + 'Pacific/Midway', + 'Pacific/Nauru', + 'Pacific/Niue', + 'Pacific/Norfolk', + 'Pacific/Noumea', + 'Pacific/Pago_Pago', + 'Pacific/Palau', + 'Pacific/Pitcairn', + 'Pacific/Ponape', + 'Pacific/Port_Moresby', + 'Pacific/Rarotonga', + 'Pacific/Saipan', + 'Pacific/Samoa', + 'Pacific/Tahiti', + 'Pacific/Tarawa', + 'Pacific/Tongatapu', + 'Pacific/Truk', + 'Pacific/Wake', + 'Pacific/Wallis', + 'Pacific/Yap', + 'Poland', + 'Portugal', + 'ROC', + 'ROK', + 'Singapore', + 'Turkey', + 'UCT', + 'US/Alaska', + 'US/Aleutian', + 'US/Arizona', + 'US/Central', + 'US/East-Indiana', + 'US/Eastern', + 'US/Hawaii', + 'US/Indiana-Starke', + 'US/Michigan', + 'US/Mountain', + 'US/Pacific', + 'US/Pacific-New', + 'US/Samoa', + 'UTC', + 'Universal', + 'W-SU', + 'WET', + 'Zulu', + 'posixrules'] diff --git a/vendor/pytz/locales/pytz.pot b/vendor/pytz/locales/pytz.pot new file mode 100644 index 00000000..fc06204a --- /dev/null +++ b/vendor/pytz/locales/pytz.pot @@ -0,0 +1,1645 @@ +msgid "" +msgstr "" +"Project-Id-Version: pytz 2006p\n" +"POT-Creation-Date: 2006-12-08 05:03+UTC\n" +"Content-Type: text/plain; charset=UTF-8\n" + + +msgid "Africa/Abidjan" +msgstr "" + +msgid "Africa/Accra" +msgstr "" + +msgid "Africa/Addis_Ababa" +msgstr "" + +msgid "Africa/Algiers" +msgstr "" + +msgid "Africa/Asmera" +msgstr "" + +msgid "Africa/Bamako" +msgstr "" + +msgid "Africa/Bangui" +msgstr "" + +msgid "Africa/Banjul" +msgstr "" + +msgid "Africa/Bissau" +msgstr "" + +msgid "Africa/Blantyre" +msgstr "" + +msgid "Africa/Brazzaville" +msgstr "" + +msgid "Africa/Bujumbura" +msgstr "" + +msgid "Africa/Cairo" +msgstr "" + +msgid "Africa/Casablanca" +msgstr "" + +msgid "Africa/Ceuta" +msgstr "" + +msgid "Africa/Conakry" +msgstr "" + +msgid "Africa/Dakar" +msgstr "" + +msgid "Africa/Dar_es_Salaam" +msgstr "" + +msgid "Africa/Djibouti" +msgstr "" + +msgid "Africa/Douala" +msgstr "" + +msgid "Africa/El_Aaiun" +msgstr "" + +msgid "Africa/Freetown" +msgstr "" + +msgid "Africa/Gaborone" +msgstr "" + +msgid "Africa/Harare" +msgstr "" + +msgid "Africa/Johannesburg" +msgstr "" + +msgid "Africa/Kampala" +msgstr "" + +msgid "Africa/Khartoum" +msgstr "" + +msgid "Africa/Kigali" +msgstr "" + +msgid "Africa/Kinshasa" +msgstr "" + +msgid "Africa/Lagos" +msgstr "" + +msgid "Africa/Libreville" +msgstr "" + +msgid "Africa/Lome" +msgstr "" + +msgid "Africa/Luanda" +msgstr "" + +msgid "Africa/Lubumbashi" +msgstr "" + +msgid "Africa/Lusaka" +msgstr "" + +msgid "Africa/Malabo" +msgstr "" + +msgid "Africa/Maputo" +msgstr "" + +msgid "Africa/Maseru" +msgstr "" + +msgid "Africa/Mbabane" +msgstr "" + +msgid "Africa/Mogadishu" +msgstr "" + +msgid "Africa/Monrovia" +msgstr "" + +msgid "Africa/Nairobi" +msgstr "" + +msgid "Africa/Ndjamena" +msgstr "" + +msgid "Africa/Niamey" +msgstr "" + +msgid "Africa/Nouakchott" +msgstr "" + +msgid "Africa/Ouagadougou" +msgstr "" + +msgid "Africa/Porto-Novo" +msgstr "" + +msgid "Africa/Sao_Tome" +msgstr "" + +msgid "Africa/Timbuktu" +msgstr "" + +msgid "Africa/Tripoli" +msgstr "" + +msgid "Africa/Tunis" +msgstr "" + +msgid "Africa/Windhoek" +msgstr "" + +msgid "America/Adak" +msgstr "" + +msgid "America/Anchorage" +msgstr "" + +msgid "America/Anguilla" +msgstr "" + +msgid "America/Antigua" +msgstr "" + +msgid "America/Araguaina" +msgstr "" + +msgid "America/Argentina/Buenos_Aires" +msgstr "" + +msgid "America/Argentina/Catamarca" +msgstr "" + +msgid "America/Argentina/ComodRivadavia" +msgstr "" + +msgid "America/Argentina/Cordoba" +msgstr "" + +msgid "America/Argentina/Jujuy" +msgstr "" + +msgid "America/Argentina/La_Rioja" +msgstr "" + +msgid "America/Argentina/Mendoza" +msgstr "" + +msgid "America/Argentina/Rio_Gallegos" +msgstr "" + +msgid "America/Argentina/San_Juan" +msgstr "" + +msgid "America/Argentina/Tucuman" +msgstr "" + +msgid "America/Argentina/Ushuaia" +msgstr "" + +msgid "America/Aruba" +msgstr "" + +msgid "America/Asuncion" +msgstr "" + +msgid "America/Atikokan" +msgstr "" + +msgid "America/Atka" +msgstr "" + +msgid "America/Bahia" +msgstr "" + +msgid "America/Barbados" +msgstr "" + +msgid "America/Belem" +msgstr "" + +msgid "America/Belize" +msgstr "" + +msgid "America/Blanc-Sablon" +msgstr "" + +msgid "America/Boa_Vista" +msgstr "" + +msgid "America/Bogota" +msgstr "" + +msgid "America/Boise" +msgstr "" + +msgid "America/Buenos_Aires" +msgstr "" + +msgid "America/Cambridge_Bay" +msgstr "" + +msgid "America/Campo_Grande" +msgstr "" + +msgid "America/Cancun" +msgstr "" + +msgid "America/Caracas" +msgstr "" + +msgid "America/Catamarca" +msgstr "" + +msgid "America/Cayenne" +msgstr "" + +msgid "America/Cayman" +msgstr "" + +msgid "America/Chicago" +msgstr "" + +msgid "America/Chihuahua" +msgstr "" + +msgid "America/Coral_Harbour" +msgstr "" + +msgid "America/Cordoba" +msgstr "" + +msgid "America/Costa_Rica" +msgstr "" + +msgid "America/Cuiaba" +msgstr "" + +msgid "America/Curacao" +msgstr "" + +msgid "America/Danmarkshavn" +msgstr "" + +msgid "America/Dawson" +msgstr "" + +msgid "America/Dawson_Creek" +msgstr "" + +msgid "America/Denver" +msgstr "" + +msgid "America/Detroit" +msgstr "" + +msgid "America/Dominica" +msgstr "" + +msgid "America/Edmonton" +msgstr "" + +msgid "America/Eirunepe" +msgstr "" + +msgid "America/El_Salvador" +msgstr "" + +msgid "America/Ensenada" +msgstr "" + +msgid "America/Fort_Wayne" +msgstr "" + +msgid "America/Fortaleza" +msgstr "" + +msgid "America/Glace_Bay" +msgstr "" + +msgid "America/Godthab" +msgstr "" + +msgid "America/Goose_Bay" +msgstr "" + +msgid "America/Grand_Turk" +msgstr "" + +msgid "America/Grenada" +msgstr "" + +msgid "America/Guadeloupe" +msgstr "" + +msgid "America/Guatemala" +msgstr "" + +msgid "America/Guayaquil" +msgstr "" + +msgid "America/Guyana" +msgstr "" + +msgid "America/Halifax" +msgstr "" + +msgid "America/Havana" +msgstr "" + +msgid "America/Hermosillo" +msgstr "" + +msgid "America/Indiana/Indianapolis" +msgstr "" + +msgid "America/Indiana/Knox" +msgstr "" + +msgid "America/Indiana/Marengo" +msgstr "" + +msgid "America/Indiana/Petersburg" +msgstr "" + +msgid "America/Indiana/Vevay" +msgstr "" + +msgid "America/Indiana/Vincennes" +msgstr "" + +msgid "America/Indianapolis" +msgstr "" + +msgid "America/Inuvik" +msgstr "" + +msgid "America/Iqaluit" +msgstr "" + +msgid "America/Jamaica" +msgstr "" + +msgid "America/Jujuy" +msgstr "" + +msgid "America/Juneau" +msgstr "" + +msgid "America/Kentucky/Louisville" +msgstr "" + +msgid "America/Kentucky/Monticello" +msgstr "" + +msgid "America/Knox_IN" +msgstr "" + +msgid "America/La_Paz" +msgstr "" + +msgid "America/Lima" +msgstr "" + +msgid "America/Los_Angeles" +msgstr "" + +msgid "America/Louisville" +msgstr "" + +msgid "America/Maceio" +msgstr "" + +msgid "America/Managua" +msgstr "" + +msgid "America/Manaus" +msgstr "" + +msgid "America/Martinique" +msgstr "" + +msgid "America/Mazatlan" +msgstr "" + +msgid "America/Mendoza" +msgstr "" + +msgid "America/Menominee" +msgstr "" + +msgid "America/Merida" +msgstr "" + +msgid "America/Mexico_City" +msgstr "" + +msgid "America/Miquelon" +msgstr "" + +msgid "America/Moncton" +msgstr "" + +msgid "America/Monterrey" +msgstr "" + +msgid "America/Montevideo" +msgstr "" + +msgid "America/Montreal" +msgstr "" + +msgid "America/Montserrat" +msgstr "" + +msgid "America/Nassau" +msgstr "" + +msgid "America/New_York" +msgstr "" + +msgid "America/Nipigon" +msgstr "" + +msgid "America/Nome" +msgstr "" + +msgid "America/Noronha" +msgstr "" + +msgid "America/North_Dakota/Center" +msgstr "" + +msgid "America/North_Dakota/New_Salem" +msgstr "" + +msgid "America/Panama" +msgstr "" + +msgid "America/Pangnirtung" +msgstr "" + +msgid "America/Paramaribo" +msgstr "" + +msgid "America/Phoenix" +msgstr "" + +msgid "America/Port-au-Prince" +msgstr "" + +msgid "America/Port_of_Spain" +msgstr "" + +msgid "America/Porto_Acre" +msgstr "" + +msgid "America/Porto_Velho" +msgstr "" + +msgid "America/Puerto_Rico" +msgstr "" + +msgid "America/Rainy_River" +msgstr "" + +msgid "America/Rankin_Inlet" +msgstr "" + +msgid "America/Recife" +msgstr "" + +msgid "America/Regina" +msgstr "" + +msgid "America/Rio_Branco" +msgstr "" + +msgid "America/Rosario" +msgstr "" + +msgid "America/Santiago" +msgstr "" + +msgid "America/Santo_Domingo" +msgstr "" + +msgid "America/Sao_Paulo" +msgstr "" + +msgid "America/Scoresbysund" +msgstr "" + +msgid "America/Shiprock" +msgstr "" + +msgid "America/St_Johns" +msgstr "" + +msgid "America/St_Kitts" +msgstr "" + +msgid "America/St_Lucia" +msgstr "" + +msgid "America/St_Thomas" +msgstr "" + +msgid "America/St_Vincent" +msgstr "" + +msgid "America/Swift_Current" +msgstr "" + +msgid "America/Tegucigalpa" +msgstr "" + +msgid "America/Thule" +msgstr "" + +msgid "America/Thunder_Bay" +msgstr "" + +msgid "America/Tijuana" +msgstr "" + +msgid "America/Toronto" +msgstr "" + +msgid "America/Tortola" +msgstr "" + +msgid "America/Vancouver" +msgstr "" + +msgid "America/Virgin" +msgstr "" + +msgid "America/Whitehorse" +msgstr "" + +msgid "America/Winnipeg" +msgstr "" + +msgid "America/Yakutat" +msgstr "" + +msgid "America/Yellowknife" +msgstr "" + +msgid "Antarctica/Casey" +msgstr "" + +msgid "Antarctica/Davis" +msgstr "" + +msgid "Antarctica/DumontDUrville" +msgstr "" + +msgid "Antarctica/Mawson" +msgstr "" + +msgid "Antarctica/McMurdo" +msgstr "" + +msgid "Antarctica/Palmer" +msgstr "" + +msgid "Antarctica/Rothera" +msgstr "" + +msgid "Antarctica/South_Pole" +msgstr "" + +msgid "Antarctica/Syowa" +msgstr "" + +msgid "Antarctica/Vostok" +msgstr "" + +msgid "Arctic/Longyearbyen" +msgstr "" + +msgid "Asia/Aden" +msgstr "" + +msgid "Asia/Almaty" +msgstr "" + +msgid "Asia/Amman" +msgstr "" + +msgid "Asia/Anadyr" +msgstr "" + +msgid "Asia/Aqtau" +msgstr "" + +msgid "Asia/Aqtobe" +msgstr "" + +msgid "Asia/Ashgabat" +msgstr "" + +msgid "Asia/Ashkhabad" +msgstr "" + +msgid "Asia/Baghdad" +msgstr "" + +msgid "Asia/Bahrain" +msgstr "" + +msgid "Asia/Baku" +msgstr "" + +msgid "Asia/Bangkok" +msgstr "" + +msgid "Asia/Beirut" +msgstr "" + +msgid "Asia/Bishkek" +msgstr "" + +msgid "Asia/Brunei" +msgstr "" + +msgid "Asia/Calcutta" +msgstr "" + +msgid "Asia/Choibalsan" +msgstr "" + +msgid "Asia/Chongqing" +msgstr "" + +msgid "Asia/Chungking" +msgstr "" + +msgid "Asia/Colombo" +msgstr "" + +msgid "Asia/Dacca" +msgstr "" + +msgid "Asia/Damascus" +msgstr "" + +msgid "Asia/Dhaka" +msgstr "" + +msgid "Asia/Dili" +msgstr "" + +msgid "Asia/Dubai" +msgstr "" + +msgid "Asia/Dushanbe" +msgstr "" + +msgid "Asia/Gaza" +msgstr "" + +msgid "Asia/Harbin" +msgstr "" + +msgid "Asia/Hong_Kong" +msgstr "" + +msgid "Asia/Hovd" +msgstr "" + +msgid "Asia/Irkutsk" +msgstr "" + +msgid "Asia/Istanbul" +msgstr "" + +msgid "Asia/Jakarta" +msgstr "" + +msgid "Asia/Jayapura" +msgstr "" + +msgid "Asia/Jerusalem" +msgstr "" + +msgid "Asia/Kabul" +msgstr "" + +msgid "Asia/Kamchatka" +msgstr "" + +msgid "Asia/Karachi" +msgstr "" + +msgid "Asia/Kashgar" +msgstr "" + +msgid "Asia/Katmandu" +msgstr "" + +msgid "Asia/Krasnoyarsk" +msgstr "" + +msgid "Asia/Kuala_Lumpur" +msgstr "" + +msgid "Asia/Kuching" +msgstr "" + +msgid "Asia/Kuwait" +msgstr "" + +msgid "Asia/Macao" +msgstr "" + +msgid "Asia/Macau" +msgstr "" + +msgid "Asia/Magadan" +msgstr "" + +msgid "Asia/Makassar" +msgstr "" + +msgid "Asia/Manila" +msgstr "" + +msgid "Asia/Muscat" +msgstr "" + +msgid "Asia/Nicosia" +msgstr "" + +msgid "Asia/Novosibirsk" +msgstr "" + +msgid "Asia/Omsk" +msgstr "" + +msgid "Asia/Oral" +msgstr "" + +msgid "Asia/Phnom_Penh" +msgstr "" + +msgid "Asia/Pontianak" +msgstr "" + +msgid "Asia/Pyongyang" +msgstr "" + +msgid "Asia/Qatar" +msgstr "" + +msgid "Asia/Qyzylorda" +msgstr "" + +msgid "Asia/Rangoon" +msgstr "" + +msgid "Asia/Riyadh" +msgstr "" + +msgid "Asia/Saigon" +msgstr "" + +msgid "Asia/Sakhalin" +msgstr "" + +msgid "Asia/Samarkand" +msgstr "" + +msgid "Asia/Seoul" +msgstr "" + +msgid "Asia/Shanghai" +msgstr "" + +msgid "Asia/Singapore" +msgstr "" + +msgid "Asia/Taipei" +msgstr "" + +msgid "Asia/Tashkent" +msgstr "" + +msgid "Asia/Tbilisi" +msgstr "" + +msgid "Asia/Tehran" +msgstr "" + +msgid "Asia/Tel_Aviv" +msgstr "" + +msgid "Asia/Thimbu" +msgstr "" + +msgid "Asia/Thimphu" +msgstr "" + +msgid "Asia/Tokyo" +msgstr "" + +msgid "Asia/Ujung_Pandang" +msgstr "" + +msgid "Asia/Ulaanbaatar" +msgstr "" + +msgid "Asia/Ulan_Bator" +msgstr "" + +msgid "Asia/Urumqi" +msgstr "" + +msgid "Asia/Vientiane" +msgstr "" + +msgid "Asia/Vladivostok" +msgstr "" + +msgid "Asia/Yakutsk" +msgstr "" + +msgid "Asia/Yekaterinburg" +msgstr "" + +msgid "Asia/Yerevan" +msgstr "" + +msgid "Atlantic/Azores" +msgstr "" + +msgid "Atlantic/Bermuda" +msgstr "" + +msgid "Atlantic/Canary" +msgstr "" + +msgid "Atlantic/Cape_Verde" +msgstr "" + +msgid "Atlantic/Faeroe" +msgstr "" + +msgid "Atlantic/Jan_Mayen" +msgstr "" + +msgid "Atlantic/Madeira" +msgstr "" + +msgid "Atlantic/Reykjavik" +msgstr "" + +msgid "Atlantic/South_Georgia" +msgstr "" + +msgid "Atlantic/St_Helena" +msgstr "" + +msgid "Atlantic/Stanley" +msgstr "" + +msgid "Australia/ACT" +msgstr "" + +msgid "Australia/Adelaide" +msgstr "" + +msgid "Australia/Brisbane" +msgstr "" + +msgid "Australia/Broken_Hill" +msgstr "" + +msgid "Australia/Canberra" +msgstr "" + +msgid "Australia/Currie" +msgstr "" + +msgid "Australia/Darwin" +msgstr "" + +msgid "Australia/Hobart" +msgstr "" + +msgid "Australia/LHI" +msgstr "" + +msgid "Australia/Lindeman" +msgstr "" + +msgid "Australia/Lord_Howe" +msgstr "" + +msgid "Australia/Melbourne" +msgstr "" + +msgid "Australia/NSW" +msgstr "" + +msgid "Australia/North" +msgstr "" + +msgid "Australia/Perth" +msgstr "" + +msgid "Australia/Queensland" +msgstr "" + +msgid "Australia/South" +msgstr "" + +msgid "Australia/Sydney" +msgstr "" + +msgid "Australia/Tasmania" +msgstr "" + +msgid "Australia/Victoria" +msgstr "" + +msgid "Australia/West" +msgstr "" + +msgid "Australia/Yancowinna" +msgstr "" + +msgid "Brazil/Acre" +msgstr "" + +msgid "Brazil/DeNoronha" +msgstr "" + +msgid "Brazil/East" +msgstr "" + +msgid "Brazil/West" +msgstr "" + +msgid "CET" +msgstr "" + +msgid "CST6CDT" +msgstr "" + +msgid "Canada/Atlantic" +msgstr "" + +msgid "Canada/Central" +msgstr "" + +msgid "Canada/East-Saskatchewan" +msgstr "" + +msgid "Canada/Eastern" +msgstr "" + +msgid "Canada/Mountain" +msgstr "" + +msgid "Canada/Newfoundland" +msgstr "" + +msgid "Canada/Pacific" +msgstr "" + +msgid "Canada/Saskatchewan" +msgstr "" + +msgid "Canada/Yukon" +msgstr "" + +msgid "Chile/Continental" +msgstr "" + +msgid "Chile/EasterIsland" +msgstr "" + +msgid "Cuba" +msgstr "" + +msgid "EET" +msgstr "" + +msgid "EST" +msgstr "" + +msgid "EST5EDT" +msgstr "" + +msgid "Egypt" +msgstr "" + +msgid "Eire" +msgstr "" + +msgid "Etc/GMT" +msgstr "" + +msgid "Etc/GMT+0" +msgstr "" + +msgid "Etc/GMT+1" +msgstr "" + +msgid "Etc/GMT+10" +msgstr "" + +msgid "Etc/GMT+11" +msgstr "" + +msgid "Etc/GMT+12" +msgstr "" + +msgid "Etc/GMT+2" +msgstr "" + +msgid "Etc/GMT+3" +msgstr "" + +msgid "Etc/GMT+4" +msgstr "" + +msgid "Etc/GMT+5" +msgstr "" + +msgid "Etc/GMT+6" +msgstr "" + +msgid "Etc/GMT+7" +msgstr "" + +msgid "Etc/GMT+8" +msgstr "" + +msgid "Etc/GMT+9" +msgstr "" + +msgid "Etc/GMT-0" +msgstr "" + +msgid "Etc/GMT-1" +msgstr "" + +msgid "Etc/GMT-10" +msgstr "" + +msgid "Etc/GMT-11" +msgstr "" + +msgid "Etc/GMT-12" +msgstr "" + +msgid "Etc/GMT-13" +msgstr "" + +msgid "Etc/GMT-14" +msgstr "" + +msgid "Etc/GMT-2" +msgstr "" + +msgid "Etc/GMT-3" +msgstr "" + +msgid "Etc/GMT-4" +msgstr "" + +msgid "Etc/GMT-5" +msgstr "" + +msgid "Etc/GMT-6" +msgstr "" + +msgid "Etc/GMT-7" +msgstr "" + +msgid "Etc/GMT-8" +msgstr "" + +msgid "Etc/GMT-9" +msgstr "" + +msgid "Etc/GMT0" +msgstr "" + +msgid "Etc/Greenwich" +msgstr "" + +msgid "Etc/UCT" +msgstr "" + +msgid "Etc/UTC" +msgstr "" + +msgid "Etc/Universal" +msgstr "" + +msgid "Etc/Zulu" +msgstr "" + +msgid "Europe/Amsterdam" +msgstr "" + +msgid "Europe/Andorra" +msgstr "" + +msgid "Europe/Athens" +msgstr "" + +msgid "Europe/Belfast" +msgstr "" + +msgid "Europe/Belgrade" +msgstr "" + +msgid "Europe/Berlin" +msgstr "" + +msgid "Europe/Bratislava" +msgstr "" + +msgid "Europe/Brussels" +msgstr "" + +msgid "Europe/Bucharest" +msgstr "" + +msgid "Europe/Budapest" +msgstr "" + +msgid "Europe/Chisinau" +msgstr "" + +msgid "Europe/Copenhagen" +msgstr "" + +msgid "Europe/Dublin" +msgstr "" + +msgid "Europe/Gibraltar" +msgstr "" + +msgid "Europe/Guernsey" +msgstr "" + +msgid "Europe/Helsinki" +msgstr "" + +msgid "Europe/Isle_of_Man" +msgstr "" + +msgid "Europe/Istanbul" +msgstr "" + +msgid "Europe/Jersey" +msgstr "" + +msgid "Europe/Kaliningrad" +msgstr "" + +msgid "Europe/Kiev" +msgstr "" + +msgid "Europe/Lisbon" +msgstr "" + +msgid "Europe/Ljubljana" +msgstr "" + +msgid "Europe/London" +msgstr "" + +msgid "Europe/Luxembourg" +msgstr "" + +msgid "Europe/Madrid" +msgstr "" + +msgid "Europe/Malta" +msgstr "" + +msgid "Europe/Mariehamn" +msgstr "" + +msgid "Europe/Minsk" +msgstr "" + +msgid "Europe/Monaco" +msgstr "" + +msgid "Europe/Moscow" +msgstr "" + +msgid "Europe/Nicosia" +msgstr "" + +msgid "Europe/Oslo" +msgstr "" + +msgid "Europe/Paris" +msgstr "" + +msgid "Europe/Podgorica" +msgstr "" + +msgid "Europe/Prague" +msgstr "" + +msgid "Europe/Riga" +msgstr "" + +msgid "Europe/Rome" +msgstr "" + +msgid "Europe/Samara" +msgstr "" + +msgid "Europe/San_Marino" +msgstr "" + +msgid "Europe/Sarajevo" +msgstr "" + +msgid "Europe/Simferopol" +msgstr "" + +msgid "Europe/Skopje" +msgstr "" + +msgid "Europe/Sofia" +msgstr "" + +msgid "Europe/Stockholm" +msgstr "" + +msgid "Europe/Tallinn" +msgstr "" + +msgid "Europe/Tirane" +msgstr "" + +msgid "Europe/Tiraspol" +msgstr "" + +msgid "Europe/Uzhgorod" +msgstr "" + +msgid "Europe/Vaduz" +msgstr "" + +msgid "Europe/Vatican" +msgstr "" + +msgid "Europe/Vienna" +msgstr "" + +msgid "Europe/Vilnius" +msgstr "" + +msgid "Europe/Volgograd" +msgstr "" + +msgid "Europe/Warsaw" +msgstr "" + +msgid "Europe/Zagreb" +msgstr "" + +msgid "Europe/Zaporozhye" +msgstr "" + +msgid "Europe/Zurich" +msgstr "" + +msgid "GB" +msgstr "" + +msgid "GB-Eire" +msgstr "" + +msgid "GMT" +msgstr "" + +msgid "GMT+0" +msgstr "" + +msgid "GMT-0" +msgstr "" + +msgid "GMT0" +msgstr "" + +msgid "Greenwich" +msgstr "" + +msgid "HST" +msgstr "" + +msgid "Hongkong" +msgstr "" + +msgid "Iceland" +msgstr "" + +msgid "Indian/Antananarivo" +msgstr "" + +msgid "Indian/Chagos" +msgstr "" + +msgid "Indian/Christmas" +msgstr "" + +msgid "Indian/Cocos" +msgstr "" + +msgid "Indian/Comoro" +msgstr "" + +msgid "Indian/Kerguelen" +msgstr "" + +msgid "Indian/Mahe" +msgstr "" + +msgid "Indian/Maldives" +msgstr "" + +msgid "Indian/Mauritius" +msgstr "" + +msgid "Indian/Mayotte" +msgstr "" + +msgid "Indian/Reunion" +msgstr "" + +msgid "Iran" +msgstr "" + +msgid "Israel" +msgstr "" + +msgid "Jamaica" +msgstr "" + +msgid "Japan" +msgstr "" + +msgid "Kwajalein" +msgstr "" + +msgid "Libya" +msgstr "" + +msgid "MET" +msgstr "" + +msgid "MST" +msgstr "" + +msgid "MST7MDT" +msgstr "" + +msgid "Mexico/BajaNorte" +msgstr "" + +msgid "Mexico/BajaSur" +msgstr "" + +msgid "Mexico/General" +msgstr "" + +msgid "NZ" +msgstr "" + +msgid "NZ-CHAT" +msgstr "" + +msgid "Navajo" +msgstr "" + +msgid "PRC" +msgstr "" + +msgid "PST8PDT" +msgstr "" + +msgid "Pacific/Apia" +msgstr "" + +msgid "Pacific/Auckland" +msgstr "" + +msgid "Pacific/Chatham" +msgstr "" + +msgid "Pacific/Easter" +msgstr "" + +msgid "Pacific/Efate" +msgstr "" + +msgid "Pacific/Enderbury" +msgstr "" + +msgid "Pacific/Fakaofo" +msgstr "" + +msgid "Pacific/Fiji" +msgstr "" + +msgid "Pacific/Funafuti" +msgstr "" + +msgid "Pacific/Galapagos" +msgstr "" + +msgid "Pacific/Gambier" +msgstr "" + +msgid "Pacific/Guadalcanal" +msgstr "" + +msgid "Pacific/Guam" +msgstr "" + +msgid "Pacific/Honolulu" +msgstr "" + +msgid "Pacific/Johnston" +msgstr "" + +msgid "Pacific/Kiritimati" +msgstr "" + +msgid "Pacific/Kosrae" +msgstr "" + +msgid "Pacific/Kwajalein" +msgstr "" + +msgid "Pacific/Majuro" +msgstr "" + +msgid "Pacific/Marquesas" +msgstr "" + +msgid "Pacific/Midway" +msgstr "" + +msgid "Pacific/Nauru" +msgstr "" + +msgid "Pacific/Niue" +msgstr "" + +msgid "Pacific/Norfolk" +msgstr "" + +msgid "Pacific/Noumea" +msgstr "" + +msgid "Pacific/Pago_Pago" +msgstr "" + +msgid "Pacific/Palau" +msgstr "" + +msgid "Pacific/Pitcairn" +msgstr "" + +msgid "Pacific/Ponape" +msgstr "" + +msgid "Pacific/Port_Moresby" +msgstr "" + +msgid "Pacific/Rarotonga" +msgstr "" + +msgid "Pacific/Saipan" +msgstr "" + +msgid "Pacific/Samoa" +msgstr "" + +msgid "Pacific/Tahiti" +msgstr "" + +msgid "Pacific/Tarawa" +msgstr "" + +msgid "Pacific/Tongatapu" +msgstr "" + +msgid "Pacific/Truk" +msgstr "" + +msgid "Pacific/Wake" +msgstr "" + +msgid "Pacific/Wallis" +msgstr "" + +msgid "Pacific/Yap" +msgstr "" + +msgid "Poland" +msgstr "" + +msgid "Portugal" +msgstr "" + +msgid "ROC" +msgstr "" + +msgid "ROK" +msgstr "" + +msgid "Singapore" +msgstr "" + +msgid "Turkey" +msgstr "" + +msgid "UCT" +msgstr "" + +msgid "US/Alaska" +msgstr "" + +msgid "US/Aleutian" +msgstr "" + +msgid "US/Arizona" +msgstr "" + +msgid "US/Central" +msgstr "" + +msgid "US/East-Indiana" +msgstr "" + +msgid "US/Eastern" +msgstr "" + +msgid "US/Hawaii" +msgstr "" + +msgid "US/Indiana-Starke" +msgstr "" + +msgid "US/Michigan" +msgstr "" + +msgid "US/Mountain" +msgstr "" + +msgid "US/Pacific" +msgstr "" + +msgid "US/Pacific-New" +msgstr "" + +msgid "US/Samoa" +msgstr "" + +msgid "UTC" +msgstr "" + +msgid "Universal" +msgstr "" + +msgid "W-SU" +msgstr "" + +msgid "WET" +msgstr "" + +msgid "Zulu" +msgstr "" + +msgid "posixrules" +msgstr "" + diff --git a/vendor/pytz/reference.py b/vendor/pytz/reference.py new file mode 100644 index 00000000..3dda13e7 --- /dev/null +++ b/vendor/pytz/reference.py @@ -0,0 +1,127 @@ +''' +Reference tzinfo implementations from the Python docs. +Used for testing against as they are only correct for the years +1987 to 2006. Do not use these for real code. +''' + +from datetime import tzinfo, timedelta, datetime +from pytz import utc, UTC, HOUR, ZERO + +# A class building tzinfo objects for fixed-offset time zones. +# Note that FixedOffset(0, "UTC") is a different way to build a +# UTC tzinfo object. + +class FixedOffset(tzinfo): + """Fixed offset in minutes east from UTC.""" + + def __init__(self, offset, name): + self.__offset = timedelta(minutes = offset) + self.__name = name + + def utcoffset(self, dt): + return self.__offset + + def tzname(self, dt): + return self.__name + + def dst(self, dt): + return ZERO + +# A class capturing the platform's idea of local time. + +import time as _time + +STDOFFSET = timedelta(seconds = -_time.timezone) +if _time.daylight: + DSTOFFSET = timedelta(seconds = -_time.altzone) +else: + DSTOFFSET = STDOFFSET + +DSTDIFF = DSTOFFSET - STDOFFSET + +class LocalTimezone(tzinfo): + + def utcoffset(self, dt): + if self._isdst(dt): + return DSTOFFSET + else: + return STDOFFSET + + def dst(self, dt): + if self._isdst(dt): + return DSTDIFF + else: + return ZERO + + def tzname(self, dt): + return _time.tzname[self._isdst(dt)] + + def _isdst(self, dt): + tt = (dt.year, dt.month, dt.day, + dt.hour, dt.minute, dt.second, + dt.weekday(), 0, -1) + stamp = _time.mktime(tt) + tt = _time.localtime(stamp) + return tt.tm_isdst > 0 + +Local = LocalTimezone() + +# A complete implementation of current DST rules for major US time zones. + +def first_sunday_on_or_after(dt): + days_to_go = 6 - dt.weekday() + if days_to_go: + dt += timedelta(days_to_go) + return dt + +# In the US, DST starts at 2am (standard time) on the first Sunday in April. +DSTSTART = datetime(1, 4, 1, 2) +# and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct. +# which is the first Sunday on or after Oct 25. +DSTEND = datetime(1, 10, 25, 1) + +class USTimeZone(tzinfo): + + def __init__(self, hours, reprname, stdname, dstname): + self.stdoffset = timedelta(hours=hours) + self.reprname = reprname + self.stdname = stdname + self.dstname = dstname + + def __repr__(self): + return self.reprname + + def tzname(self, dt): + if self.dst(dt): + return self.dstname + else: + return self.stdname + + def utcoffset(self, dt): + return self.stdoffset + self.dst(dt) + + def dst(self, dt): + if dt is None or dt.tzinfo is None: + # An exception may be sensible here, in one or both cases. + # It depends on how you want to treat them. The default + # fromutc() implementation (called by the default astimezone() + # implementation) passes a datetime with dt.tzinfo is self. + return ZERO + assert dt.tzinfo is self + + # Find first Sunday in April & the last in October. + start = first_sunday_on_or_after(DSTSTART.replace(year=dt.year)) + end = first_sunday_on_or_after(DSTEND.replace(year=dt.year)) + + # Can't compare naive to aware objects, so strip the timezone from + # dt first. + if start <= dt.replace(tzinfo=None) < end: + return HOUR + else: + return ZERO + +Eastern = USTimeZone(-5, "Eastern", "EST", "EDT") +Central = USTimeZone(-6, "Central", "CST", "CDT") +Mountain = USTimeZone(-7, "Mountain", "MST", "MDT") +Pacific = USTimeZone(-8, "Pacific", "PST", "PDT") + diff --git a/vendor/pytz/tzinfo.py b/vendor/pytz/tzinfo.py new file mode 100644 index 00000000..f5e9e0b0 --- /dev/null +++ b/vendor/pytz/tzinfo.py @@ -0,0 +1,379 @@ +'''Base classes and helpers for building zone specific tzinfo classes''' + +from datetime import datetime, timedelta, tzinfo +from bisect import bisect_right +from sets import Set + +import pytz + +__all__ = [] + +_timedelta_cache = {} +def memorized_timedelta(seconds): + '''Create only one instance of each distinct timedelta''' + try: + return _timedelta_cache[seconds] + except KeyError: + delta = timedelta(seconds=seconds) + _timedelta_cache[seconds] = delta + return delta + +_datetime_cache = {} +def memorized_datetime(*args): + '''Create only one instance of each distinct datetime''' + try: + return _datetime_cache[args] + except KeyError: + dt = datetime(*args) + _datetime_cache[args] = dt + return dt + +_ttinfo_cache = {} +def memorized_ttinfo(*args): + '''Create only one instance of each distinct tuple''' + try: + return _ttinfo_cache[args] + except KeyError: + ttinfo = ( + memorized_timedelta(args[0]), + memorized_timedelta(args[1]), + args[2] + ) + _ttinfo_cache[args] = ttinfo + return ttinfo + +_notime = memorized_timedelta(0) + +def _to_seconds(td): + '''Convert a timedelta to seconds''' + return td.seconds + td.days * 24 * 60 * 60 + + +class BaseTzInfo(tzinfo): + # Overridden in subclass + _utcoffset = None + _tzname = None + zone = None + + def __str__(self): + return self.zone + + +class StaticTzInfo(BaseTzInfo): + '''A timezone that has a constant offset from UTC + + These timezones are rare, as most regions have changed their + offset from UTC at some point in their history + ''' + def fromutc(self, dt): + '''See datetime.tzinfo.fromutc''' + return (dt + self._utcoffset).replace(tzinfo=self) + + def utcoffset(self,dt): + '''See datetime.tzinfo.utcoffset''' + return self._utcoffset + + def dst(self,dt): + '''See datetime.tzinfo.dst''' + return _notime + + def tzname(self,dt): + '''See datetime.tzinfo.tzname''' + return self._tzname + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time''' + if dt.tzinfo is not None: + raise ValueError, 'Not naive datetime (tzinfo is already set)' + return dt.replace(tzinfo=self) + + def normalize(self, dt, is_dst=False): + '''Correct the timezone information on the given datetime''' + if dt.tzinfo is None: + raise ValueError, 'Naive time - no tzinfo set' + return dt.replace(tzinfo=self) + + def __repr__(self): + return '' % (self.zone,) + + def __reduce__(self): + # Special pickle to zone remains a singleton and to cope with + # database changes. + return pytz._p, (self.zone,) + + +class DstTzInfo(BaseTzInfo): + '''A timezone that has a variable offset from UTC + + The offset might change if daylight savings time comes into effect, + or at a point in history when the region decides to change their + timezone definition. + + ''' + # Overridden in subclass + _utc_transition_times = None # Sorted list of DST transition times in UTC + _transition_info = None # [(utcoffset, dstoffset, tzname)] corresponding + # to _utc_transition_times entries + zone = None + + # Set in __init__ + _tzinfos = None + _dst = None # DST offset + + def __init__(self, _inf=None, _tzinfos=None): + if _inf: + self._tzinfos = _tzinfos + self._utcoffset, self._dst, self._tzname = _inf + else: + _tzinfos = {} + self._tzinfos = _tzinfos + self._utcoffset, self._dst, self._tzname = self._transition_info[0] + _tzinfos[self._transition_info[0]] = self + for inf in self._transition_info[1:]: + if not _tzinfos.has_key(inf): + _tzinfos[inf] = self.__class__(inf, _tzinfos) + + def fromutc(self, dt): + '''See datetime.tzinfo.fromutc''' + dt = dt.replace(tzinfo=None) + idx = max(0, bisect_right(self._utc_transition_times, dt) - 1) + inf = self._transition_info[idx] + return (dt + inf[0]).replace(tzinfo=self._tzinfos[inf]) + + def normalize(self, dt): + '''Correct the timezone information on the given datetime + + If date arithmetic crosses DST boundaries, the tzinfo + is not magically adjusted. This method normalizes the + tzinfo to the correct one. + + To test, first we need to do some setup + + >>> from pytz import timezone + >>> utc = timezone('UTC') + >>> eastern = timezone('US/Eastern') + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + + We next create a datetime right on an end-of-DST transition point, + the instant when the wallclocks are wound back one hour. + + >>> utc_dt = datetime(2002, 10, 27, 6, 0, 0, tzinfo=utc) + >>> loc_dt = utc_dt.astimezone(eastern) + >>> loc_dt.strftime(fmt) + '2002-10-27 01:00:00 EST (-0500)' + + Now, if we subtract a few minutes from it, note that the timezone + information has not changed. + + >>> before = loc_dt - timedelta(minutes=10) + >>> before.strftime(fmt) + '2002-10-27 00:50:00 EST (-0500)' + + But we can fix that by calling the normalize method + + >>> before = eastern.normalize(before) + >>> before.strftime(fmt) + '2002-10-27 01:50:00 EDT (-0400)' + + ''' + if dt.tzinfo is None: + raise ValueError, 'Naive time - no tzinfo set' + + # Convert dt in localtime to UTC + offset = dt.tzinfo._utcoffset + dt = dt.replace(tzinfo=None) + dt = dt - offset + # convert it back, and return it + return self.fromutc(dt) + + def localize(self, dt, is_dst=False): + '''Convert naive time to local time. + + This method should be used to construct localtimes, rather + than passing a tzinfo argument to a datetime constructor. + + is_dst is used to determine the correct timezone in the ambigous + period at the end of daylight savings time. + + >>> from pytz import timezone + >>> fmt = '%Y-%m-%d %H:%M:%S %Z (%z)' + >>> amdam = timezone('Europe/Amsterdam') + >>> dt = datetime(2004, 10, 31, 2, 0, 0) + >>> loc_dt1 = amdam.localize(dt, is_dst=True) + >>> loc_dt2 = amdam.localize(dt, is_dst=False) + >>> loc_dt1.strftime(fmt) + '2004-10-31 02:00:00 CEST (+0200)' + >>> loc_dt2.strftime(fmt) + '2004-10-31 02:00:00 CET (+0100)' + >>> str(loc_dt2 - loc_dt1) + '1:00:00' + + Use is_dst=None to raise an AmbiguousTimeError for ambiguous + times at the end of daylight savings + + >>> try: + ... loc_dt1 = amdam.localize(dt, is_dst=None) + ... except AmbiguousTimeError: + ... print 'Oops' + Oops + + >>> loc_dt1 = amdam.localize(dt, is_dst=None) + Traceback (most recent call last): + [...] + AmbiguousTimeError: 2004-10-31 02:00:00 + + is_dst defaults to False + + >>> amdam.localize(dt) == amdam.localize(dt, False) + True + + ''' + if dt.tzinfo is not None: + raise ValueError, 'Not naive datetime (tzinfo is already set)' + + # Find the possibly correct timezones. We probably just have one, + # but we might end up with two if we are in the end-of-DST + # transition period. Or possibly more in some particularly confused + # location... + possible_loc_dt = Set() + for tzinfo in self._tzinfos.values(): + loc_dt = tzinfo.normalize(dt.replace(tzinfo=tzinfo)) + if loc_dt.replace(tzinfo=None) == dt: + possible_loc_dt.add(loc_dt) + + if len(possible_loc_dt) == 1: + return possible_loc_dt.pop() + + # If told to be strict, raise an exception since we have an + # ambiguous case + if is_dst is None: + raise AmbiguousTimeError(dt) + + # Filter out the possiblilities that don't match the requested + # is_dst + filtered_possible_loc_dt = [ + p for p in possible_loc_dt + if bool(p.tzinfo._dst) == is_dst + ] + + # Hopefully we only have one possibility left. Return it. + if len(filtered_possible_loc_dt) == 1: + return filtered_possible_loc_dt[0] + + if len(filtered_possible_loc_dt) == 0: + filtered_possible_loc_dt = list(possible_loc_dt) + + # If we get this far, we have in a wierd timezone transition + # where the clocks have been wound back but is_dst is the same + # in both (eg. Europe/Warsaw 1915 when they switched to CET). + # At this point, we just have to guess unless we allow more + # hints to be passed in (such as the UTC offset or abbreviation), + # but that is just getting silly. + # + # Choose the earliest (by UTC) applicable timezone. + def mycmp(a,b): + return cmp( + a.replace(tzinfo=None) - a.tzinfo._utcoffset, + b.replace(tzinfo=None) - b.tzinfo._utcoffset, + ) + filtered_possible_loc_dt.sort(mycmp) + return filtered_possible_loc_dt[0] + + def utcoffset(self, dt): + '''See datetime.tzinfo.utcoffset''' + return self._utcoffset + + def dst(self, dt): + '''See datetime.tzinfo.dst''' + return self._dst + + def tzname(self, dt): + '''See datetime.tzinfo.tzname''' + return self._tzname + + def __repr__(self): + if self._dst: + dst = 'DST' + else: + dst = 'STD' + if self._utcoffset > _notime: + return '' % ( + self.zone, self._tzname, self._utcoffset, dst + ) + else: + return '' % ( + self.zone, self._tzname, self._utcoffset, dst + ) + + def __reduce__(self): + # Special pickle to zone remains a singleton and to cope with + # database changes. + return pytz._p, ( + self.zone, + _to_seconds(self._utcoffset), + _to_seconds(self._dst), + self._tzname + ) + + +class AmbiguousTimeError(Exception): + '''Exception raised when attempting to create an ambiguous wallclock time. + + At the end of a DST transition period, a particular wallclock time will + occur twice (once before the clocks are set back, once after). Both + possibilities may be correct, unless further information is supplied. + + See DstTzInfo.normalize() for more info + ''' + + +def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None): + """Factory function for unpickling pytz tzinfo instances. + + This is shared for both StaticTzInfo and DstTzInfo instances, because + database changes could cause a zones implementation to switch between + these two base classes and we can't break pickles on a pytz version + upgrade. + """ + # Raises a KeyError if zone no longer exists, which should never happen + # and would be a bug. + tz = pytz.timezone(zone) + + # A StaticTzInfo - just return it + if utcoffset is None: + return tz + + # This pickle was created from a DstTzInfo. We need to + # determine which of the list of tzinfo instances for this zone + # to use in order to restore the state of any datetime instances using + # it correctly. + utcoffset = memorized_timedelta(utcoffset) + dstoffset = memorized_timedelta(dstoffset) + try: + return tz._tzinfos[(utcoffset, dstoffset, tzname)] + except KeyError: + # The particular state requested in this timezone no longer exists. + # This indicates a corrupt pickle, or the timezone database has been + # corrected violently enough to make this particular + # (utcoffset,dstoffset) no longer exist in the zone, or the + # abbreviation has been changed. + pass + + # See if we can find an entry differing only by tzname. Abbreviations + # get changed from the initial guess by the database maintainers to + # match reality when this information is discovered. + for localized_tz in tz._tzinfos.values(): + if (localized_tz._utcoffset == utcoffset + and localized_tz._dst == dstoffset): + return localized_tz + + # This (utcoffset, dstoffset) information has been removed from the + # zone. Add it back. This might occur when the database maintainers have + # corrected incorrect information. datetime instances using this + # incorrect information will continue to do so, exactly as they were + # before being pickled. This is purely an overly paranoid safety net - I + # doubt this will ever been needed in real life. + inf = (utcoffset, dstoffset, tzname) + tz._tzinfos[inf] = tz.__class__(inf, tz._tzinfos) + return tz._tzinfos[inf] + diff --git a/vendor/pytz/zone.tab b/vendor/pytz/zone.tab new file mode 100644 index 00000000..253e9401 --- /dev/null +++ b/vendor/pytz/zone.tab @@ -0,0 +1,417 @@ +# @(#)zone.tab 8.6 +# +# TZ zone descriptions +# +# From Paul Eggert (1996-08-05): +# +# This file contains a table with the following columns: +# 1. ISO 3166 2-character country code. See the file `iso3166.tab'. +# 2. Latitude and longitude of the zone's principal location +# in ISO 6709 sign-degrees-minutes-seconds format, +# either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS, +# first latitude (+ is north), then longitude (+ is east). +# 3. Zone name used in value of TZ environment variable. +# 4. Comments; present if and only if the country has multiple rows. +# +# Columns are separated by a single tab. +# The table is sorted first by country, then an order within the country that +# (1) makes some geographical sense, and +# (2) puts the most populous zones first, where that does not contradict (1). +# +# Lines beginning with `#' are comments. +# +#country- +#code coordinates TZ comments +AD +4230+00131 Europe/Andorra +AE +2518+05518 Asia/Dubai +AF +3431+06912 Asia/Kabul +AG +1703-06148 America/Antigua +AI +1812-06304 America/Anguilla +AL +4120+01950 Europe/Tirane +AM +4011+04430 Asia/Yerevan +AN +1211-06900 America/Curacao +AO -0848+01314 Africa/Luanda +AQ -7750+16636 Antarctica/McMurdo McMurdo Station, Ross Island +AQ -9000+00000 Antarctica/South_Pole Amundsen-Scott Station, South Pole +AQ -6734-06808 Antarctica/Rothera Rothera Station, Adelaide Island +AQ -6448-06406 Antarctica/Palmer Palmer Station, Anvers Island +AQ -6736+06253 Antarctica/Mawson Mawson Station, Holme Bay +AQ -6835+07758 Antarctica/Davis Davis Station, Vestfold Hills +AQ -6617+11031 Antarctica/Casey Casey Station, Bailey Peninsula +AQ -7824+10654 Antarctica/Vostok Vostok Station, S Magnetic Pole +AQ -6640+14001 Antarctica/DumontDUrville Dumont-d'Urville Base, Terre Adelie +AQ -690022+0393524 Antarctica/Syowa Syowa Station, E Ongul I +AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF) +AR -3124-06411 America/Argentina/Cordoba most locations (CB, CC, CN, ER, FM, LP, MN, NQ, RN, SA, SE, SF, SL) +AR -2411-06518 America/Argentina/Jujuy Jujuy (JY) +AR -2649-06513 America/Argentina/Tucuman Tucuman (TM) +AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH) +AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR) +AR -3132-06831 America/Argentina/San_Juan San Juan (SJ) +AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ) +AR -5138-06913 America/Argentina/Rio_Gallegos Santa Cruz (SC) +AR -5448-06818 America/Argentina/Ushuaia Tierra del Fuego (TF) +AS -1416-17042 Pacific/Pago_Pago +AT +4813+01620 Europe/Vienna +AU -3133+15905 Australia/Lord_Howe Lord Howe Island +AU -4253+14719 Australia/Hobart Tasmania - most locations +AU -3956+14352 Australia/Currie Tasmania - King Island +AU -3749+14458 Australia/Melbourne Victoria +AU -3352+15113 Australia/Sydney New South Wales - most locations +AU -3157+14127 Australia/Broken_Hill New South Wales - Yancowinna +AU -2728+15302 Australia/Brisbane Queensland - most locations +AU -2016+14900 Australia/Lindeman Queensland - Holiday Islands +AU -3455+13835 Australia/Adelaide South Australia +AU -1228+13050 Australia/Darwin Northern Territory +AU -3157+11551 Australia/Perth Western Australia +AW +1230-06858 America/Aruba +AX +6006+01957 Europe/Mariehamn +AZ +4023+04951 Asia/Baku +BA +4352+01825 Europe/Sarajevo +BB +1306-05937 America/Barbados +BD +2343+09025 Asia/Dhaka +BE +5050+00420 Europe/Brussels +BF +1222-00131 Africa/Ouagadougou +BG +4241+02319 Europe/Sofia +BH +2623+05035 Asia/Bahrain +BI -0323+02922 Africa/Bujumbura +BJ +0629+00237 Africa/Porto-Novo +BM +3217-06446 Atlantic/Bermuda +BN +0456+11455 Asia/Brunei +BO -1630-06809 America/La_Paz +BR -0351-03225 America/Noronha Atlantic islands +BR -0127-04829 America/Belem Amapa, E Para +BR -0343-03830 America/Fortaleza NE Brazil (MA, PI, CE, RN, PB) +BR -0803-03454 America/Recife Pernambuco +BR -0712-04812 America/Araguaina Tocantins +BR -0940-03543 America/Maceio Alagoas, Sergipe +BR -1259-03831 America/Bahia Bahia +BR -2332-04637 America/Sao_Paulo S & SE Brazil (GO, DF, MG, ES, RJ, SP, PR, SC, RS) +BR -2027-05437 America/Campo_Grande Mato Grosso do Sul +BR -1535-05605 America/Cuiaba Mato Grosso +BR -0846-06354 America/Porto_Velho W Para, Rondonia +BR +0249-06040 America/Boa_Vista Roraima +BR -0308-06001 America/Manaus E Amazonas +BR -0640-06952 America/Eirunepe W Amazonas +BR -0958-06748 America/Rio_Branco Acre +BS +2505-07721 America/Nassau +BT +2728+08939 Asia/Thimphu +BW -2545+02555 Africa/Gaborone +BY +5354+02734 Europe/Minsk +BZ +1730-08812 America/Belize +CA +4734-05243 America/St_Johns Newfoundland Time, including SE Labrador +CA +4439-06336 America/Halifax Atlantic Time - Nova Scotia (most places), PEI +CA +4612-05957 America/Glace_Bay Atlantic Time - Nova Scotia - places that did not observe DST 1966-1971 +CA +4606-06447 America/Moncton Atlantic Time - New Brunswick +CA +5320-06025 America/Goose_Bay Atlantic Time - Labrador - most locations +CA +5125-05707 America/Blanc-Sablon Atlantic Standard Time - Quebec - Lower North Shore +CA +4531-07334 America/Montreal Eastern Time - Quebec - most locations +CA +4339-07923 America/Toronto Eastern Time - Ontario - most locations +CA +4901-08816 America/Nipigon Eastern Time - Ontario & Quebec - places that did not observe DST 1967-1973 +CA +4823-08915 America/Thunder_Bay Eastern Time - Thunder Bay, Ontario +CA +6608-06544 America/Pangnirtung Eastern Time - Pangnirtung, Nunavut +CA +6344-06828 America/Iqaluit Eastern Time - east Nunavut +CA +484531-0913718 America/Atikokan Eastern Standard Time - Atikokan, Ontario and Southampton I, Nunavut +CA +624900-0920459 America/Rankin_Inlet Central Time - central Nunavut +CA +4953-09709 America/Winnipeg Central Time - Manitoba & west Ontario +CA +4843-09434 America/Rainy_River Central Time - Rainy River & Fort Frances, Ontario +CA +6903-10505 America/Cambridge_Bay Central Time - west Nunavut +CA +5024-10439 America/Regina Central Standard Time - Saskatchewan - most locations +CA +5017-10750 America/Swift_Current Central Standard Time - Saskatchewan - midwest +CA +5333-11328 America/Edmonton Mountain Time - Alberta, east British Columbia & west Saskatchewan +CA +6227-11421 America/Yellowknife Mountain Time - central Northwest Territories +CA +682059-1334300 America/Inuvik Mountain Time - west Northwest Territories +CA +5946-12014 America/Dawson_Creek Mountain Standard Time - Dawson Creek & Fort Saint John, British Columbia +CA +4916-12307 America/Vancouver Pacific Time - west British Columbia +CA +6043-13503 America/Whitehorse Pacific Time - south Yukon +CA +6404-13925 America/Dawson Pacific Time - north Yukon +CC -1210+09655 Indian/Cocos +CD -0418+01518 Africa/Kinshasa west Dem. Rep. of Congo +CD -1140+02728 Africa/Lubumbashi east Dem. Rep. of Congo +CF +0422+01835 Africa/Bangui +CG -0416+01517 Africa/Brazzaville +CH +4723+00832 Europe/Zurich +CI +0519-00402 Africa/Abidjan +CK -2114-15946 Pacific/Rarotonga +CL -3327-07040 America/Santiago most locations +CL -2710-10927 Pacific/Easter Easter Island & Sala y Gomez +CM +0403+00942 Africa/Douala +CN +3114+12128 Asia/Shanghai east China - Beijing, Guangdong, Shanghai, etc. +CN +4545+12641 Asia/Harbin Heilongjiang (except Mohe), Jilin +CN +2934+10635 Asia/Chongqing central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc. +CN +4348+08735 Asia/Urumqi most of Tibet & Xinjiang +CN +3929+07559 Asia/Kashgar west Tibet & Xinjiang +CO +0436-07405 America/Bogota +CR +0956-08405 America/Costa_Rica +CU +2308-08222 America/Havana +CV +1455-02331 Atlantic/Cape_Verde +CX -1025+10543 Indian/Christmas +CY +3510+03322 Asia/Nicosia +CZ +5005+01426 Europe/Prague +DE +5230+01322 Europe/Berlin +DJ +1136+04309 Africa/Djibouti +DK +5540+01235 Europe/Copenhagen +DM +1518-06124 America/Dominica +DO +1828-06954 America/Santo_Domingo +DZ +3647+00303 Africa/Algiers +EC -0210-07950 America/Guayaquil mainland +EC -0054-08936 Pacific/Galapagos Galapagos Islands +EE +5925+02445 Europe/Tallinn +EG +3003+03115 Africa/Cairo +EH +2709-01312 Africa/El_Aaiun +ER +1520+03853 Africa/Asmera +ES +4024-00341 Europe/Madrid mainland +ES +3553-00519 Africa/Ceuta Ceuta & Melilla +ES +2806-01524 Atlantic/Canary Canary Islands +ET +0902+03842 Africa/Addis_Ababa +FI +6010+02458 Europe/Helsinki +FJ -1808+17825 Pacific/Fiji +FK -5142-05751 Atlantic/Stanley +FM +0725+15147 Pacific/Truk Truk (Chuuk) and Yap +FM +0658+15813 Pacific/Ponape Ponape (Pohnpei) +FM +0519+16259 Pacific/Kosrae Kosrae +FO +6201-00646 Atlantic/Faeroe +FR +4852+00220 Europe/Paris +GA +0023+00927 Africa/Libreville +GB +512830-0001845 Europe/London +GD +1203-06145 America/Grenada +GE +4143+04449 Asia/Tbilisi +GF +0456-05220 America/Cayenne +GG +4927-00232 Europe/Guernsey +GH +0533-00013 Africa/Accra +GI +3608-00521 Europe/Gibraltar +GL +6411-05144 America/Godthab most locations +GL +7646-01840 America/Danmarkshavn east coast, north of Scoresbysund +GL +7029-02158 America/Scoresbysund Scoresbysund / Ittoqqortoormiit +GL +7634-06847 America/Thule Thule / Pituffik +GM +1328-01639 Africa/Banjul +GN +0931-01343 Africa/Conakry +GP +1614-06132 America/Guadeloupe +GQ +0345+00847 Africa/Malabo +GR +3758+02343 Europe/Athens +GS -5416-03632 Atlantic/South_Georgia +GT +1438-09031 America/Guatemala +GU +1328+14445 Pacific/Guam +GW +1151-01535 Africa/Bissau +GY +0648-05810 America/Guyana +HK +2217+11409 Asia/Hong_Kong +HN +1406-08713 America/Tegucigalpa +HR +4548+01558 Europe/Zagreb +HT +1832-07220 America/Port-au-Prince +HU +4730+01905 Europe/Budapest +ID -0610+10648 Asia/Jakarta Java & Sumatra +ID -0002+10920 Asia/Pontianak west & central Borneo +ID -0507+11924 Asia/Makassar east & south Borneo, Celebes, Bali, Nusa Tengarra, west Timor +ID -0232+14042 Asia/Jayapura Irian Jaya & the Moluccas +IE +5320-00615 Europe/Dublin +IL +3146+03514 Asia/Jerusalem +IM +5409-00428 Europe/Isle_of_Man +IN +2232+08822 Asia/Calcutta +IO -0720+07225 Indian/Chagos +IQ +3321+04425 Asia/Baghdad +IR +3540+05126 Asia/Tehran +IS +6409-02151 Atlantic/Reykjavik +IT +4154+01229 Europe/Rome +JE +4912-00207 Europe/Jersey +JM +1800-07648 America/Jamaica +JO +3157+03556 Asia/Amman +JP +353916+1394441 Asia/Tokyo +KE -0117+03649 Africa/Nairobi +KG +4254+07436 Asia/Bishkek +KH +1133+10455 Asia/Phnom_Penh +KI +0125+17300 Pacific/Tarawa Gilbert Islands +KI -0308-17105 Pacific/Enderbury Phoenix Islands +KI +0152-15720 Pacific/Kiritimati Line Islands +KM -1141+04316 Indian/Comoro +KN +1718-06243 America/St_Kitts +KP +3901+12545 Asia/Pyongyang +KR +3733+12658 Asia/Seoul +KW +2920+04759 Asia/Kuwait +KY +1918-08123 America/Cayman +KZ +4315+07657 Asia/Almaty most locations +KZ +4448+06528 Asia/Qyzylorda Qyzylorda (Kyzylorda, Kzyl-Orda) +KZ +5017+05710 Asia/Aqtobe Aqtobe (Aktobe) +KZ +4431+05016 Asia/Aqtau Atyrau (Atirau, Gur'yev), Mangghystau (Mankistau) +KZ +5113+05121 Asia/Oral West Kazakhstan +LA +1758+10236 Asia/Vientiane +LB +3353+03530 Asia/Beirut +LC +1401-06100 America/St_Lucia +LI +4709+00931 Europe/Vaduz +LK +0656+07951 Asia/Colombo +LR +0618-01047 Africa/Monrovia +LS -2928+02730 Africa/Maseru +LT +5441+02519 Europe/Vilnius +LU +4936+00609 Europe/Luxembourg +LV +5657+02406 Europe/Riga +LY +3254+01311 Africa/Tripoli +MA +3339-00735 Africa/Casablanca +MC +4342+00723 Europe/Monaco +MD +4700+02850 Europe/Chisinau +ME +4226+01916 Europe/Podgorica +MG -1855+04731 Indian/Antananarivo +MH +0709+17112 Pacific/Majuro most locations +MH +0905+16720 Pacific/Kwajalein Kwajalein +MK +4159+02126 Europe/Skopje +ML +1239-00800 Africa/Bamako +MM +1647+09610 Asia/Rangoon +MN +4755+10653 Asia/Ulaanbaatar most locations +MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan +MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar +MO +2214+11335 Asia/Macau +MP +1512+14545 Pacific/Saipan +MQ +1436-06105 America/Martinique +MR +1806-01557 Africa/Nouakchott +MS +1643-06213 America/Montserrat +MT +3554+01431 Europe/Malta +MU -2010+05730 Indian/Mauritius +MV +0410+07330 Indian/Maldives +MW -1547+03500 Africa/Blantyre +MX +1924-09909 America/Mexico_City Central Time - most locations +MX +2105-08646 America/Cancun Central Time - Quintana Roo +MX +2058-08937 America/Merida Central Time - Campeche, Yucatan +MX +2540-10019 America/Monterrey Central Time - Coahuila, Durango, Nuevo Leon, Tamaulipas +MX +2313-10625 America/Mazatlan Mountain Time - S Baja, Nayarit, Sinaloa +MX +2838-10605 America/Chihuahua Mountain Time - Chihuahua +MX +2904-11058 America/Hermosillo Mountain Standard Time - Sonora +MX +3232-11701 America/Tijuana Pacific Time +MY +0310+10142 Asia/Kuala_Lumpur peninsular Malaysia +MY +0133+11020 Asia/Kuching Sabah & Sarawak +MZ -2558+03235 Africa/Maputo +NA -2234+01706 Africa/Windhoek +NC -2216+16530 Pacific/Noumea +NE +1331+00207 Africa/Niamey +NF -2903+16758 Pacific/Norfolk +NG +0627+00324 Africa/Lagos +NI +1209-08617 America/Managua +NL +5222+00454 Europe/Amsterdam +NO +5955+01045 Europe/Oslo +NP +2743+08519 Asia/Katmandu +NR -0031+16655 Pacific/Nauru +NU -1901+16955 Pacific/Niue +NZ -3652+17446 Pacific/Auckland most locations +NZ -4357-17633 Pacific/Chatham Chatham Islands +OM +2336+05835 Asia/Muscat +PA +0858-07932 America/Panama +PE -1203-07703 America/Lima +PF -1732-14934 Pacific/Tahiti Society Islands +PF -0900-13930 Pacific/Marquesas Marquesas Islands +PF -2308-13457 Pacific/Gambier Gambier Islands +PG -0930+14710 Pacific/Port_Moresby +PH +1435+12100 Asia/Manila +PK +2452+06703 Asia/Karachi +PL +5215+02100 Europe/Warsaw +PM +4703-05620 America/Miquelon +PN -2504-13005 Pacific/Pitcairn +PR +182806-0660622 America/Puerto_Rico +PS +3130+03428 Asia/Gaza +PT +3843-00908 Europe/Lisbon mainland +PT +3238-01654 Atlantic/Madeira Madeira Islands +PT +3744-02540 Atlantic/Azores Azores +PW +0720+13429 Pacific/Palau +PY -2516-05740 America/Asuncion +QA +2517+05132 Asia/Qatar +RE -2052+05528 Indian/Reunion +RO +4426+02606 Europe/Bucharest +RS +4450+02030 Europe/Belgrade +RU +5443+02030 Europe/Kaliningrad Moscow-01 - Kaliningrad +RU +5545+03735 Europe/Moscow Moscow+00 - west Russia +RU +4844+04425 Europe/Volgograd Moscow+00 - Caspian Sea +RU +5312+05009 Europe/Samara Moscow+01 - Samara, Udmurtia +RU +5651+06036 Asia/Yekaterinburg Moscow+02 - Urals +RU +5500+07324 Asia/Omsk Moscow+03 - west Siberia +RU +5502+08255 Asia/Novosibirsk Moscow+03 - Novosibirsk +RU +5601+09250 Asia/Krasnoyarsk Moscow+04 - Yenisei River +RU +5216+10420 Asia/Irkutsk Moscow+05 - Lake Baikal +RU +6200+12940 Asia/Yakutsk Moscow+06 - Lena River +RU +4310+13156 Asia/Vladivostok Moscow+07 - Amur River +RU +4658+14242 Asia/Sakhalin Moscow+07 - Sakhalin Island +RU +5934+15048 Asia/Magadan Moscow+08 - Magadan +RU +5301+15839 Asia/Kamchatka Moscow+09 - Kamchatka +RU +6445+17729 Asia/Anadyr Moscow+10 - Bering Sea +RW -0157+03004 Africa/Kigali +SA +2438+04643 Asia/Riyadh +SB -0932+16012 Pacific/Guadalcanal +SC -0440+05528 Indian/Mahe +SD +1536+03232 Africa/Khartoum +SE +5920+01803 Europe/Stockholm +SG +0117+10351 Asia/Singapore +SH -1555-00542 Atlantic/St_Helena +SI +4603+01431 Europe/Ljubljana +SJ +7800+01600 Arctic/Longyearbyen Svalbard +SJ +7059-00805 Atlantic/Jan_Mayen Jan Mayen +SK +4809+01707 Europe/Bratislava +SL +0830-01315 Africa/Freetown +SM +4355+01228 Europe/San_Marino +SN +1440-01726 Africa/Dakar +SO +0204+04522 Africa/Mogadishu +SR +0550-05510 America/Paramaribo +ST +0020+00644 Africa/Sao_Tome +SV +1342-08912 America/El_Salvador +SY +3330+03618 Asia/Damascus +SZ -2618+03106 Africa/Mbabane +TC +2128-07108 America/Grand_Turk +TD +1207+01503 Africa/Ndjamena +TF -492110+0701303 Indian/Kerguelen +TG +0608+00113 Africa/Lome +TH +1345+10031 Asia/Bangkok +TJ +3835+06848 Asia/Dushanbe +TK -0922-17114 Pacific/Fakaofo +TL -0833+12535 Asia/Dili +TM +3757+05823 Asia/Ashgabat +TN +3648+01011 Africa/Tunis +TO -2110+17510 Pacific/Tongatapu +TR +4101+02858 Europe/Istanbul +TT +1039-06131 America/Port_of_Spain +TV -0831+17913 Pacific/Funafuti +TW +2503+12130 Asia/Taipei +TZ -0648+03917 Africa/Dar_es_Salaam +UA +5026+03031 Europe/Kiev most locations +UA +4837+02218 Europe/Uzhgorod Ruthenia +UA +4750+03510 Europe/Zaporozhye Zaporozh'ye, E Lugansk +UA +4457+03406 Europe/Simferopol central Crimea +UG +0019+03225 Africa/Kampala +UM +1700-16830 Pacific/Johnston Johnston Atoll +UM +2813-17722 Pacific/Midway Midway Islands +UM +1917+16637 Pacific/Wake Wake Island +US +404251-0740023 America/New_York Eastern Time +US +421953-0830245 America/Detroit Eastern Time - Michigan - most locations +US +381515-0854534 America/Kentucky/Louisville Eastern Time - Kentucky - Louisville area +US +364947-0845057 America/Kentucky/Monticello Eastern Time - Kentucky - Wayne County +US +394606-0860929 America/Indiana/Indianapolis Eastern Time - Indiana - most locations +US +382232-0862041 America/Indiana/Marengo Eastern Time - Indiana - Crawford County +US +411745-0863730 America/Indiana/Knox Eastern Time - Indiana - Starke County +US +384452-0850402 America/Indiana/Vevay Eastern Time - Indiana - Switzerland County +US +415100-0873900 America/Chicago Central Time +US +384038-0873143 America/Indiana/Vincennes Central Time - Indiana - Daviess, Dubois, Knox, Martin, Perry & Pulaski Counties +US +382931-0871643 America/Indiana/Petersburg Central Time - Indiana - Pike County +US +450628-0873651 America/Menominee Central Time - Michigan - Dickinson, Gogebic, Iron & Menominee Counties +US +470659-1011757 America/North_Dakota/Center Central Time - North Dakota - Oliver County +US +465042-1012439 America/North_Dakota/New_Salem Central Time - North Dakota - Morton County (except Mandan area) +US +394421-1045903 America/Denver Mountain Time +US +433649-1161209 America/Boise Mountain Time - south Idaho & east Oregon +US +364708-1084111 America/Shiprock Mountain Time - Navajo +US +332654-1120424 America/Phoenix Mountain Standard Time - Arizona +US +340308-1181434 America/Los_Angeles Pacific Time +US +611305-1495401 America/Anchorage Alaska Time +US +581807-1342511 America/Juneau Alaska Time - Alaska panhandle +US +593249-1394338 America/Yakutat Alaska Time - Alaska panhandle neck +US +643004-1652423 America/Nome Alaska Time - west Alaska +US +515248-1763929 America/Adak Aleutian Islands +US +211825-1575130 Pacific/Honolulu Hawaii +UY -3453-05611 America/Montevideo +UZ +3940+06648 Asia/Samarkand west Uzbekistan +UZ +4120+06918 Asia/Tashkent east Uzbekistan +VA +4154+01227 Europe/Vatican +VC +1309-06114 America/St_Vincent +VE +1030-06656 America/Caracas +VG +1827-06437 America/Tortola +VI +1821-06456 America/St_Thomas +VN +1045+10640 Asia/Saigon +VU -1740+16825 Pacific/Efate +WF -1318-17610 Pacific/Wallis +WS -1350-17144 Pacific/Apia +YE +1245+04512 Asia/Aden +YT -1247+04514 Indian/Mayotte +ZA -2615+02800 Africa/Johannesburg +ZM -1525+02817 Africa/Lusaka +ZW -1750+03103 Africa/Harare diff --git a/vendor/pytz/zoneinfo/Africa/Abidjan.py b/vendor/pytz/zoneinfo/Africa/Abidjan.py new file mode 100644 index 00000000..a78a5071 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Abidjan.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Abidjan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Abidjan(DstTzInfo): + '''Africa/Abidjan timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Abidjan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,16,8), + ] + + _transition_info = [ +i(-960,0,'LMT'), +i(0,0,'GMT'), + ] + +Abidjan = Abidjan() + diff --git a/vendor/pytz/zoneinfo/Africa/Accra.py b/vendor/pytz/zoneinfo/Africa/Accra.py new file mode 100644 index 00000000..62c42d39 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Accra.py @@ -0,0 +1,50 @@ +'''tzinfo timezone information for Africa/Accra.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Accra(DstTzInfo): + '''Africa/Accra timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Accra' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,1,1,0,0,52), +d(1936,9,1,0,0,0), +d(1936,12,30,23,40,0), +d(1937,9,1,0,0,0), +d(1937,12,30,23,40,0), +d(1938,9,1,0,0,0), +d(1938,12,30,23,40,0), +d(1939,9,1,0,0,0), +d(1939,12,30,23,40,0), +d(1940,9,1,0,0,0), +d(1940,12,30,23,40,0), +d(1941,9,1,0,0,0), +d(1941,12,30,23,40,0), +d(1942,9,1,0,0,0), +d(1942,12,30,23,40,0), + ] + + _transition_info = [ +i(-60,0,'LMT'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), +i(1200,1200,'GHST'), +i(0,0,'GMT'), + ] + +Accra = Accra() + diff --git a/vendor/pytz/zoneinfo/Africa/Addis_Ababa.py b/vendor/pytz/zoneinfo/Africa/Addis_Ababa.py new file mode 100644 index 00000000..2b7a992e --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Addis_Ababa.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Addis_Ababa.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Addis_Ababa(DstTzInfo): + '''Africa/Addis_Ababa timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Addis_Ababa' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1936,5,4,21,24,40), + ] + + _transition_info = [ +i(9300,0,'ADMT'), +i(10800,0,'EAT'), + ] + +Addis_Ababa = Addis_Ababa() + diff --git a/vendor/pytz/zoneinfo/Africa/Algiers.py b/vendor/pytz/zoneinfo/Africa/Algiers.py new file mode 100644 index 00000000..6f2b763f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Algiers.py @@ -0,0 +1,86 @@ +'''tzinfo timezone information for Africa/Algiers.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Algiers(DstTzInfo): + '''Africa/Algiers timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Algiers' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,3,10,23,50,39), +d(1916,6,14,23,0,0), +d(1916,10,1,23,0,0), +d(1917,3,24,23,0,0), +d(1917,10,7,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,6,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,5,23,0,0), +d(1920,2,14,23,0,0), +d(1920,10,23,23,0,0), +d(1921,3,14,23,0,0), +d(1921,6,21,23,0,0), +d(1939,9,11,23,0,0), +d(1939,11,19,0,0,0), +d(1940,2,25,2,0,0), +d(1944,4,3,1,0,0), +d(1944,10,8,0,0,0), +d(1945,4,2,1,0,0), +d(1945,9,15,23,0,0), +d(1946,10,6,23,0,0), +d(1956,1,29,0,0,0), +d(1963,4,13,23,0,0), +d(1971,4,25,23,0,0), +d(1971,9,26,23,0,0), +d(1977,5,6,0,0,0), +d(1977,10,20,23,0,0), +d(1978,3,24,0,0,0), +d(1978,9,22,1,0,0), +d(1979,10,25,23,0,0), +d(1980,4,25,0,0,0), +d(1980,10,31,1,0,0), +d(1981,5,1,0,0,0), + ] + + _transition_info = [ +i(540,0,'PMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), + ] + +Algiers = Algiers() + diff --git a/vendor/pytz/zoneinfo/Africa/Asmera.py b/vendor/pytz/zoneinfo/Africa/Asmera.py new file mode 100644 index 00000000..f05e0444 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Asmera.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Asmera.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Asmera(DstTzInfo): + '''Africa/Asmera timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Asmera' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1936,5,4,21,24,40), + ] + + _transition_info = [ +i(9300,0,'ADMT'), +i(10800,0,'EAT'), + ] + +Asmera = Asmera() + diff --git a/vendor/pytz/zoneinfo/Africa/Bamako.py b/vendor/pytz/zoneinfo/Africa/Bamako.py new file mode 100644 index 00000000..67a15dd9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Bamako.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Bamako.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bamako(DstTzInfo): + '''Africa/Bamako timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Bamako' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,32,0), +d(1934,2,26,0,0,0), +d(1960,6,20,1,0,0), + ] + + _transition_info = [ +i(-1920,0,'LMT'), +i(0,0,'GMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Bamako = Bamako() + diff --git a/vendor/pytz/zoneinfo/Africa/Bangui.py b/vendor/pytz/zoneinfo/Africa/Bangui.py new file mode 100644 index 00000000..6fc9ea9c --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Bangui.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Bangui.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bangui(DstTzInfo): + '''Africa/Bangui timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Bangui' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,22,45,40), + ] + + _transition_info = [ +i(4440,0,'LMT'), +i(3600,0,'WAT'), + ] + +Bangui = Bangui() + diff --git a/vendor/pytz/zoneinfo/Africa/Banjul.py b/vendor/pytz/zoneinfo/Africa/Banjul.py new file mode 100644 index 00000000..6d88185e --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Banjul.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Banjul.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Banjul(DstTzInfo): + '''Africa/Banjul timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Banjul' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,1,6,36), +d(1935,1,1,1,6,36), +d(1964,1,1,1,0,0), + ] + + _transition_info = [ +i(-4020,0,'LMT'), +i(-4020,0,'BMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Banjul = Banjul() + diff --git a/vendor/pytz/zoneinfo/Africa/Bissau.py b/vendor/pytz/zoneinfo/Africa/Bissau.py new file mode 100644 index 00000000..9ba10a3f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Bissau.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Bissau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bissau(DstTzInfo): + '''Africa/Bissau timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Bissau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,26,1,2,20), +d(1975,1,1,1,0,0), + ] + + _transition_info = [ +i(-3720,0,'LMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Bissau = Bissau() + diff --git a/vendor/pytz/zoneinfo/Africa/Blantyre.py b/vendor/pytz/zoneinfo/Africa/Blantyre.py new file mode 100644 index 00000000..d9ee75fe --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Blantyre.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Blantyre.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Blantyre(DstTzInfo): + '''Africa/Blantyre timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Blantyre' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,21,40,0), + ] + + _transition_info = [ +i(8400,0,'LMT'), +i(7200,0,'CAT'), + ] + +Blantyre = Blantyre() + diff --git a/vendor/pytz/zoneinfo/Africa/Brazzaville.py b/vendor/pytz/zoneinfo/Africa/Brazzaville.py new file mode 100644 index 00000000..b027a136 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Brazzaville.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Brazzaville.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Brazzaville(DstTzInfo): + '''Africa/Brazzaville timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Brazzaville' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,22,58,52), + ] + + _transition_info = [ +i(3660,0,'LMT'), +i(3600,0,'WAT'), + ] + +Brazzaville = Brazzaville() + diff --git a/vendor/pytz/zoneinfo/Africa/Bujumbura.py b/vendor/pytz/zoneinfo/Africa/Bujumbura.py new file mode 100644 index 00000000..5c6df45e --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Bujumbura.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Africa/Bujumbura.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Bujumbura(StaticTzInfo): + '''Africa/Bujumbura timezone definition. See datetime.tzinfo for details''' + zone = 'Africa/Bujumbura' + _utcoffset = timedelta(seconds=7200) + _tzname = 'CAT' + +Bujumbura = Bujumbura() + diff --git a/vendor/pytz/zoneinfo/Africa/Cairo.py b/vendor/pytz/zoneinfo/Africa/Cairo.py new file mode 100644 index 00000000..f172d36a --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Cairo.py @@ -0,0 +1,368 @@ +'''tzinfo timezone information for Africa/Cairo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cairo(DstTzInfo): + '''Africa/Cairo timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Cairo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,7,14,22,0,0), +d(1940,9,30,21,0,0), +d(1941,4,14,22,0,0), +d(1941,9,15,21,0,0), +d(1942,3,31,22,0,0), +d(1942,10,26,21,0,0), +d(1943,3,31,22,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,21,0,0), +d(1957,5,9,22,0,0), +d(1957,9,30,21,0,0), +d(1958,4,30,22,0,0), +d(1958,9,30,21,0,0), +d(1959,4,30,23,0,0), +d(1959,9,30,0,0,0), +d(1960,4,30,23,0,0), +d(1960,9,30,0,0,0), +d(1961,4,30,23,0,0), +d(1961,9,30,0,0,0), +d(1962,4,30,23,0,0), +d(1962,9,30,0,0,0), +d(1963,4,30,23,0,0), +d(1963,9,30,0,0,0), +d(1964,4,30,23,0,0), +d(1964,9,30,0,0,0), +d(1965,4,30,23,0,0), +d(1965,9,30,0,0,0), +d(1966,4,30,23,0,0), +d(1966,10,1,0,0,0), +d(1967,4,30,23,0,0), +d(1967,10,1,0,0,0), +d(1968,4,30,23,0,0), +d(1968,10,1,0,0,0), +d(1969,4,30,23,0,0), +d(1969,10,1,0,0,0), +d(1970,4,30,23,0,0), +d(1970,10,1,0,0,0), +d(1971,4,30,23,0,0), +d(1971,10,1,0,0,0), +d(1972,4,30,23,0,0), +d(1972,10,1,0,0,0), +d(1973,4,30,23,0,0), +d(1973,10,1,0,0,0), +d(1974,4,30,23,0,0), +d(1974,10,1,0,0,0), +d(1975,4,30,23,0,0), +d(1975,10,1,0,0,0), +d(1976,4,30,23,0,0), +d(1976,10,1,0,0,0), +d(1977,4,30,23,0,0), +d(1977,10,1,0,0,0), +d(1978,4,30,23,0,0), +d(1978,10,1,0,0,0), +d(1979,4,30,23,0,0), +d(1979,10,1,0,0,0), +d(1980,4,30,23,0,0), +d(1980,10,1,0,0,0), +d(1981,4,30,23,0,0), +d(1981,10,1,0,0,0), +d(1982,7,24,23,0,0), +d(1982,10,1,0,0,0), +d(1983,7,11,23,0,0), +d(1983,10,1,0,0,0), +d(1984,4,30,23,0,0), +d(1984,10,1,0,0,0), +d(1985,4,30,23,0,0), +d(1985,10,1,0,0,0), +d(1986,4,30,23,0,0), +d(1986,10,1,0,0,0), +d(1987,4,30,23,0,0), +d(1987,10,1,0,0,0), +d(1988,4,30,23,0,0), +d(1988,10,1,0,0,0), +d(1989,5,5,23,0,0), +d(1989,10,1,0,0,0), +d(1990,4,30,23,0,0), +d(1990,10,1,0,0,0), +d(1991,4,30,23,0,0), +d(1991,10,1,0,0,0), +d(1992,4,30,23,0,0), +d(1992,10,1,0,0,0), +d(1993,4,30,23,0,0), +d(1993,10,1,0,0,0), +d(1994,4,30,23,0,0), +d(1994,10,1,0,0,0), +d(1995,4,27,22,0,0), +d(1995,9,28,21,0,0), +d(1996,4,25,22,0,0), +d(1996,9,26,21,0,0), +d(1997,4,24,22,0,0), +d(1997,9,25,21,0,0), +d(1998,4,23,22,0,0), +d(1998,9,24,21,0,0), +d(1999,4,29,22,0,0), +d(1999,9,30,21,0,0), +d(2000,4,27,22,0,0), +d(2000,9,28,21,0,0), +d(2001,4,26,22,0,0), +d(2001,9,27,21,0,0), +d(2002,4,25,22,0,0), +d(2002,9,26,21,0,0), +d(2003,4,24,22,0,0), +d(2003,9,25,21,0,0), +d(2004,4,29,22,0,0), +d(2004,9,30,21,0,0), +d(2005,4,28,22,0,0), +d(2005,9,29,21,0,0), +d(2006,4,27,22,0,0), +d(2006,9,21,21,0,0), +d(2007,4,26,22,0,0), +d(2007,9,27,21,0,0), +d(2008,4,24,22,0,0), +d(2008,9,25,21,0,0), +d(2009,4,23,22,0,0), +d(2009,9,24,21,0,0), +d(2010,4,29,22,0,0), +d(2010,9,30,21,0,0), +d(2011,4,28,22,0,0), +d(2011,9,29,21,0,0), +d(2012,4,26,22,0,0), +d(2012,9,27,21,0,0), +d(2013,4,25,22,0,0), +d(2013,9,26,21,0,0), +d(2014,4,24,22,0,0), +d(2014,9,25,21,0,0), +d(2015,4,23,22,0,0), +d(2015,9,24,21,0,0), +d(2016,4,28,22,0,0), +d(2016,9,29,21,0,0), +d(2017,4,27,22,0,0), +d(2017,9,28,21,0,0), +d(2018,4,26,22,0,0), +d(2018,9,27,21,0,0), +d(2019,4,25,22,0,0), +d(2019,9,26,21,0,0), +d(2020,4,23,22,0,0), +d(2020,9,24,21,0,0), +d(2021,4,29,22,0,0), +d(2021,9,30,21,0,0), +d(2022,4,28,22,0,0), +d(2022,9,29,21,0,0), +d(2023,4,27,22,0,0), +d(2023,9,28,21,0,0), +d(2024,4,25,22,0,0), +d(2024,9,26,21,0,0), +d(2025,4,24,22,0,0), +d(2025,9,25,21,0,0), +d(2026,4,23,22,0,0), +d(2026,9,24,21,0,0), +d(2027,4,29,22,0,0), +d(2027,9,30,21,0,0), +d(2028,4,27,22,0,0), +d(2028,9,28,21,0,0), +d(2029,4,26,22,0,0), +d(2029,9,27,21,0,0), +d(2030,4,25,22,0,0), +d(2030,9,26,21,0,0), +d(2031,4,24,22,0,0), +d(2031,9,25,21,0,0), +d(2032,4,29,22,0,0), +d(2032,9,30,21,0,0), +d(2033,4,28,22,0,0), +d(2033,9,29,21,0,0), +d(2034,4,27,22,0,0), +d(2034,9,28,21,0,0), +d(2035,4,26,22,0,0), +d(2035,9,27,21,0,0), +d(2036,4,24,22,0,0), +d(2036,9,25,21,0,0), +d(2037,4,23,22,0,0), +d(2037,9,24,21,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Cairo = Cairo() + diff --git a/vendor/pytz/zoneinfo/Africa/Casablanca.py b/vendor/pytz/zoneinfo/Africa/Casablanca.py new file mode 100644 index 00000000..3e7bf3b3 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Casablanca.py @@ -0,0 +1,58 @@ +'''tzinfo timezone information for Africa/Casablanca.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Casablanca(DstTzInfo): + '''Africa/Casablanca timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Casablanca' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1913,10,26,0,30,20), +d(1939,9,12,0,0,0), +d(1939,11,18,23,0,0), +d(1940,2,25,0,0,0), +d(1945,11,17,23,0,0), +d(1950,6,11,0,0,0), +d(1950,10,28,23,0,0), +d(1967,6,3,12,0,0), +d(1967,9,30,23,0,0), +d(1974,6,24,0,0,0), +d(1974,8,31,23,0,0), +d(1976,5,1,0,0,0), +d(1976,7,31,23,0,0), +d(1977,5,1,0,0,0), +d(1977,9,27,23,0,0), +d(1978,6,1,0,0,0), +d(1978,8,3,23,0,0), +d(1984,3,16,0,0,0), +d(1985,12,31,23,0,0), + ] + + _transition_info = [ +i(-1800,0,'LMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(0,0,'WET'), + ] + +Casablanca = Casablanca() + diff --git a/vendor/pytz/zoneinfo/Africa/Ceuta.py b/vendor/pytz/zoneinfo/Africa/Ceuta.py new file mode 100644 index 00000000..8da35b7c --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Ceuta.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for Africa/Ceuta.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ceuta(DstTzInfo): + '''Africa/Ceuta timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Ceuta' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,5,6,23,0,0), +d(1918,10,7,22,0,0), +d(1924,4,16,23,0,0), +d(1924,10,4,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,1,1,0,0,0), +d(1967,6,3,12,0,0), +d(1967,9,30,23,0,0), +d(1974,6,24,0,0,0), +d(1974,8,31,23,0,0), +d(1976,5,1,0,0,0), +d(1976,7,31,23,0,0), +d(1977,5,1,0,0,0), +d(1977,9,27,23,0,0), +d(1978,6,1,0,0,0), +d(1978,8,3,23,0,0), +d(1984,3,16,0,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Ceuta = Ceuta() + diff --git a/vendor/pytz/zoneinfo/Africa/Conakry.py b/vendor/pytz/zoneinfo/Africa/Conakry.py new file mode 100644 index 00000000..39fd4059 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Conakry.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Conakry.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Conakry(DstTzInfo): + '''Africa/Conakry timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Conakry' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,54,52), +d(1934,2,26,0,0,0), +d(1960,1,1,1,0,0), + ] + + _transition_info = [ +i(-3300,0,'LMT'), +i(0,0,'GMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Conakry = Conakry() + diff --git a/vendor/pytz/zoneinfo/Africa/Dakar.py b/vendor/pytz/zoneinfo/Africa/Dakar.py new file mode 100644 index 00000000..5a07e676 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Dakar.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Dakar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dakar(DstTzInfo): + '''Africa/Dakar timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Dakar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,1,9,44), +d(1941,6,1,1,0,0), + ] + + _transition_info = [ +i(-4200,0,'LMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Dakar = Dakar() + diff --git a/vendor/pytz/zoneinfo/Africa/Dar_es_Salaam.py b/vendor/pytz/zoneinfo/Africa/Dar_es_Salaam.py new file mode 100644 index 00000000..63f72fe5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Dar_es_Salaam.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Dar_es_Salaam.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dar_es_Salaam(DstTzInfo): + '''Africa/Dar_es_Salaam timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Dar_es_Salaam' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1930,12,31,21,22,52), +d(1947,12,31,21,0,0), +d(1960,12,31,21,15,15), + ] + + _transition_info = [ +i(9420,0,'LMT'), +i(10800,0,'EAT'), +i(9900,0,'BEAUT'), +i(10800,0,'EAT'), + ] + +Dar_es_Salaam = Dar_es_Salaam() + diff --git a/vendor/pytz/zoneinfo/Africa/Djibouti.py b/vendor/pytz/zoneinfo/Africa/Djibouti.py new file mode 100644 index 00000000..1f114880 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Djibouti.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Djibouti.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Djibouti(DstTzInfo): + '''Africa/Djibouti timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Djibouti' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,6,30,21,7,24), + ] + + _transition_info = [ +i(10380,0,'LMT'), +i(10800,0,'EAT'), + ] + +Djibouti = Djibouti() + diff --git a/vendor/pytz/zoneinfo/Africa/Douala.py b/vendor/pytz/zoneinfo/Africa/Douala.py new file mode 100644 index 00000000..ffa00b51 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Douala.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Douala.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Douala(DstTzInfo): + '''Africa/Douala timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Douala' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,23,21,12), + ] + + _transition_info = [ +i(2340,0,'LMT'), +i(3600,0,'WAT'), + ] + +Douala = Douala() + diff --git a/vendor/pytz/zoneinfo/Africa/El_Aaiun.py b/vendor/pytz/zoneinfo/Africa/El_Aaiun.py new file mode 100644 index 00000000..7fa97f7f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/El_Aaiun.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/El_Aaiun.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class El_Aaiun(DstTzInfo): + '''Africa/El_Aaiun timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/El_Aaiun' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1934,1,1,0,52,48), +d(1976,4,14,1,0,0), + ] + + _transition_info = [ +i(-3180,0,'LMT'), +i(-3600,0,'WAT'), +i(0,0,'WET'), + ] + +El_Aaiun = El_Aaiun() + diff --git a/vendor/pytz/zoneinfo/Africa/Freetown.py b/vendor/pytz/zoneinfo/Africa/Freetown.py new file mode 100644 index 00000000..729e0f38 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Freetown.py @@ -0,0 +1,80 @@ +'''tzinfo timezone information for Africa/Freetown.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Freetown(DstTzInfo): + '''Africa/Freetown timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Freetown' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1913,6,1,0,53,0), +d(1935,6,1,1,0,0), +d(1935,10,1,0,20,0), +d(1936,6,1,1,0,0), +d(1936,10,1,0,20,0), +d(1937,6,1,1,0,0), +d(1937,10,1,0,20,0), +d(1938,6,1,1,0,0), +d(1938,10,1,0,20,0), +d(1939,6,1,1,0,0), +d(1939,10,1,0,20,0), +d(1940,6,1,1,0,0), +d(1940,10,1,0,20,0), +d(1941,6,1,1,0,0), +d(1941,10,1,0,20,0), +d(1942,6,1,1,0,0), +d(1942,10,1,0,20,0), +d(1957,1,1,1,0,0), +d(1957,6,1,0,0,0), +d(1957,8,31,23,0,0), +d(1958,6,1,0,0,0), +d(1958,8,31,23,0,0), +d(1959,6,1,0,0,0), +d(1959,8,31,23,0,0), +d(1960,6,1,0,0,0), +d(1960,8,31,23,0,0), +d(1961,6,1,0,0,0), +d(1961,8,31,23,0,0), +d(1962,6,1,0,0,0), +d(1962,8,31,23,0,0), + ] + + _transition_info = [ +i(-3180,0,'FMT'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(-1200,2400,'SLST'), +i(-3600,0,'WAT'), +i(0,0,'WAT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), +i(3600,3600,'SLST'), +i(0,0,'GMT'), + ] + +Freetown = Freetown() + diff --git a/vendor/pytz/zoneinfo/Africa/Gaborone.py b/vendor/pytz/zoneinfo/Africa/Gaborone.py new file mode 100644 index 00000000..2f7ca37c --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Gaborone.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Gaborone.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Gaborone(DstTzInfo): + '''Africa/Gaborone timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Gaborone' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1943,9,19,0,0,0), +d(1944,3,18,23,0,0), + ] + + _transition_info = [ +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), + ] + +Gaborone = Gaborone() + diff --git a/vendor/pytz/zoneinfo/Africa/Harare.py b/vendor/pytz/zoneinfo/Africa/Harare.py new file mode 100644 index 00000000..3dd81aaa --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Harare.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Harare.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Harare(DstTzInfo): + '''Africa/Harare timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Harare' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,21,55,48), + ] + + _transition_info = [ +i(7440,0,'LMT'), +i(7200,0,'CAT'), + ] + +Harare = Harare() + diff --git a/vendor/pytz/zoneinfo/Africa/Johannesburg.py b/vendor/pytz/zoneinfo/Africa/Johannesburg.py new file mode 100644 index 00000000..09bde279 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Johannesburg.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Africa/Johannesburg.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Johannesburg(DstTzInfo): + '''Africa/Johannesburg timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Johannesburg' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,22,30,0), +d(1942,9,20,0,0,0), +d(1943,3,20,23,0,0), +d(1943,9,19,0,0,0), +d(1944,3,18,23,0,0), + ] + + _transition_info = [ +i(5400,0,'SAST'), +i(7200,0,'SAST'), +i(10800,3600,'SAST'), +i(7200,0,'SAST'), +i(10800,3600,'SAST'), +i(7200,0,'SAST'), + ] + +Johannesburg = Johannesburg() + diff --git a/vendor/pytz/zoneinfo/Africa/Kampala.py b/vendor/pytz/zoneinfo/Africa/Kampala.py new file mode 100644 index 00000000..c60e898d --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Kampala.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Africa/Kampala.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kampala(DstTzInfo): + '''Africa/Kampala timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Kampala' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1928,6,30,21,50,20), +d(1929,12,31,21,0,0), +d(1947,12,31,21,30,0), +d(1956,12,31,21,15,15), + ] + + _transition_info = [ +i(7800,0,'LMT'), +i(10800,0,'EAT'), +i(9000,0,'BEAT'), +i(9900,0,'BEAUT'), +i(10800,0,'EAT'), + ] + +Kampala = Kampala() + diff --git a/vendor/pytz/zoneinfo/Africa/Khartoum.py b/vendor/pytz/zoneinfo/Africa/Khartoum.py new file mode 100644 index 00000000..94beac52 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Khartoum.py @@ -0,0 +1,88 @@ +'''tzinfo timezone information for Africa/Khartoum.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Khartoum(DstTzInfo): + '''Africa/Khartoum timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Khartoum' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1930,12,31,21,49,52), +d(1970,4,30,22,0,0), +d(1970,10,14,21,0,0), +d(1971,4,29,22,0,0), +d(1971,10,14,21,0,0), +d(1972,4,29,22,0,0), +d(1972,10,14,21,0,0), +d(1973,4,28,22,0,0), +d(1973,10,14,21,0,0), +d(1974,4,27,22,0,0), +d(1974,10,14,21,0,0), +d(1975,4,26,22,0,0), +d(1975,10,14,21,0,0), +d(1976,4,24,22,0,0), +d(1976,10,14,21,0,0), +d(1977,4,23,22,0,0), +d(1977,10,14,21,0,0), +d(1978,4,29,22,0,0), +d(1978,10,14,21,0,0), +d(1979,4,28,22,0,0), +d(1979,10,14,21,0,0), +d(1980,4,26,22,0,0), +d(1980,10,14,21,0,0), +d(1981,4,25,22,0,0), +d(1981,10,14,21,0,0), +d(1982,4,24,22,0,0), +d(1982,10,14,21,0,0), +d(1983,4,23,22,0,0), +d(1983,10,14,21,0,0), +d(1984,4,28,22,0,0), +d(1984,10,14,21,0,0), +d(1985,4,27,22,0,0), +d(1985,10,14,21,0,0), +d(2000,1,15,10,0,0), + ] + + _transition_info = [ +i(7800,0,'LMT'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,3600,'CAST'), +i(7200,0,'CAT'), +i(10800,0,'EAT'), + ] + +Khartoum = Khartoum() + diff --git a/vendor/pytz/zoneinfo/Africa/Kigali.py b/vendor/pytz/zoneinfo/Africa/Kigali.py new file mode 100644 index 00000000..eaf21aa8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Kigali.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Kigali.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kigali(DstTzInfo): + '''Africa/Kigali timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Kigali' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1935,5,31,21,59,44), + ] + + _transition_info = [ +i(7200,0,'LMT'), +i(7200,0,'CAT'), + ] + +Kigali = Kigali() + diff --git a/vendor/pytz/zoneinfo/Africa/Kinshasa.py b/vendor/pytz/zoneinfo/Africa/Kinshasa.py new file mode 100644 index 00000000..abba1690 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Kinshasa.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Africa/Kinshasa.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Kinshasa(StaticTzInfo): + '''Africa/Kinshasa timezone definition. See datetime.tzinfo for details''' + zone = 'Africa/Kinshasa' + _utcoffset = timedelta(seconds=3600) + _tzname = 'WAT' + +Kinshasa = Kinshasa() + diff --git a/vendor/pytz/zoneinfo/Africa/Lagos.py b/vendor/pytz/zoneinfo/Africa/Lagos.py new file mode 100644 index 00000000..23a616fa --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Lagos.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Lagos.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lagos(DstTzInfo): + '''Africa/Lagos timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Lagos' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,8,31,23,46,24), + ] + + _transition_info = [ +i(840,0,'LMT'), +i(3600,0,'WAT'), + ] + +Lagos = Lagos() + diff --git a/vendor/pytz/zoneinfo/Africa/Libreville.py b/vendor/pytz/zoneinfo/Africa/Libreville.py new file mode 100644 index 00000000..26c4bdf9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Libreville.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Libreville.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Libreville(DstTzInfo): + '''Africa/Libreville timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Libreville' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,23,22,12), + ] + + _transition_info = [ +i(2280,0,'LMT'), +i(3600,0,'WAT'), + ] + +Libreville = Libreville() + diff --git a/vendor/pytz/zoneinfo/Africa/Lome.py b/vendor/pytz/zoneinfo/Africa/Lome.py new file mode 100644 index 00000000..f161dddf --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Lome.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Africa/Lome.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Lome(StaticTzInfo): + '''Africa/Lome timezone definition. See datetime.tzinfo for details''' + zone = 'Africa/Lome' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +Lome = Lome() + diff --git a/vendor/pytz/zoneinfo/Africa/Luanda.py b/vendor/pytz/zoneinfo/Africa/Luanda.py new file mode 100644 index 00000000..80528f6f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Luanda.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Luanda.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Luanda(DstTzInfo): + '''Africa/Luanda timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Luanda' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,25,23,7,56), + ] + + _transition_info = [ +i(3120,0,'AOT'), +i(3600,0,'WAT'), + ] + +Luanda = Luanda() + diff --git a/vendor/pytz/zoneinfo/Africa/Lubumbashi.py b/vendor/pytz/zoneinfo/Africa/Lubumbashi.py new file mode 100644 index 00000000..a9d6411f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Lubumbashi.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Africa/Lubumbashi.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Lubumbashi(StaticTzInfo): + '''Africa/Lubumbashi timezone definition. See datetime.tzinfo for details''' + zone = 'Africa/Lubumbashi' + _utcoffset = timedelta(seconds=7200) + _tzname = 'CAT' + +Lubumbashi = Lubumbashi() + diff --git a/vendor/pytz/zoneinfo/Africa/Lusaka.py b/vendor/pytz/zoneinfo/Africa/Lusaka.py new file mode 100644 index 00000000..cb92fb80 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Lusaka.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Lusaka.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lusaka(DstTzInfo): + '''Africa/Lusaka timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Lusaka' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,22,6,52), + ] + + _transition_info = [ +i(6780,0,'LMT'), +i(7200,0,'CAT'), + ] + +Lusaka = Lusaka() + diff --git a/vendor/pytz/zoneinfo/Africa/Malabo.py b/vendor/pytz/zoneinfo/Africa/Malabo.py new file mode 100644 index 00000000..c5ec85e6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Malabo.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Malabo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Malabo(DstTzInfo): + '''Africa/Malabo timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Malabo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,23,24,52), +d(1963,12,15,0,0,0), + ] + + _transition_info = [ +i(2100,0,'LMT'), +i(0,0,'GMT'), +i(3600,0,'WAT'), + ] + +Malabo = Malabo() + diff --git a/vendor/pytz/zoneinfo/Africa/Maputo.py b/vendor/pytz/zoneinfo/Africa/Maputo.py new file mode 100644 index 00000000..69b83ebf --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Maputo.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Maputo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Maputo(DstTzInfo): + '''Africa/Maputo timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Maputo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,21,49,40), + ] + + _transition_info = [ +i(7800,0,'LMT'), +i(7200,0,'CAT'), + ] + +Maputo = Maputo() + diff --git a/vendor/pytz/zoneinfo/Africa/Maseru.py b/vendor/pytz/zoneinfo/Africa/Maseru.py new file mode 100644 index 00000000..d49b14f6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Maseru.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Maseru.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Maseru(DstTzInfo): + '''Africa/Maseru timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Maseru' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,22,10,0), +d(1943,9,19,0,0,0), +d(1944,3,18,23,0,0), + ] + + _transition_info = [ +i(6600,0,'LMT'), +i(7200,0,'SAST'), +i(10800,3600,'SAST'), +i(7200,0,'SAST'), + ] + +Maseru = Maseru() + diff --git a/vendor/pytz/zoneinfo/Africa/Mbabane.py b/vendor/pytz/zoneinfo/Africa/Mbabane.py new file mode 100644 index 00000000..caf48cc7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Mbabane.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Mbabane.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mbabane(DstTzInfo): + '''Africa/Mbabane timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Mbabane' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,21,55,36), + ] + + _transition_info = [ +i(7440,0,'LMT'), +i(7200,0,'SAST'), + ] + +Mbabane = Mbabane() + diff --git a/vendor/pytz/zoneinfo/Africa/Mogadishu.py b/vendor/pytz/zoneinfo/Africa/Mogadishu.py new file mode 100644 index 00000000..fd871e15 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Mogadishu.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Mogadishu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mogadishu(DstTzInfo): + '''Africa/Mogadishu timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Mogadishu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1930,12,31,21,0,0), +d(1956,12,31,21,30,0), + ] + + _transition_info = [ +i(10800,0,'EAT'), +i(9000,0,'BEAT'), +i(10800,0,'EAT'), + ] + +Mogadishu = Mogadishu() + diff --git a/vendor/pytz/zoneinfo/Africa/Monrovia.py b/vendor/pytz/zoneinfo/Africa/Monrovia.py new file mode 100644 index 00000000..15a42685 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Monrovia.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Monrovia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Monrovia(DstTzInfo): + '''Africa/Monrovia timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Monrovia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,3,1,0,43,8), +d(1972,5,1,0,44,30), + ] + + _transition_info = [ +i(-2580,0,'MMT'), +i(-2640,0,'LRT'), +i(0,0,'GMT'), + ] + +Monrovia = Monrovia() + diff --git a/vendor/pytz/zoneinfo/Africa/Nairobi.py b/vendor/pytz/zoneinfo/Africa/Nairobi.py new file mode 100644 index 00000000..fbee2de7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Nairobi.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Africa/Nairobi.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nairobi(DstTzInfo): + '''Africa/Nairobi timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Nairobi' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1928,6,30,21,32,44), +d(1929,12,31,21,0,0), +d(1939,12,31,21,30,0), +d(1959,12,31,21,15,15), + ] + + _transition_info = [ +i(8820,0,'LMT'), +i(10800,0,'EAT'), +i(9000,0,'BEAT'), +i(9900,0,'BEAUT'), +i(10800,0,'EAT'), + ] + +Nairobi = Nairobi() + diff --git a/vendor/pytz/zoneinfo/Africa/Ndjamena.py b/vendor/pytz/zoneinfo/Africa/Ndjamena.py new file mode 100644 index 00000000..52a0ea83 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Ndjamena.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Ndjamena.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ndjamena(DstTzInfo): + '''Africa/Ndjamena timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Ndjamena' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,22,59,48), +d(1979,10,13,23,0,0), +d(1980,3,7,22,0,0), + ] + + _transition_info = [ +i(3600,0,'LMT'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), + ] + +Ndjamena = Ndjamena() + diff --git a/vendor/pytz/zoneinfo/Africa/Niamey.py b/vendor/pytz/zoneinfo/Africa/Niamey.py new file mode 100644 index 00000000..f4ffd54d --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Niamey.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Niamey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Niamey(DstTzInfo): + '''Africa/Niamey timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Niamey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,23,51,32), +d(1934,2,26,1,0,0), +d(1960,1,1,0,0,0), + ] + + _transition_info = [ +i(480,0,'LMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), +i(3600,0,'WAT'), + ] + +Niamey = Niamey() + diff --git a/vendor/pytz/zoneinfo/Africa/Nouakchott.py b/vendor/pytz/zoneinfo/Africa/Nouakchott.py new file mode 100644 index 00000000..1c35ec79 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Nouakchott.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Nouakchott.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nouakchott(DstTzInfo): + '''Africa/Nouakchott timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Nouakchott' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,1,3,48), +d(1934,2,26,0,0,0), +d(1960,11,28,1,0,0), + ] + + _transition_info = [ +i(-3840,0,'LMT'), +i(0,0,'GMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Nouakchott = Nouakchott() + diff --git a/vendor/pytz/zoneinfo/Africa/Ouagadougou.py b/vendor/pytz/zoneinfo/Africa/Ouagadougou.py new file mode 100644 index 00000000..1019d179 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Ouagadougou.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Ouagadougou.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ouagadougou(DstTzInfo): + '''Africa/Ouagadougou timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Ouagadougou' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,6,4), + ] + + _transition_info = [ +i(-360,0,'LMT'), +i(0,0,'GMT'), + ] + +Ouagadougou = Ouagadougou() + diff --git a/vendor/pytz/zoneinfo/Africa/Porto_minus_Novo.py b/vendor/pytz/zoneinfo/Africa/Porto_minus_Novo.py new file mode 100644 index 00000000..867c468f --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Porto_minus_Novo.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Africa/Porto_minus_Novo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Porto_minus_Novo(DstTzInfo): + '''Africa/Porto_minus_Novo timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Porto_minus_Novo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,23,49,32), +d(1934,2,26,0,0,0), + ] + + _transition_info = [ +i(600,0,'LMT'), +i(0,0,'GMT'), +i(3600,0,'WAT'), + ] + +Porto_minus_Novo = Porto_minus_Novo() + diff --git a/vendor/pytz/zoneinfo/Africa/Sao_Tome.py b/vendor/pytz/zoneinfo/Africa/Sao_Tome.py new file mode 100644 index 00000000..427b6d00 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Sao_Tome.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Africa/Sao_Tome.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sao_Tome(DstTzInfo): + '''Africa/Sao_Tome timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Sao_Tome' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,36,32), + ] + + _transition_info = [ +i(-2220,0,'LMT'), +i(0,0,'GMT'), + ] + +Sao_Tome = Sao_Tome() + diff --git a/vendor/pytz/zoneinfo/Africa/Timbuktu.py b/vendor/pytz/zoneinfo/Africa/Timbuktu.py new file mode 100644 index 00000000..adc88f9a --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Timbuktu.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Africa/Timbuktu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Timbuktu(DstTzInfo): + '''Africa/Timbuktu timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Timbuktu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,32,0), +d(1934,2,26,0,0,0), +d(1960,6,20,1,0,0), + ] + + _transition_info = [ +i(-1920,0,'LMT'), +i(0,0,'GMT'), +i(-3600,0,'WAT'), +i(0,0,'GMT'), + ] + +Timbuktu = Timbuktu() + diff --git a/vendor/pytz/zoneinfo/Africa/Tripoli.py b/vendor/pytz/zoneinfo/Africa/Tripoli.py new file mode 100644 index 00000000..d4752dc9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Tripoli.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for Africa/Tripoli.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tripoli(DstTzInfo): + '''Africa/Tripoli timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Tripoli' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,23,7,16), +d(1951,10,14,1,0,0), +d(1951,12,31,22,0,0), +d(1953,10,9,1,0,0), +d(1953,12,31,22,0,0), +d(1955,9,29,23,0,0), +d(1955,12,31,22,0,0), +d(1958,12,31,23,0,0), +d(1981,12,31,22,0,0), +d(1982,3,31,23,0,0), +d(1982,9,30,22,0,0), +d(1983,3,31,23,0,0), +d(1983,9,30,22,0,0), +d(1984,3,31,23,0,0), +d(1984,9,30,22,0,0), +d(1985,4,5,23,0,0), +d(1985,9,30,22,0,0), +d(1986,4,3,23,0,0), +d(1986,10,2,22,0,0), +d(1987,3,31,23,0,0), +d(1987,9,30,22,0,0), +d(1988,3,31,23,0,0), +d(1988,9,30,22,0,0), +d(1989,3,31,23,0,0), +d(1989,9,30,22,0,0), +d(1990,5,3,23,0,0), +d(1996,9,29,22,0,0), +d(1997,4,3,23,0,0), +d(1997,10,3,22,0,0), + ] + + _transition_info = [ +i(3180,0,'LMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,0,'EET'), + ] + +Tripoli = Tripoli() + diff --git a/vendor/pytz/zoneinfo/Africa/Tunis.py b/vendor/pytz/zoneinfo/Africa/Tunis.py new file mode 100644 index 00000000..b5346855 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Tunis.py @@ -0,0 +1,202 @@ +'''tzinfo timezone information for Africa/Tunis.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tunis(DstTzInfo): + '''Africa/Tunis timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Tunis' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,3,10,23,50,39), +d(1939,4,15,22,0,0), +d(1939,11,18,22,0,0), +d(1940,2,25,22,0,0), +d(1941,10,5,22,0,0), +d(1942,3,8,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,4,17,0,0,0), +d(1943,4,25,1,0,0), +d(1943,10,4,0,0,0), +d(1944,4,3,1,0,0), +d(1944,10,7,22,0,0), +d(1945,4,2,1,0,0), +d(1945,9,15,22,0,0), +d(1977,4,29,23,0,0), +d(1977,9,23,23,0,0), +d(1978,4,30,23,0,0), +d(1978,9,30,23,0,0), +d(1988,5,31,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,4,30,23,0,0), +d(1990,9,29,23,0,0), +d(2005,4,30,23,0,0), +d(2005,9,30,0,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(540,0,'PMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Tunis = Tunis() + diff --git a/vendor/pytz/zoneinfo/Africa/Windhoek.py b/vendor/pytz/zoneinfo/Africa/Windhoek.py new file mode 100644 index 00000000..58bca755 --- /dev/null +++ b/vendor/pytz/zoneinfo/Africa/Windhoek.py @@ -0,0 +1,204 @@ +'''tzinfo timezone information for Africa/Windhoek.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Windhoek(DstTzInfo): + '''Africa/Windhoek timezone definition. See datetime.tzinfo for details''' + + zone = 'Africa/Windhoek' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1903,2,28,22,30,0), +d(1942,9,20,0,0,0), +d(1943,3,20,23,0,0), +d(1990,3,20,22,0,0), +d(1994,4,2,22,0,0), +d(1994,9,4,1,0,0), +d(1995,4,2,0,0,0), +d(1995,9,3,1,0,0), +d(1996,4,7,0,0,0), +d(1996,9,1,1,0,0), +d(1997,4,6,0,0,0), +d(1997,9,7,1,0,0), +d(1998,4,5,0,0,0), +d(1998,9,6,1,0,0), +d(1999,4,4,0,0,0), +d(1999,9,5,1,0,0), +d(2000,4,2,0,0,0), +d(2000,9,3,1,0,0), +d(2001,4,1,0,0,0), +d(2001,9,2,1,0,0), +d(2002,4,7,0,0,0), +d(2002,9,1,1,0,0), +d(2003,4,6,0,0,0), +d(2003,9,7,1,0,0), +d(2004,4,4,0,0,0), +d(2004,9,5,1,0,0), +d(2005,4,3,0,0,0), +d(2005,9,4,1,0,0), +d(2006,4,2,0,0,0), +d(2006,9,3,1,0,0), +d(2007,4,1,0,0,0), +d(2007,9,2,1,0,0), +d(2008,4,6,0,0,0), +d(2008,9,7,1,0,0), +d(2009,4,5,0,0,0), +d(2009,9,6,1,0,0), +d(2010,4,4,0,0,0), +d(2010,9,5,1,0,0), +d(2011,4,3,0,0,0), +d(2011,9,4,1,0,0), +d(2012,4,1,0,0,0), +d(2012,9,2,1,0,0), +d(2013,4,7,0,0,0), +d(2013,9,1,1,0,0), +d(2014,4,6,0,0,0), +d(2014,9,7,1,0,0), +d(2015,4,5,0,0,0), +d(2015,9,6,1,0,0), +d(2016,4,3,0,0,0), +d(2016,9,4,1,0,0), +d(2017,4,2,0,0,0), +d(2017,9,3,1,0,0), +d(2018,4,1,0,0,0), +d(2018,9,2,1,0,0), +d(2019,4,7,0,0,0), +d(2019,9,1,1,0,0), +d(2020,4,5,0,0,0), +d(2020,9,6,1,0,0), +d(2021,4,4,0,0,0), +d(2021,9,5,1,0,0), +d(2022,4,3,0,0,0), +d(2022,9,4,1,0,0), +d(2023,4,2,0,0,0), +d(2023,9,3,1,0,0), +d(2024,4,7,0,0,0), +d(2024,9,1,1,0,0), +d(2025,4,6,0,0,0), +d(2025,9,7,1,0,0), +d(2026,4,5,0,0,0), +d(2026,9,6,1,0,0), +d(2027,4,4,0,0,0), +d(2027,9,5,1,0,0), +d(2028,4,2,0,0,0), +d(2028,9,3,1,0,0), +d(2029,4,1,0,0,0), +d(2029,9,2,1,0,0), +d(2030,4,7,0,0,0), +d(2030,9,1,1,0,0), +d(2031,4,6,0,0,0), +d(2031,9,7,1,0,0), +d(2032,4,4,0,0,0), +d(2032,9,5,1,0,0), +d(2033,4,3,0,0,0), +d(2033,9,4,1,0,0), +d(2034,4,2,0,0,0), +d(2034,9,3,1,0,0), +d(2035,4,1,0,0,0), +d(2035,9,2,1,0,0), +d(2036,4,6,0,0,0), +d(2036,9,7,1,0,0), +d(2037,4,5,0,0,0), +d(2037,9,6,1,0,0), + ] + + _transition_info = [ +i(5400,0,'SWAT'), +i(7200,0,'SAST'), +i(10800,3600,'SAST'), +i(7200,0,'SAST'), +i(7200,0,'CAT'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), +i(3600,0,'WAT'), +i(7200,3600,'WAST'), + ] + +Windhoek = Windhoek() + diff --git a/vendor/flask/testsuite/test_apps/blueprintapp/apps/__init__.py b/vendor/pytz/zoneinfo/Africa/__init__.py similarity index 100% rename from vendor/flask/testsuite/test_apps/blueprintapp/apps/__init__.py rename to vendor/pytz/zoneinfo/Africa/__init__.py diff --git a/vendor/pytz/zoneinfo/America/Adak.py b/vendor/pytz/zoneinfo/America/Adak.py new file mode 100644 index 00000000..9748947b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Adak.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for America/Adak.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Adak(DstTzInfo): + '''America/Adak timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Adak' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,13,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,12,0,0), +d(1967,4,1,11,0,0), +d(1969,4,27,13,0,0), +d(1969,10,26,12,0,0), +d(1970,4,26,13,0,0), +d(1970,10,25,12,0,0), +d(1971,4,25,13,0,0), +d(1971,10,31,12,0,0), +d(1972,4,30,13,0,0), +d(1972,10,29,12,0,0), +d(1973,4,29,13,0,0), +d(1973,10,28,12,0,0), +d(1974,1,6,13,0,0), +d(1974,10,27,12,0,0), +d(1975,2,23,13,0,0), +d(1975,10,26,12,0,0), +d(1976,4,25,13,0,0), +d(1976,10,31,12,0,0), +d(1977,4,24,13,0,0), +d(1977,10,30,12,0,0), +d(1978,4,30,13,0,0), +d(1978,10,29,12,0,0), +d(1979,4,29,13,0,0), +d(1979,10,28,12,0,0), +d(1980,4,27,13,0,0), +d(1980,10,26,12,0,0), +d(1981,4,26,13,0,0), +d(1981,10,25,12,0,0), +d(1982,4,25,13,0,0), +d(1982,10,31,12,0,0), +d(1983,4,24,13,0,0), +d(1983,10,30,12,0,0), +d(1983,11,30,10,0,0), +d(1984,4,29,12,0,0), +d(1984,10,28,11,0,0), +d(1985,4,28,12,0,0), +d(1985,10,27,11,0,0), +d(1986,4,27,12,0,0), +d(1986,10,26,11,0,0), +d(1987,4,5,12,0,0), +d(1987,10,25,11,0,0), +d(1988,4,3,12,0,0), +d(1988,10,30,11,0,0), +d(1989,4,2,12,0,0), +d(1989,10,29,11,0,0), +d(1990,4,1,12,0,0), +d(1990,10,28,11,0,0), +d(1991,4,7,12,0,0), +d(1991,10,27,11,0,0), +d(1992,4,5,12,0,0), +d(1992,10,25,11,0,0), +d(1993,4,4,12,0,0), +d(1993,10,31,11,0,0), +d(1994,4,3,12,0,0), +d(1994,10,30,11,0,0), +d(1995,4,2,12,0,0), +d(1995,10,29,11,0,0), +d(1996,4,7,12,0,0), +d(1996,10,27,11,0,0), +d(1997,4,6,12,0,0), +d(1997,10,26,11,0,0), +d(1998,4,5,12,0,0), +d(1998,10,25,11,0,0), +d(1999,4,4,12,0,0), +d(1999,10,31,11,0,0), +d(2000,4,2,12,0,0), +d(2000,10,29,11,0,0), +d(2001,4,1,12,0,0), +d(2001,10,28,11,0,0), +d(2002,4,7,12,0,0), +d(2002,10,27,11,0,0), +d(2003,4,6,12,0,0), +d(2003,10,26,11,0,0), +d(2004,4,4,12,0,0), +d(2004,10,31,11,0,0), +d(2005,4,3,12,0,0), +d(2005,10,30,11,0,0), +d(2006,4,2,12,0,0), +d(2006,10,29,11,0,0), +d(2007,3,11,12,0,0), +d(2007,11,4,11,0,0), +d(2008,3,9,12,0,0), +d(2008,11,2,11,0,0), +d(2009,3,8,12,0,0), +d(2009,11,1,11,0,0), +d(2010,3,14,12,0,0), +d(2010,11,7,11,0,0), +d(2011,3,13,12,0,0), +d(2011,11,6,11,0,0), +d(2012,3,11,12,0,0), +d(2012,11,4,11,0,0), +d(2013,3,10,12,0,0), +d(2013,11,3,11,0,0), +d(2014,3,9,12,0,0), +d(2014,11,2,11,0,0), +d(2015,3,8,12,0,0), +d(2015,11,1,11,0,0), +d(2016,3,13,12,0,0), +d(2016,11,6,11,0,0), +d(2017,3,12,12,0,0), +d(2017,11,5,11,0,0), +d(2018,3,11,12,0,0), +d(2018,11,4,11,0,0), +d(2019,3,10,12,0,0), +d(2019,11,3,11,0,0), +d(2020,3,8,12,0,0), +d(2020,11,1,11,0,0), +d(2021,3,14,12,0,0), +d(2021,11,7,11,0,0), +d(2022,3,13,12,0,0), +d(2022,11,6,11,0,0), +d(2023,3,12,12,0,0), +d(2023,11,5,11,0,0), +d(2024,3,10,12,0,0), +d(2024,11,3,11,0,0), +d(2025,3,9,12,0,0), +d(2025,11,2,11,0,0), +d(2026,3,8,12,0,0), +d(2026,11,1,11,0,0), +d(2027,3,14,12,0,0), +d(2027,11,7,11,0,0), +d(2028,3,12,12,0,0), +d(2028,11,5,11,0,0), +d(2029,3,11,12,0,0), +d(2029,11,4,11,0,0), +d(2030,3,10,12,0,0), +d(2030,11,3,11,0,0), +d(2031,3,9,12,0,0), +d(2031,11,2,11,0,0), +d(2032,3,14,12,0,0), +d(2032,11,7,11,0,0), +d(2033,3,13,12,0,0), +d(2033,11,6,11,0,0), +d(2034,3,12,12,0,0), +d(2034,11,5,11,0,0), +d(2035,3,11,12,0,0), +d(2035,11,4,11,0,0), +d(2036,3,9,12,0,0), +d(2036,11,2,11,0,0), +d(2037,3,8,12,0,0), +d(2037,11,1,11,0,0), + ] + + _transition_info = [ +i(-39600,0,'NST'), +i(-36000,3600,'NWT'), +i(-36000,3600,'NPT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-36000,0,'AHST'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), + ] + +Adak = Adak() + diff --git a/vendor/pytz/zoneinfo/America/Anchorage.py b/vendor/pytz/zoneinfo/America/Anchorage.py new file mode 100644 index 00000000..869a8829 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Anchorage.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for America/Anchorage.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Anchorage(DstTzInfo): + '''America/Anchorage timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Anchorage' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,12,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,11,0,0), +d(1967,4,1,10,0,0), +d(1969,4,27,12,0,0), +d(1969,10,26,11,0,0), +d(1970,4,26,12,0,0), +d(1970,10,25,11,0,0), +d(1971,4,25,12,0,0), +d(1971,10,31,11,0,0), +d(1972,4,30,12,0,0), +d(1972,10,29,11,0,0), +d(1973,4,29,12,0,0), +d(1973,10,28,11,0,0), +d(1974,1,6,12,0,0), +d(1974,10,27,11,0,0), +d(1975,2,23,12,0,0), +d(1975,10,26,11,0,0), +d(1976,4,25,12,0,0), +d(1976,10,31,11,0,0), +d(1977,4,24,12,0,0), +d(1977,10,30,11,0,0), +d(1978,4,30,12,0,0), +d(1978,10,29,11,0,0), +d(1979,4,29,12,0,0), +d(1979,10,28,11,0,0), +d(1980,4,27,12,0,0), +d(1980,10,26,11,0,0), +d(1981,4,26,12,0,0), +d(1981,10,25,11,0,0), +d(1982,4,25,12,0,0), +d(1982,10,31,11,0,0), +d(1983,4,24,12,0,0), +d(1983,10,30,11,0,0), +d(1983,11,30,9,0,0), +d(1984,4,29,11,0,0), +d(1984,10,28,10,0,0), +d(1985,4,28,11,0,0), +d(1985,10,27,10,0,0), +d(1986,4,27,11,0,0), +d(1986,10,26,10,0,0), +d(1987,4,5,11,0,0), +d(1987,10,25,10,0,0), +d(1988,4,3,11,0,0), +d(1988,10,30,10,0,0), +d(1989,4,2,11,0,0), +d(1989,10,29,10,0,0), +d(1990,4,1,11,0,0), +d(1990,10,28,10,0,0), +d(1991,4,7,11,0,0), +d(1991,10,27,10,0,0), +d(1992,4,5,11,0,0), +d(1992,10,25,10,0,0), +d(1993,4,4,11,0,0), +d(1993,10,31,10,0,0), +d(1994,4,3,11,0,0), +d(1994,10,30,10,0,0), +d(1995,4,2,11,0,0), +d(1995,10,29,10,0,0), +d(1996,4,7,11,0,0), +d(1996,10,27,10,0,0), +d(1997,4,6,11,0,0), +d(1997,10,26,10,0,0), +d(1998,4,5,11,0,0), +d(1998,10,25,10,0,0), +d(1999,4,4,11,0,0), +d(1999,10,31,10,0,0), +d(2000,4,2,11,0,0), +d(2000,10,29,10,0,0), +d(2001,4,1,11,0,0), +d(2001,10,28,10,0,0), +d(2002,4,7,11,0,0), +d(2002,10,27,10,0,0), +d(2003,4,6,11,0,0), +d(2003,10,26,10,0,0), +d(2004,4,4,11,0,0), +d(2004,10,31,10,0,0), +d(2005,4,3,11,0,0), +d(2005,10,30,10,0,0), +d(2006,4,2,11,0,0), +d(2006,10,29,10,0,0), +d(2007,3,11,11,0,0), +d(2007,11,4,10,0,0), +d(2008,3,9,11,0,0), +d(2008,11,2,10,0,0), +d(2009,3,8,11,0,0), +d(2009,11,1,10,0,0), +d(2010,3,14,11,0,0), +d(2010,11,7,10,0,0), +d(2011,3,13,11,0,0), +d(2011,11,6,10,0,0), +d(2012,3,11,11,0,0), +d(2012,11,4,10,0,0), +d(2013,3,10,11,0,0), +d(2013,11,3,10,0,0), +d(2014,3,9,11,0,0), +d(2014,11,2,10,0,0), +d(2015,3,8,11,0,0), +d(2015,11,1,10,0,0), +d(2016,3,13,11,0,0), +d(2016,11,6,10,0,0), +d(2017,3,12,11,0,0), +d(2017,11,5,10,0,0), +d(2018,3,11,11,0,0), +d(2018,11,4,10,0,0), +d(2019,3,10,11,0,0), +d(2019,11,3,10,0,0), +d(2020,3,8,11,0,0), +d(2020,11,1,10,0,0), +d(2021,3,14,11,0,0), +d(2021,11,7,10,0,0), +d(2022,3,13,11,0,0), +d(2022,11,6,10,0,0), +d(2023,3,12,11,0,0), +d(2023,11,5,10,0,0), +d(2024,3,10,11,0,0), +d(2024,11,3,10,0,0), +d(2025,3,9,11,0,0), +d(2025,11,2,10,0,0), +d(2026,3,8,11,0,0), +d(2026,11,1,10,0,0), +d(2027,3,14,11,0,0), +d(2027,11,7,10,0,0), +d(2028,3,12,11,0,0), +d(2028,11,5,10,0,0), +d(2029,3,11,11,0,0), +d(2029,11,4,10,0,0), +d(2030,3,10,11,0,0), +d(2030,11,3,10,0,0), +d(2031,3,9,11,0,0), +d(2031,11,2,10,0,0), +d(2032,3,14,11,0,0), +d(2032,11,7,10,0,0), +d(2033,3,13,11,0,0), +d(2033,11,6,10,0,0), +d(2034,3,12,11,0,0), +d(2034,11,5,10,0,0), +d(2035,3,11,11,0,0), +d(2035,11,4,10,0,0), +d(2036,3,9,11,0,0), +d(2036,11,2,10,0,0), +d(2037,3,8,11,0,0), +d(2037,11,1,10,0,0), + ] + + _transition_info = [ +i(-36000,0,'CAT'), +i(-32400,3600,'CAWT'), +i(-32400,3600,'CAPT'), +i(-36000,0,'CAT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-32400,0,'YST'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), + ] + +Anchorage = Anchorage() + diff --git a/vendor/pytz/zoneinfo/America/Anguilla.py b/vendor/pytz/zoneinfo/America/Anguilla.py new file mode 100644 index 00000000..e72c84f8 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Anguilla.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Anguilla.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Anguilla(DstTzInfo): + '''America/Anguilla timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Anguilla' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,2,4,12,16), + ] + + _transition_info = [ +i(-15120,0,'LMT'), +i(-14400,0,'AST'), + ] + +Anguilla = Anguilla() + diff --git a/vendor/pytz/zoneinfo/America/Antigua.py b/vendor/pytz/zoneinfo/America/Antigua.py new file mode 100644 index 00000000..7515f841 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Antigua.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/Antigua.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Antigua(DstTzInfo): + '''America/Antigua timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Antigua' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,2,4,7,12), +d(1951,1,1,5,0,0), + ] + + _transition_info = [ +i(-14820,0,'LMT'), +i(-18000,0,'EST'), +i(-14400,0,'AST'), + ] + +Antigua = Antigua() + diff --git a/vendor/pytz/zoneinfo/America/Araguaina.py b/vendor/pytz/zoneinfo/America/Araguaina.py new file mode 100644 index 00000000..60e69fa2 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Araguaina.py @@ -0,0 +1,118 @@ +'''tzinfo timezone information for America/Araguaina.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Araguaina(DstTzInfo): + '''America/Araguaina timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Araguaina' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,12,48), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1995,10,15,3,0,0), +d(1996,2,11,2,0,0), +d(1996,10,6,3,0,0), +d(1997,2,16,2,0,0), +d(1997,10,6,3,0,0), +d(1998,3,1,2,0,0), +d(1998,10,11,3,0,0), +d(1999,2,21,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2001,2,18,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), +d(2002,11,3,3,0,0), +d(2003,2,16,2,0,0), + ] + + _transition_info = [ +i(-11580,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Araguaina = Araguaina() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Buenos_Aires.py b/vendor/pytz/zoneinfo/America/Argentina/Buenos_Aires.py new file mode 100644 index 00000000..0862e0f6 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Buenos_Aires.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Argentina/Buenos_Aires.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Buenos_Aires(DstTzInfo): + '''America/Argentina/Buenos_Aires timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Buenos_Aires' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Buenos_Aires = Buenos_Aires() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Catamarca.py b/vendor/pytz/zoneinfo/America/Argentina/Catamarca.py new file mode 100644 index 00000000..f12423a3 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Catamarca.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/Catamarca.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Catamarca(DstTzInfo): + '''America/Argentina/Catamarca timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Catamarca' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Catamarca = Catamarca() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/ComodRivadavia.py b/vendor/pytz/zoneinfo/America/Argentina/ComodRivadavia.py new file mode 100644 index 00000000..12a1e871 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/ComodRivadavia.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/ComodRivadavia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class ComodRivadavia(DstTzInfo): + '''America/Argentina/ComodRivadavia timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/ComodRivadavia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +ComodRivadavia = ComodRivadavia() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Cordoba.py b/vendor/pytz/zoneinfo/America/Argentina/Cordoba.py new file mode 100644 index 00000000..c880297a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Cordoba.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Argentina/Cordoba.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cordoba(DstTzInfo): + '''America/Argentina/Cordoba timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Cordoba' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Cordoba = Cordoba() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Jujuy.py b/vendor/pytz/zoneinfo/America/Argentina/Jujuy.py new file mode 100644 index 00000000..b6fe1dd3 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Jujuy.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Argentina/Jujuy.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jujuy(DstTzInfo): + '''America/Argentina/Jujuy timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Jujuy' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,28,4,0,0), +d(1991,3,17,3,0,0), +d(1991,10,6,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Jujuy = Jujuy() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/La_Rioja.py b/vendor/pytz/zoneinfo/America/Argentina/La_Rioja.py new file mode 100644 index 00000000..548dd2f2 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/La_Rioja.py @@ -0,0 +1,138 @@ +'''tzinfo timezone information for America/Argentina/La_Rioja.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class La_Rioja(DstTzInfo): + '''America/Argentina/La_Rioja timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/La_Rioja' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,1,2,0,0), +d(1991,5,7,4,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +La_Rioja = La_Rioja() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Mendoza.py b/vendor/pytz/zoneinfo/America/Argentina/Mendoza.py new file mode 100644 index 00000000..e699aa9d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Mendoza.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/Mendoza.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mendoza(DstTzInfo): + '''America/Argentina/Mendoza timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Mendoza' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,15,4,0,0), +d(1991,3,1,3,0,0), +d(1991,10,15,4,0,0), +d(1992,3,1,3,0,0), +d(1992,10,18,4,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,5,23,3,0,0), +d(2004,9,26,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Mendoza = Mendoza() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py b/vendor/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py new file mode 100644 index 00000000..2c234469 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Rio_Gallegos.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/Rio_Gallegos.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rio_Gallegos(DstTzInfo): + '''America/Argentina/Rio_Gallegos timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Rio_Gallegos' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Rio_Gallegos = Rio_Gallegos() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/San_Juan.py b/vendor/pytz/zoneinfo/America/Argentina/San_Juan.py new file mode 100644 index 00000000..cce3e874 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/San_Juan.py @@ -0,0 +1,138 @@ +'''tzinfo timezone information for America/Argentina/San_Juan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class San_Juan(DstTzInfo): + '''America/Argentina/San_Juan timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/San_Juan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,1,2,0,0), +d(1991,5,7,4,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,5,31,3,0,0), +d(2004,7,25,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +San_Juan = San_Juan() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Tucuman.py b/vendor/pytz/zoneinfo/America/Argentina/Tucuman.py new file mode 100644 index 00000000..093eeaa7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Tucuman.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/Tucuman.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tucuman(DstTzInfo): + '''America/Argentina/Tucuman timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Tucuman' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,13,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Tucuman = Tucuman() + diff --git a/vendor/pytz/zoneinfo/America/Argentina/Ushuaia.py b/vendor/pytz/zoneinfo/America/Argentina/Ushuaia.py new file mode 100644 index 00000000..37e681c8 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Argentina/Ushuaia.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Argentina/Ushuaia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ushuaia(DstTzInfo): + '''America/Argentina/Ushuaia timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Argentina/Ushuaia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,5,30,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Ushuaia = Ushuaia() + diff --git a/vendor/flask/testsuite/test_apps/flaskext/__init__.py b/vendor/pytz/zoneinfo/America/Argentina/__init__.py similarity index 100% rename from vendor/flask/testsuite/test_apps/flaskext/__init__.py rename to vendor/pytz/zoneinfo/America/Argentina/__init__.py diff --git a/vendor/pytz/zoneinfo/America/Aruba.py b/vendor/pytz/zoneinfo/America/Aruba.py new file mode 100644 index 00000000..6f7afb01 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Aruba.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/Aruba.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Aruba(DstTzInfo): + '''America/Aruba timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Aruba' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,12,4,40,24), +d(1965,1,1,4,30,0), + ] + + _transition_info = [ +i(-16800,0,'LMT'), +i(-16200,0,'ANT'), +i(-14400,0,'AST'), + ] + +Aruba = Aruba() + diff --git a/vendor/pytz/zoneinfo/America/Asuncion.py b/vendor/pytz/zoneinfo/America/Asuncion.py new file mode 100644 index 00000000..472182dd --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Asuncion.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for America/Asuncion.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Asuncion(DstTzInfo): + '''America/Asuncion timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Asuncion' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1931,10,10,3,50,40), +d(1972,10,1,4,0,0), +d(1974,4,1,3,0,0), +d(1975,10,1,4,0,0), +d(1976,3,1,3,0,0), +d(1976,10,1,4,0,0), +d(1977,3,1,3,0,0), +d(1977,10,1,4,0,0), +d(1978,3,1,3,0,0), +d(1978,10,1,4,0,0), +d(1979,4,1,3,0,0), +d(1979,10,1,4,0,0), +d(1980,4,1,3,0,0), +d(1980,10,1,4,0,0), +d(1981,4,1,3,0,0), +d(1981,10,1,4,0,0), +d(1982,4,1,3,0,0), +d(1982,10,1,4,0,0), +d(1983,4,1,3,0,0), +d(1983,10,1,4,0,0), +d(1984,4,1,3,0,0), +d(1984,10,1,4,0,0), +d(1985,4,1,3,0,0), +d(1985,10,1,4,0,0), +d(1986,4,1,3,0,0), +d(1986,10,1,4,0,0), +d(1987,4,1,3,0,0), +d(1987,10,1,4,0,0), +d(1988,4,1,3,0,0), +d(1988,10,1,4,0,0), +d(1989,4,1,3,0,0), +d(1989,10,22,4,0,0), +d(1990,4,1,3,0,0), +d(1990,10,1,4,0,0), +d(1991,4,1,3,0,0), +d(1991,10,6,4,0,0), +d(1992,3,1,3,0,0), +d(1992,10,5,4,0,0), +d(1993,3,31,3,0,0), +d(1993,10,1,4,0,0), +d(1994,2,27,3,0,0), +d(1994,10,1,4,0,0), +d(1995,2,26,3,0,0), +d(1995,10,1,4,0,0), +d(1996,3,1,3,0,0), +d(1996,10,6,4,0,0), +d(1997,2,23,3,0,0), +d(1997,10,5,4,0,0), +d(1998,3,1,3,0,0), +d(1998,10,4,4,0,0), +d(1999,3,7,3,0,0), +d(1999,10,3,4,0,0), +d(2000,3,5,3,0,0), +d(2000,10,1,4,0,0), +d(2001,3,4,3,0,0), +d(2001,10,7,4,0,0), +d(2002,4,7,3,0,0), +d(2002,9,1,4,0,0), +d(2003,4,6,3,0,0), +d(2003,9,7,4,0,0), +d(2004,4,4,3,0,0), +d(2004,10,17,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,16,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,21,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,19,4,0,0), +d(2009,3,8,3,0,0), +d(2009,10,18,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,17,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,16,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,21,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,20,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,19,4,0,0), +d(2015,3,8,3,0,0), +d(2015,10,18,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,16,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,21,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,20,4,0,0), +d(2020,3,8,3,0,0), +d(2020,10,18,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,17,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,16,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,20,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,19,4,0,0), +d(2026,3,8,3,0,0), +d(2026,10,18,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,17,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,21,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,20,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,19,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,17,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,16,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,21,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,19,4,0,0), +d(2037,3,8,3,0,0), +d(2037,10,18,4,0,0), + ] + + _transition_info = [ +i(-13860,0,'AMT'), +i(-14400,0,'PYT'), +i(-10800,0,'PYT'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), +i(-14400,0,'PYT'), +i(-10800,3600,'PYST'), + ] + +Asuncion = Asuncion() + diff --git a/vendor/pytz/zoneinfo/America/Atikokan.py b/vendor/pytz/zoneinfo/America/Atikokan.py new file mode 100644 index 00000000..07bc0a12 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Atikokan.py @@ -0,0 +1,32 @@ +'''tzinfo timezone information for America/Atikokan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Atikokan(DstTzInfo): + '''America/Atikokan timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Atikokan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,8,0,0), +d(1918,10,31,7,0,0), +d(1940,9,29,6,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-18000,0,'EST'), + ] + +Atikokan = Atikokan() + diff --git a/vendor/pytz/zoneinfo/America/Atka.py b/vendor/pytz/zoneinfo/America/Atka.py new file mode 100644 index 00000000..ab5d0dcb --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Atka.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for America/Atka.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Atka(DstTzInfo): + '''America/Atka timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Atka' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,13,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,12,0,0), +d(1967,4,1,11,0,0), +d(1969,4,27,13,0,0), +d(1969,10,26,12,0,0), +d(1970,4,26,13,0,0), +d(1970,10,25,12,0,0), +d(1971,4,25,13,0,0), +d(1971,10,31,12,0,0), +d(1972,4,30,13,0,0), +d(1972,10,29,12,0,0), +d(1973,4,29,13,0,0), +d(1973,10,28,12,0,0), +d(1974,1,6,13,0,0), +d(1974,10,27,12,0,0), +d(1975,2,23,13,0,0), +d(1975,10,26,12,0,0), +d(1976,4,25,13,0,0), +d(1976,10,31,12,0,0), +d(1977,4,24,13,0,0), +d(1977,10,30,12,0,0), +d(1978,4,30,13,0,0), +d(1978,10,29,12,0,0), +d(1979,4,29,13,0,0), +d(1979,10,28,12,0,0), +d(1980,4,27,13,0,0), +d(1980,10,26,12,0,0), +d(1981,4,26,13,0,0), +d(1981,10,25,12,0,0), +d(1982,4,25,13,0,0), +d(1982,10,31,12,0,0), +d(1983,4,24,13,0,0), +d(1983,10,30,12,0,0), +d(1983,11,30,10,0,0), +d(1984,4,29,12,0,0), +d(1984,10,28,11,0,0), +d(1985,4,28,12,0,0), +d(1985,10,27,11,0,0), +d(1986,4,27,12,0,0), +d(1986,10,26,11,0,0), +d(1987,4,5,12,0,0), +d(1987,10,25,11,0,0), +d(1988,4,3,12,0,0), +d(1988,10,30,11,0,0), +d(1989,4,2,12,0,0), +d(1989,10,29,11,0,0), +d(1990,4,1,12,0,0), +d(1990,10,28,11,0,0), +d(1991,4,7,12,0,0), +d(1991,10,27,11,0,0), +d(1992,4,5,12,0,0), +d(1992,10,25,11,0,0), +d(1993,4,4,12,0,0), +d(1993,10,31,11,0,0), +d(1994,4,3,12,0,0), +d(1994,10,30,11,0,0), +d(1995,4,2,12,0,0), +d(1995,10,29,11,0,0), +d(1996,4,7,12,0,0), +d(1996,10,27,11,0,0), +d(1997,4,6,12,0,0), +d(1997,10,26,11,0,0), +d(1998,4,5,12,0,0), +d(1998,10,25,11,0,0), +d(1999,4,4,12,0,0), +d(1999,10,31,11,0,0), +d(2000,4,2,12,0,0), +d(2000,10,29,11,0,0), +d(2001,4,1,12,0,0), +d(2001,10,28,11,0,0), +d(2002,4,7,12,0,0), +d(2002,10,27,11,0,0), +d(2003,4,6,12,0,0), +d(2003,10,26,11,0,0), +d(2004,4,4,12,0,0), +d(2004,10,31,11,0,0), +d(2005,4,3,12,0,0), +d(2005,10,30,11,0,0), +d(2006,4,2,12,0,0), +d(2006,10,29,11,0,0), +d(2007,3,11,12,0,0), +d(2007,11,4,11,0,0), +d(2008,3,9,12,0,0), +d(2008,11,2,11,0,0), +d(2009,3,8,12,0,0), +d(2009,11,1,11,0,0), +d(2010,3,14,12,0,0), +d(2010,11,7,11,0,0), +d(2011,3,13,12,0,0), +d(2011,11,6,11,0,0), +d(2012,3,11,12,0,0), +d(2012,11,4,11,0,0), +d(2013,3,10,12,0,0), +d(2013,11,3,11,0,0), +d(2014,3,9,12,0,0), +d(2014,11,2,11,0,0), +d(2015,3,8,12,0,0), +d(2015,11,1,11,0,0), +d(2016,3,13,12,0,0), +d(2016,11,6,11,0,0), +d(2017,3,12,12,0,0), +d(2017,11,5,11,0,0), +d(2018,3,11,12,0,0), +d(2018,11,4,11,0,0), +d(2019,3,10,12,0,0), +d(2019,11,3,11,0,0), +d(2020,3,8,12,0,0), +d(2020,11,1,11,0,0), +d(2021,3,14,12,0,0), +d(2021,11,7,11,0,0), +d(2022,3,13,12,0,0), +d(2022,11,6,11,0,0), +d(2023,3,12,12,0,0), +d(2023,11,5,11,0,0), +d(2024,3,10,12,0,0), +d(2024,11,3,11,0,0), +d(2025,3,9,12,0,0), +d(2025,11,2,11,0,0), +d(2026,3,8,12,0,0), +d(2026,11,1,11,0,0), +d(2027,3,14,12,0,0), +d(2027,11,7,11,0,0), +d(2028,3,12,12,0,0), +d(2028,11,5,11,0,0), +d(2029,3,11,12,0,0), +d(2029,11,4,11,0,0), +d(2030,3,10,12,0,0), +d(2030,11,3,11,0,0), +d(2031,3,9,12,0,0), +d(2031,11,2,11,0,0), +d(2032,3,14,12,0,0), +d(2032,11,7,11,0,0), +d(2033,3,13,12,0,0), +d(2033,11,6,11,0,0), +d(2034,3,12,12,0,0), +d(2034,11,5,11,0,0), +d(2035,3,11,12,0,0), +d(2035,11,4,11,0,0), +d(2036,3,9,12,0,0), +d(2036,11,2,11,0,0), +d(2037,3,8,12,0,0), +d(2037,11,1,11,0,0), + ] + + _transition_info = [ +i(-39600,0,'NST'), +i(-36000,3600,'NWT'), +i(-36000,3600,'NPT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-36000,0,'AHST'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), + ] + +Atka = Atka() + diff --git a/vendor/pytz/zoneinfo/America/Bahia.py b/vendor/pytz/zoneinfo/America/Bahia.py new file mode 100644 index 00000000..5d4d5c5d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Bahia.py @@ -0,0 +1,138 @@ +'''tzinfo timezone information for America/Bahia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bahia(DstTzInfo): + '''America/Bahia timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Bahia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,34,4), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1990,10,21,3,0,0), +d(1991,2,17,2,0,0), +d(1991,10,20,3,0,0), +d(1992,2,9,2,0,0), +d(1992,10,25,3,0,0), +d(1993,1,31,2,0,0), +d(1993,10,17,3,0,0), +d(1994,2,20,2,0,0), +d(1994,10,16,3,0,0), +d(1995,2,19,2,0,0), +d(1995,10,15,3,0,0), +d(1996,2,11,2,0,0), +d(1996,10,6,3,0,0), +d(1997,2,16,2,0,0), +d(1997,10,6,3,0,0), +d(1998,3,1,2,0,0), +d(1998,10,11,3,0,0), +d(1999,2,21,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2001,2,18,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), +d(2002,11,3,3,0,0), +d(2003,2,16,2,0,0), + ] + + _transition_info = [ +i(-9240,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Bahia = Bahia() + diff --git a/vendor/pytz/zoneinfo/America/Barbados.py b/vendor/pytz/zoneinfo/America/Barbados.py new file mode 100644 index 00000000..97ba8c65 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Barbados.py @@ -0,0 +1,40 @@ +'''tzinfo timezone information for America/Barbados.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Barbados(DstTzInfo): + '''America/Barbados timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Barbados' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,1,1,3,58,28), +d(1932,1,1,3,58,28), +d(1977,6,12,6,0,0), +d(1977,10,2,5,0,0), +d(1978,4,16,6,0,0), +d(1978,10,1,5,0,0), +d(1979,4,15,6,0,0), +d(1979,9,30,5,0,0), +d(1980,4,20,6,0,0), +d(1980,9,25,5,0,0), + ] + + _transition_info = [ +i(-14280,0,'LMT'), +i(-14280,0,'BMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Barbados = Barbados() + diff --git a/vendor/pytz/zoneinfo/America/Belem.py b/vendor/pytz/zoneinfo/America/Belem.py new file mode 100644 index 00000000..f35f1999 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Belem.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for America/Belem.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Belem(DstTzInfo): + '''America/Belem timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Belem' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,13,56), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), + ] + + _transition_info = [ +i(-11640,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Belem = Belem() + diff --git a/vendor/pytz/zoneinfo/America/Belize.py b/vendor/pytz/zoneinfo/America/Belize.py new file mode 100644 index 00000000..8f599331 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Belize.py @@ -0,0 +1,130 @@ +'''tzinfo timezone information for America/Belize.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Belize(DstTzInfo): + '''America/Belize timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Belize' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,4,1,5,52,48), +d(1918,10,6,6,0,0), +d(1919,2,9,5,30,0), +d(1919,10,5,6,0,0), +d(1920,2,15,5,30,0), +d(1920,10,3,6,0,0), +d(1921,2,13,5,30,0), +d(1921,10,2,6,0,0), +d(1922,2,12,5,30,0), +d(1922,10,8,6,0,0), +d(1923,2,11,5,30,0), +d(1923,10,7,6,0,0), +d(1924,2,10,5,30,0), +d(1924,10,5,6,0,0), +d(1925,2,15,5,30,0), +d(1925,10,4,6,0,0), +d(1926,2,14,5,30,0), +d(1926,10,3,6,0,0), +d(1927,2,13,5,30,0), +d(1927,10,2,6,0,0), +d(1928,2,12,5,30,0), +d(1928,10,7,6,0,0), +d(1929,2,10,5,30,0), +d(1929,10,6,6,0,0), +d(1930,2,9,5,30,0), +d(1930,10,5,6,0,0), +d(1931,2,15,5,30,0), +d(1931,10,4,6,0,0), +d(1932,2,14,5,30,0), +d(1932,10,2,6,0,0), +d(1933,2,12,5,30,0), +d(1933,10,8,6,0,0), +d(1934,2,11,5,30,0), +d(1934,10,7,6,0,0), +d(1935,2,10,5,30,0), +d(1935,10,6,6,0,0), +d(1936,2,9,5,30,0), +d(1936,10,4,6,0,0), +d(1937,2,14,5,30,0), +d(1937,10,3,6,0,0), +d(1938,2,13,5,30,0), +d(1938,10,2,6,0,0), +d(1939,2,12,5,30,0), +d(1939,10,8,6,0,0), +d(1940,2,11,5,30,0), +d(1940,10,6,6,0,0), +d(1941,2,9,5,30,0), +d(1941,10,5,6,0,0), +d(1942,2,15,5,30,0), +d(1942,10,4,6,0,0), +d(1943,2,14,5,30,0), +d(1973,12,5,6,0,0), +d(1974,2,9,5,0,0), +d(1982,12,18,6,0,0), +d(1983,2,12,5,0,0), + ] + + _transition_info = [ +i(-21180,0,'LMT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-19800,1800,'CHDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Belize = Belize() + diff --git a/vendor/pytz/zoneinfo/America/Blanc_minus_Sablon.py b/vendor/pytz/zoneinfo/America/Blanc_minus_Sablon.py new file mode 100644 index 00000000..87d819ef --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Blanc_minus_Sablon.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for America/Blanc_minus_Sablon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Blanc_minus_Sablon(DstTzInfo): + '''America/Blanc_minus_Sablon timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Blanc_minus_Sablon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,6,0,0), +d(1918,10,31,5,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), + ] + + _transition_info = [ +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), + ] + +Blanc_minus_Sablon = Blanc_minus_Sablon() + diff --git a/vendor/pytz/zoneinfo/America/Boa_Vista.py b/vendor/pytz/zoneinfo/America/Boa_Vista.py new file mode 100644 index 00000000..f533ae97 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Boa_Vista.py @@ -0,0 +1,86 @@ +'''tzinfo timezone information for America/Boa_Vista.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Boa_Vista(DstTzInfo): + '''America/Boa_Vista timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Boa_Vista' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,2,40), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), +d(1999,10,3,4,0,0), +d(2000,2,27,3,0,0), +d(2000,10,8,4,0,0), +d(2000,10,15,3,0,0), + ] + + _transition_info = [ +i(-14580,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), + ] + +Boa_Vista = Boa_Vista() + diff --git a/vendor/pytz/zoneinfo/America/Bogota.py b/vendor/pytz/zoneinfo/America/Bogota.py new file mode 100644 index 00000000..5b295d93 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Bogota.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for America/Bogota.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bogota(DstTzInfo): + '''America/Bogota timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Bogota' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,11,23,4,56,20), +d(1992,5,3,5,0,0), +d(1993,4,4,4,0,0), + ] + + _transition_info = [ +i(-17760,0,'BMT'), +i(-18000,0,'COT'), +i(-14400,3600,'COST'), +i(-18000,0,'COT'), + ] + +Bogota = Bogota() + diff --git a/vendor/pytz/zoneinfo/America/Boise.py b/vendor/pytz/zoneinfo/America/Boise.py new file mode 100644 index 00000000..ed619370 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Boise.py @@ -0,0 +1,320 @@ +'''tzinfo timezone information for America/Boise.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Boise(DstTzInfo): + '''America/Boise timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Boise' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,10,0,0), +d(1918,10,27,9,0,0), +d(1919,3,30,10,0,0), +d(1919,10,26,9,0,0), +d(1923,5,13,10,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,2,3,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Boise = Boise() + diff --git a/vendor/pytz/zoneinfo/America/Buenos_Aires.py b/vendor/pytz/zoneinfo/America/Buenos_Aires.py new file mode 100644 index 00000000..2a457607 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Buenos_Aires.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Buenos_Aires.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Buenos_Aires(DstTzInfo): + '''America/Buenos_Aires timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Buenos_Aires' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Buenos_Aires = Buenos_Aires() + diff --git a/vendor/pytz/zoneinfo/America/Cambridge_Bay.py b/vendor/pytz/zoneinfo/America/Cambridge_Bay.py new file mode 100644 index 00000000..ce1d6db0 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cambridge_Bay.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for America/Cambridge_Bay.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cambridge_Bay(DstTzInfo): + '''America/Cambridge_Bay timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cambridge_Bay' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,9,0,0), +d(1918,10,27,8,0,0), +d(1919,5,25,9,0,0), +d(1919,11,1,6,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,7,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2000,11,5,5,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-18000,7200,'MDDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-21600,0,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Cambridge_Bay = Cambridge_Bay() + diff --git a/vendor/pytz/zoneinfo/America/Campo_Grande.py b/vendor/pytz/zoneinfo/America/Campo_Grande.py new file mode 100644 index 00000000..f01e39db --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Campo_Grande.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for America/Campo_Grande.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Campo_Grande(DstTzInfo): + '''America/Campo_Grande timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Campo_Grande' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,38,28), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), +d(1988,10,16,4,0,0), +d(1989,1,29,3,0,0), +d(1989,10,15,4,0,0), +d(1990,2,11,3,0,0), +d(1990,10,21,4,0,0), +d(1991,2,17,3,0,0), +d(1991,10,20,4,0,0), +d(1992,2,9,3,0,0), +d(1992,10,25,4,0,0), +d(1993,1,31,3,0,0), +d(1993,10,17,4,0,0), +d(1994,2,20,3,0,0), +d(1994,10,16,4,0,0), +d(1995,2,19,3,0,0), +d(1995,10,15,4,0,0), +d(1996,2,11,3,0,0), +d(1996,10,6,4,0,0), +d(1997,2,16,3,0,0), +d(1997,10,6,4,0,0), +d(1998,3,1,3,0,0), +d(1998,10,11,4,0,0), +d(1999,2,21,3,0,0), +d(1999,10,3,4,0,0), +d(2000,2,27,3,0,0), +d(2000,10,8,4,0,0), +d(2001,2,18,3,0,0), +d(2001,10,14,4,0,0), +d(2002,2,17,3,0,0), +d(2002,11,3,4,0,0), +d(2003,2,16,3,0,0), +d(2003,10,19,4,0,0), +d(2004,2,15,3,0,0), +d(2004,11,2,4,0,0), +d(2005,2,20,3,0,0), +d(2005,10,16,4,0,0), +d(2006,2,19,3,0,0), +d(2006,11,5,4,0,0), +d(2007,2,25,3,0,0), +d(2007,11,4,4,0,0), +d(2008,2,24,3,0,0), +d(2008,11,2,4,0,0), +d(2009,2,22,3,0,0), +d(2009,11,1,4,0,0), +d(2010,2,28,3,0,0), +d(2010,11,7,4,0,0), +d(2011,2,27,3,0,0), +d(2011,11,6,4,0,0), +d(2012,2,26,3,0,0), +d(2012,11,4,4,0,0), +d(2013,2,24,3,0,0), +d(2013,11,3,4,0,0), +d(2014,2,23,3,0,0), +d(2014,11,2,4,0,0), +d(2015,2,22,3,0,0), +d(2015,11,1,4,0,0), +d(2016,2,28,3,0,0), +d(2016,11,6,4,0,0), +d(2017,2,26,3,0,0), +d(2017,11,5,4,0,0), +d(2018,2,25,3,0,0), +d(2018,11,4,4,0,0), +d(2019,2,24,3,0,0), +d(2019,11,3,4,0,0), +d(2020,2,23,3,0,0), +d(2020,11,1,4,0,0), +d(2021,2,28,3,0,0), +d(2021,11,7,4,0,0), +d(2022,2,27,3,0,0), +d(2022,11,6,4,0,0), +d(2023,2,26,3,0,0), +d(2023,11,5,4,0,0), +d(2024,2,25,3,0,0), +d(2024,11,3,4,0,0), +d(2025,2,23,3,0,0), +d(2025,11,2,4,0,0), +d(2026,2,22,3,0,0), +d(2026,11,1,4,0,0), +d(2027,2,28,3,0,0), +d(2027,11,7,4,0,0), +d(2028,2,27,3,0,0), +d(2028,11,5,4,0,0), +d(2029,2,25,3,0,0), +d(2029,11,4,4,0,0), +d(2030,2,24,3,0,0), +d(2030,11,3,4,0,0), +d(2031,2,23,3,0,0), +d(2031,11,2,4,0,0), +d(2032,2,29,3,0,0), +d(2032,11,7,4,0,0), +d(2033,2,27,3,0,0), +d(2033,11,6,4,0,0), +d(2034,2,26,3,0,0), +d(2034,11,5,4,0,0), +d(2035,2,25,3,0,0), +d(2035,11,4,4,0,0), +d(2036,2,24,3,0,0), +d(2036,11,2,4,0,0), +d(2037,2,22,3,0,0), +d(2037,11,1,4,0,0), + ] + + _transition_info = [ +i(-13080,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), + ] + +Campo_Grande = Campo_Grande() + diff --git a/vendor/pytz/zoneinfo/America/Cancun.py b/vendor/pytz/zoneinfo/America/Cancun.py new file mode 100644 index 00000000..75c04155 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cancun.py @@ -0,0 +1,194 @@ +'''tzinfo timezone information for America/Cancun.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cancun(DstTzInfo): + '''America/Cancun timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cancun' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,6,0,0), +d(1981,12,23,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,8,2,6,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,5,6,8,0,0), +d(2001,9,30,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,4,1,8,0,0), +d(2007,10,28,7,0,0), +d(2008,4,6,8,0,0), +d(2008,10,26,7,0,0), +d(2009,4,5,8,0,0), +d(2009,10,25,7,0,0), +d(2010,4,4,8,0,0), +d(2010,10,31,7,0,0), +d(2011,4,3,8,0,0), +d(2011,10,30,7,0,0), +d(2012,4,1,8,0,0), +d(2012,10,28,7,0,0), +d(2013,4,7,8,0,0), +d(2013,10,27,7,0,0), +d(2014,4,6,8,0,0), +d(2014,10,26,7,0,0), +d(2015,4,5,8,0,0), +d(2015,10,25,7,0,0), +d(2016,4,3,8,0,0), +d(2016,10,30,7,0,0), +d(2017,4,2,8,0,0), +d(2017,10,29,7,0,0), +d(2018,4,1,8,0,0), +d(2018,10,28,7,0,0), +d(2019,4,7,8,0,0), +d(2019,10,27,7,0,0), +d(2020,4,5,8,0,0), +d(2020,10,25,7,0,0), +d(2021,4,4,8,0,0), +d(2021,10,31,7,0,0), +d(2022,4,3,8,0,0), +d(2022,10,30,7,0,0), +d(2023,4,2,8,0,0), +d(2023,10,29,7,0,0), +d(2024,4,7,8,0,0), +d(2024,10,27,7,0,0), +d(2025,4,6,8,0,0), +d(2025,10,26,7,0,0), +d(2026,4,5,8,0,0), +d(2026,10,25,7,0,0), +d(2027,4,4,8,0,0), +d(2027,10,31,7,0,0), +d(2028,4,2,8,0,0), +d(2028,10,29,7,0,0), +d(2029,4,1,8,0,0), +d(2029,10,28,7,0,0), +d(2030,4,7,8,0,0), +d(2030,10,27,7,0,0), +d(2031,4,6,8,0,0), +d(2031,10,26,7,0,0), +d(2032,4,4,8,0,0), +d(2032,10,31,7,0,0), +d(2033,4,3,8,0,0), +d(2033,10,30,7,0,0), +d(2034,4,2,8,0,0), +d(2034,10,29,7,0,0), +d(2035,4,1,8,0,0), +d(2035,10,28,7,0,0), +d(2036,4,6,8,0,0), +d(2036,10,26,7,0,0), +d(2037,4,5,8,0,0), +d(2037,10,25,7,0,0), + ] + + _transition_info = [ +i(-20820,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Cancun = Cancun() + diff --git a/vendor/pytz/zoneinfo/America/Caracas.py b/vendor/pytz/zoneinfo/America/Caracas.py new file mode 100644 index 00000000..7d6276c3 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Caracas.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/Caracas.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Caracas(DstTzInfo): + '''America/Caracas timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Caracas' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,12,4,27,40), +d(1965,1,1,4,30,0), + ] + + _transition_info = [ +i(-16080,0,'CMT'), +i(-16200,0,'VET'), +i(-14400,0,'VET'), + ] + +Caracas = Caracas() + diff --git a/vendor/pytz/zoneinfo/America/Catamarca.py b/vendor/pytz/zoneinfo/America/Catamarca.py new file mode 100644 index 00000000..857a1870 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Catamarca.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Catamarca.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Catamarca(DstTzInfo): + '''America/Catamarca timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Catamarca' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,6,1,3,0,0), +d(2004,6,20,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Catamarca = Catamarca() + diff --git a/vendor/pytz/zoneinfo/America/Cayenne.py b/vendor/pytz/zoneinfo/America/Cayenne.py new file mode 100644 index 00000000..d20a6edd --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cayenne.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/Cayenne.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cayenne(DstTzInfo): + '''America/Cayenne timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cayenne' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,3,29,20), +d(1967,10,1,4,0,0), + ] + + _transition_info = [ +i(-12540,0,'LMT'), +i(-14400,0,'GFT'), +i(-10800,0,'GFT'), + ] + +Cayenne = Cayenne() + diff --git a/vendor/pytz/zoneinfo/America/Cayman.py b/vendor/pytz/zoneinfo/America/Cayman.py new file mode 100644 index 00000000..96c1ffea --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cayman.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Cayman.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cayman(DstTzInfo): + '''America/Cayman timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cayman' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,1,5,7,12), + ] + + _transition_info = [ +i(-18420,0,'KMT'), +i(-18000,0,'EST'), + ] + +Cayman = Cayman() + diff --git a/vendor/pytz/zoneinfo/America/Chicago.py b/vendor/pytz/zoneinfo/America/Chicago.py new file mode 100644 index 00000000..d1043045 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Chicago.py @@ -0,0 +1,490 @@ +'''tzinfo timezone information for America/Chicago.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chicago(DstTzInfo): + '''America/Chicago timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Chicago' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1920,6,13,8,0,0), +d(1920,10,31,7,0,0), +d(1921,3,27,8,0,0), +d(1921,10,30,7,0,0), +d(1922,4,30,8,0,0), +d(1922,9,24,7,0,0), +d(1923,4,29,8,0,0), +d(1923,9,30,7,0,0), +d(1924,4,27,8,0,0), +d(1924,9,28,7,0,0), +d(1925,4,26,8,0,0), +d(1925,9,27,7,0,0), +d(1926,4,25,8,0,0), +d(1926,9,26,7,0,0), +d(1927,4,24,8,0,0), +d(1927,9,25,7,0,0), +d(1928,4,29,8,0,0), +d(1928,9,30,7,0,0), +d(1929,4,28,8,0,0), +d(1929,9,29,7,0,0), +d(1930,4,27,8,0,0), +d(1930,9,28,7,0,0), +d(1931,4,26,8,0,0), +d(1931,9,27,7,0,0), +d(1932,4,24,8,0,0), +d(1932,9,25,7,0,0), +d(1933,4,30,8,0,0), +d(1933,9,24,7,0,0), +d(1934,4,29,8,0,0), +d(1934,9,30,7,0,0), +d(1935,4,28,8,0,0), +d(1935,9,29,7,0,0), +d(1936,3,1,8,0,0), +d(1936,11,15,7,0,0), +d(1937,4,25,8,0,0), +d(1937,9,26,7,0,0), +d(1938,4,24,8,0,0), +d(1938,9,25,7,0,0), +d(1939,4,30,8,0,0), +d(1939,9,24,7,0,0), +d(1940,4,28,8,0,0), +d(1940,9,29,7,0,0), +d(1941,4,27,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,10,30,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,10,27,7,0,0), +d(1958,4,27,8,0,0), +d(1958,10,26,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1962,10,28,7,0,0), +d(1963,4,28,8,0,0), +d(1963,10,27,7,0,0), +d(1964,4,26,8,0,0), +d(1964,10,25,7,0,0), +d(1965,4,25,8,0,0), +d(1965,10,31,7,0,0), +d(1966,4,24,8,0,0), +d(1966,10,30,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Chicago = Chicago() + diff --git a/vendor/pytz/zoneinfo/America/Chihuahua.py b/vendor/pytz/zoneinfo/America/Chihuahua.py new file mode 100644 index 00000000..b50fc998 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Chihuahua.py @@ -0,0 +1,200 @@ +'''tzinfo timezone information for America/Chihuahua.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chihuahua(DstTzInfo): + '''America/Chihuahua timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Chihuahua' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,5,6,9,0,0), +d(2001,9,30,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,4,1,9,0,0), +d(2007,10,28,8,0,0), +d(2008,4,6,9,0,0), +d(2008,10,26,8,0,0), +d(2009,4,5,9,0,0), +d(2009,10,25,8,0,0), +d(2010,4,4,9,0,0), +d(2010,10,31,8,0,0), +d(2011,4,3,9,0,0), +d(2011,10,30,8,0,0), +d(2012,4,1,9,0,0), +d(2012,10,28,8,0,0), +d(2013,4,7,9,0,0), +d(2013,10,27,8,0,0), +d(2014,4,6,9,0,0), +d(2014,10,26,8,0,0), +d(2015,4,5,9,0,0), +d(2015,10,25,8,0,0), +d(2016,4,3,9,0,0), +d(2016,10,30,8,0,0), +d(2017,4,2,9,0,0), +d(2017,10,29,8,0,0), +d(2018,4,1,9,0,0), +d(2018,10,28,8,0,0), +d(2019,4,7,9,0,0), +d(2019,10,27,8,0,0), +d(2020,4,5,9,0,0), +d(2020,10,25,8,0,0), +d(2021,4,4,9,0,0), +d(2021,10,31,8,0,0), +d(2022,4,3,9,0,0), +d(2022,10,30,8,0,0), +d(2023,4,2,9,0,0), +d(2023,10,29,8,0,0), +d(2024,4,7,9,0,0), +d(2024,10,27,8,0,0), +d(2025,4,6,9,0,0), +d(2025,10,26,8,0,0), +d(2026,4,5,9,0,0), +d(2026,10,25,8,0,0), +d(2027,4,4,9,0,0), +d(2027,10,31,8,0,0), +d(2028,4,2,9,0,0), +d(2028,10,29,8,0,0), +d(2029,4,1,9,0,0), +d(2029,10,28,8,0,0), +d(2030,4,7,9,0,0), +d(2030,10,27,8,0,0), +d(2031,4,6,9,0,0), +d(2031,10,26,8,0,0), +d(2032,4,4,9,0,0), +d(2032,10,31,8,0,0), +d(2033,4,3,9,0,0), +d(2033,10,30,8,0,0), +d(2034,4,2,9,0,0), +d(2034,10,29,8,0,0), +d(2035,4,1,9,0,0), +d(2035,10,28,8,0,0), +d(2036,4,6,9,0,0), +d(2036,10,26,8,0,0), +d(2037,4,5,9,0,0), +d(2037,10,25,8,0,0), + ] + + _transition_info = [ +i(-25440,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-21600,0,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Chihuahua = Chihuahua() + diff --git a/vendor/pytz/zoneinfo/America/Coral_Harbour.py b/vendor/pytz/zoneinfo/America/Coral_Harbour.py new file mode 100644 index 00000000..01848d67 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Coral_Harbour.py @@ -0,0 +1,32 @@ +'''tzinfo timezone information for America/Coral_Harbour.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Coral_Harbour(DstTzInfo): + '''America/Coral_Harbour timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Coral_Harbour' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,8,0,0), +d(1918,10,31,7,0,0), +d(1940,9,29,6,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-18000,0,'EST'), + ] + +Coral_Harbour = Coral_Harbour() + diff --git a/vendor/pytz/zoneinfo/America/Cordoba.py b/vendor/pytz/zoneinfo/America/Cordoba.py new file mode 100644 index 00000000..0a8bd6c7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cordoba.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Cordoba.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cordoba(DstTzInfo): + '''America/Cordoba timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cordoba' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Cordoba = Cordoba() + diff --git a/vendor/pytz/zoneinfo/America/Costa_Rica.py b/vendor/pytz/zoneinfo/America/Costa_Rica.py new file mode 100644 index 00000000..62693b86 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Costa_Rica.py @@ -0,0 +1,38 @@ +'''tzinfo timezone information for America/Costa_Rica.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Costa_Rica(DstTzInfo): + '''America/Costa_Rica timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Costa_Rica' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,1,15,5,36,20), +d(1979,2,25,6,0,0), +d(1979,6,3,5,0,0), +d(1980,2,24,6,0,0), +d(1980,6,1,5,0,0), +d(1991,1,19,6,0,0), +d(1991,7,1,5,0,0), +d(1992,1,18,6,0,0), +d(1992,3,15,5,0,0), + ] + + _transition_info = [ +i(-20160,0,'SJMT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Costa_Rica = Costa_Rica() + diff --git a/vendor/pytz/zoneinfo/America/Cuiaba.py b/vendor/pytz/zoneinfo/America/Cuiaba.py new file mode 100644 index 00000000..7efb7897 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Cuiaba.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for America/Cuiaba.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cuiaba(DstTzInfo): + '''America/Cuiaba timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Cuiaba' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,44,20), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), +d(1988,10,16,4,0,0), +d(1989,1,29,3,0,0), +d(1989,10,15,4,0,0), +d(1990,2,11,3,0,0), +d(1990,10,21,4,0,0), +d(1991,2,17,3,0,0), +d(1991,10,20,4,0,0), +d(1992,2,9,3,0,0), +d(1992,10,25,4,0,0), +d(1993,1,31,3,0,0), +d(1993,10,17,4,0,0), +d(1994,2,20,3,0,0), +d(1994,10,16,4,0,0), +d(1995,2,19,3,0,0), +d(1995,10,15,4,0,0), +d(1996,2,11,3,0,0), +d(1996,10,6,4,0,0), +d(1997,2,16,3,0,0), +d(1997,10,6,4,0,0), +d(1998,3,1,3,0,0), +d(1998,10,11,4,0,0), +d(1999,2,21,3,0,0), +d(1999,10,3,4,0,0), +d(2000,2,27,3,0,0), +d(2000,10,8,4,0,0), +d(2001,2,18,3,0,0), +d(2001,10,14,4,0,0), +d(2002,2,17,3,0,0), +d(2002,11,3,4,0,0), +d(2003,2,16,3,0,0), +d(2004,11,2,4,0,0), +d(2005,2,20,3,0,0), +d(2005,10,16,4,0,0), +d(2006,2,19,3,0,0), +d(2006,11,5,4,0,0), +d(2007,2,25,3,0,0), +d(2007,11,4,4,0,0), +d(2008,2,24,3,0,0), +d(2008,11,2,4,0,0), +d(2009,2,22,3,0,0), +d(2009,11,1,4,0,0), +d(2010,2,28,3,0,0), +d(2010,11,7,4,0,0), +d(2011,2,27,3,0,0), +d(2011,11,6,4,0,0), +d(2012,2,26,3,0,0), +d(2012,11,4,4,0,0), +d(2013,2,24,3,0,0), +d(2013,11,3,4,0,0), +d(2014,2,23,3,0,0), +d(2014,11,2,4,0,0), +d(2015,2,22,3,0,0), +d(2015,11,1,4,0,0), +d(2016,2,28,3,0,0), +d(2016,11,6,4,0,0), +d(2017,2,26,3,0,0), +d(2017,11,5,4,0,0), +d(2018,2,25,3,0,0), +d(2018,11,4,4,0,0), +d(2019,2,24,3,0,0), +d(2019,11,3,4,0,0), +d(2020,2,23,3,0,0), +d(2020,11,1,4,0,0), +d(2021,2,28,3,0,0), +d(2021,11,7,4,0,0), +d(2022,2,27,3,0,0), +d(2022,11,6,4,0,0), +d(2023,2,26,3,0,0), +d(2023,11,5,4,0,0), +d(2024,2,25,3,0,0), +d(2024,11,3,4,0,0), +d(2025,2,23,3,0,0), +d(2025,11,2,4,0,0), +d(2026,2,22,3,0,0), +d(2026,11,1,4,0,0), +d(2027,2,28,3,0,0), +d(2027,11,7,4,0,0), +d(2028,2,27,3,0,0), +d(2028,11,5,4,0,0), +d(2029,2,25,3,0,0), +d(2029,11,4,4,0,0), +d(2030,2,24,3,0,0), +d(2030,11,3,4,0,0), +d(2031,2,23,3,0,0), +d(2031,11,2,4,0,0), +d(2032,2,29,3,0,0), +d(2032,11,7,4,0,0), +d(2033,2,27,3,0,0), +d(2033,11,6,4,0,0), +d(2034,2,26,3,0,0), +d(2034,11,5,4,0,0), +d(2035,2,25,3,0,0), +d(2035,11,4,4,0,0), +d(2036,2,24,3,0,0), +d(2036,11,2,4,0,0), +d(2037,2,22,3,0,0), +d(2037,11,1,4,0,0), + ] + + _transition_info = [ +i(-13440,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), + ] + +Cuiaba = Cuiaba() + diff --git a/vendor/pytz/zoneinfo/America/Curacao.py b/vendor/pytz/zoneinfo/America/Curacao.py new file mode 100644 index 00000000..b96dd992 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Curacao.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/Curacao.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Curacao(DstTzInfo): + '''America/Curacao timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Curacao' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,12,4,35,44), +d(1965,1,1,4,30,0), + ] + + _transition_info = [ +i(-16560,0,'LMT'), +i(-16200,0,'ANT'), +i(-14400,0,'AST'), + ] + +Curacao = Curacao() + diff --git a/vendor/pytz/zoneinfo/America/Danmarkshavn.py b/vendor/pytz/zoneinfo/America/Danmarkshavn.py new file mode 100644 index 00000000..a476ad6a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Danmarkshavn.py @@ -0,0 +1,88 @@ +'''tzinfo timezone information for America/Danmarkshavn.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Danmarkshavn(DstTzInfo): + '''America/Danmarkshavn timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Danmarkshavn' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,28,1,14,40), +d(1980,4,6,5,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,1,1,3,0,0), + ] + + _transition_info = [ +i(-4500,0,'LMT'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(0,0,'GMT'), + ] + +Danmarkshavn = Danmarkshavn() + diff --git a/vendor/pytz/zoneinfo/America/Dawson.py b/vendor/pytz/zoneinfo/America/Dawson.py new file mode 100644 index 00000000..d772e767 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Dawson.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for America/Dawson.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dawson(DstTzInfo): + '''America/Dawson timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Dawson' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,11,0,0), +d(1918,10,27,10,0,0), +d(1919,5,25,11,0,0), +d(1919,11,1,8,0,0), +d(1942,2,9,11,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,10,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,9,0,0), +d(1973,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YWT'), +i(-28800,3600,'YPT'), +i(-32400,0,'YST'), +i(-25200,7200,'YDDT'), +i(-32400,0,'YST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Dawson = Dawson() + diff --git a/vendor/pytz/zoneinfo/America/Dawson_Creek.py b/vendor/pytz/zoneinfo/America/Dawson_Creek.py new file mode 100644 index 00000000..cd815b0d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Dawson_Creek.py @@ -0,0 +1,134 @@ +'''tzinfo timezone information for America/Dawson_Creek.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dawson_Creek(DstTzInfo): + '''America/Dawson_Creek timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Dawson_Creek' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,10,0,0), +d(1918,10,31,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1947,4,27,10,0,0), +d(1947,9,28,9,0,0), +d(1948,4,25,10,0,0), +d(1948,9,26,9,0,0), +d(1949,4,24,10,0,0), +d(1949,9,25,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,8,30,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-25200,0,'MST'), + ] + +Dawson_Creek = Dawson_Creek() + diff --git a/vendor/pytz/zoneinfo/America/Denver.py b/vendor/pytz/zoneinfo/America/Denver.py new file mode 100644 index 00000000..205e6911 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Denver.py @@ -0,0 +1,334 @@ +'''tzinfo timezone information for America/Denver.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Denver(DstTzInfo): + '''America/Denver timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Denver' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1920,3,28,9,0,0), +d(1920,10,31,8,0,0), +d(1921,3,27,9,0,0), +d(1921,5,22,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,8,0,0), +d(1966,4,24,9,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Denver = Denver() + diff --git a/vendor/pytz/zoneinfo/America/Detroit.py b/vendor/pytz/zoneinfo/America/Detroit.py new file mode 100644 index 00000000..0c943ba6 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Detroit.py @@ -0,0 +1,298 @@ +'''tzinfo timezone information for America/Detroit.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Detroit(DstTzInfo): + '''America/Detroit timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Detroit' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,1,1,5,32,11), +d(1915,5,15,8,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1967,6,14,7,0,0), +d(1967,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-19920,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Detroit = Detroit() + diff --git a/vendor/pytz/zoneinfo/America/Dominica.py b/vendor/pytz/zoneinfo/America/Dominica.py new file mode 100644 index 00000000..6d2c1ecd --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Dominica.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Dominica.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dominica(DstTzInfo): + '''America/Dominica timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Dominica' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,6,36), + ] + + _transition_info = [ +i(-14760,0,'LMT'), +i(-14400,0,'AST'), + ] + +Dominica = Dominica() + diff --git a/vendor/pytz/zoneinfo/America/Edmonton.py b/vendor/pytz/zoneinfo/America/Edmonton.py new file mode 100644 index 00000000..b0f947b5 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Edmonton.py @@ -0,0 +1,328 @@ +'''tzinfo timezone information for America/Edmonton.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Edmonton(DstTzInfo): + '''America/Edmonton timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Edmonton' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,9,1,7,33,52), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1919,4,13,9,0,0), +d(1919,5,27,8,0,0), +d(1920,4,25,9,0,0), +d(1920,10,31,8,0,0), +d(1921,4,24,9,0,0), +d(1921,9,25,8,0,0), +d(1922,4,30,9,0,0), +d(1922,9,24,8,0,0), +d(1923,4,29,9,0,0), +d(1923,9,30,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,4,28,9,0,0), +d(1974,10,27,8,0,0), +d(1975,4,27,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-27240,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Edmonton = Edmonton() + diff --git a/vendor/pytz/zoneinfo/America/Eirunepe.py b/vendor/pytz/zoneinfo/America/Eirunepe.py new file mode 100644 index 00000000..1c41bd95 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Eirunepe.py @@ -0,0 +1,82 @@ +'''tzinfo timezone information for America/Eirunepe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Eirunepe(DstTzInfo): + '''America/Eirunepe timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Eirunepe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,39,28), +d(1931,10,3,16,0,0), +d(1932,4,1,4,0,0), +d(1932,10,3,5,0,0), +d(1933,4,1,4,0,0), +d(1949,12,1,5,0,0), +d(1950,4,16,5,0,0), +d(1950,12,1,5,0,0), +d(1951,4,1,4,0,0), +d(1951,12,1,5,0,0), +d(1952,4,1,4,0,0), +d(1952,12,1,5,0,0), +d(1953,3,1,4,0,0), +d(1963,12,9,5,0,0), +d(1964,3,1,4,0,0), +d(1965,1,31,5,0,0), +d(1965,3,31,4,0,0), +d(1965,12,1,5,0,0), +d(1966,3,1,4,0,0), +d(1966,11,1,5,0,0), +d(1967,3,1,4,0,0), +d(1967,11,1,5,0,0), +d(1968,3,1,4,0,0), +d(1985,11,2,5,0,0), +d(1986,3,15,4,0,0), +d(1986,10,25,5,0,0), +d(1987,2,14,4,0,0), +d(1987,10,25,5,0,0), +d(1988,2,7,4,0,0), +d(1993,10,17,5,0,0), +d(1994,2,20,4,0,0), + ] + + _transition_info = [ +i(-16740,0,'LMT'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), + ] + +Eirunepe = Eirunepe() + diff --git a/vendor/pytz/zoneinfo/America/El_Salvador.py b/vendor/pytz/zoneinfo/America/El_Salvador.py new file mode 100644 index 00000000..4ed5d13a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/El_Salvador.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for America/El_Salvador.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class El_Salvador(DstTzInfo): + '''America/El_Salvador timezone definition. See datetime.tzinfo for details''' + + zone = 'America/El_Salvador' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,1,1,5,56,48), +d(1987,5,3,6,0,0), +d(1987,9,27,5,0,0), +d(1988,5,1,6,0,0), +d(1988,9,25,5,0,0), + ] + + _transition_info = [ +i(-21420,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +El_Salvador = El_Salvador() + diff --git a/vendor/pytz/zoneinfo/America/Ensenada.py b/vendor/pytz/zoneinfo/America/Ensenada.py new file mode 100644 index 00000000..432d5641 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Ensenada.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for America/Ensenada.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ensenada(DstTzInfo): + '''America/Ensenada timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Ensenada' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,8,0,0), +d(1924,1,1,7,0,0), +d(1927,6,11,7,0,0), +d(1930,11,15,7,0,0), +d(1931,4,1,8,0,0), +d(1931,9,30,7,0,0), +d(1942,4,24,8,0,0), +d(1945,8,14,23,0,0), +d(1945,11,12,7,0,0), +d(1948,4,5,8,0,0), +d(1949,1,14,7,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,4,1,10,0,0), +d(2007,10,28,9,0,0), +d(2008,4,6,10,0,0), +d(2008,10,26,9,0,0), +d(2009,4,5,10,0,0), +d(2009,10,25,9,0,0), +d(2010,4,4,10,0,0), +d(2010,10,31,9,0,0), +d(2011,4,3,10,0,0), +d(2011,10,30,9,0,0), +d(2012,4,1,10,0,0), +d(2012,10,28,9,0,0), +d(2013,4,7,10,0,0), +d(2013,10,27,9,0,0), +d(2014,4,6,10,0,0), +d(2014,10,26,9,0,0), +d(2015,4,5,10,0,0), +d(2015,10,25,9,0,0), +d(2016,4,3,10,0,0), +d(2016,10,30,9,0,0), +d(2017,4,2,10,0,0), +d(2017,10,29,9,0,0), +d(2018,4,1,10,0,0), +d(2018,10,28,9,0,0), +d(2019,4,7,10,0,0), +d(2019,10,27,9,0,0), +d(2020,4,5,10,0,0), +d(2020,10,25,9,0,0), +d(2021,4,4,10,0,0), +d(2021,10,31,9,0,0), +d(2022,4,3,10,0,0), +d(2022,10,30,9,0,0), +d(2023,4,2,10,0,0), +d(2023,10,29,9,0,0), +d(2024,4,7,10,0,0), +d(2024,10,27,9,0,0), +d(2025,4,6,10,0,0), +d(2025,10,26,9,0,0), +d(2026,4,5,10,0,0), +d(2026,10,25,9,0,0), +d(2027,4,4,10,0,0), +d(2027,10,31,9,0,0), +d(2028,4,2,10,0,0), +d(2028,10,29,9,0,0), +d(2029,4,1,10,0,0), +d(2029,10,28,9,0,0), +d(2030,4,7,10,0,0), +d(2030,10,27,9,0,0), +d(2031,4,6,10,0,0), +d(2031,10,26,9,0,0), +d(2032,4,4,10,0,0), +d(2032,10,31,9,0,0), +d(2033,4,3,10,0,0), +d(2033,10,30,9,0,0), +d(2034,4,2,10,0,0), +d(2034,10,29,9,0,0), +d(2035,4,1,10,0,0), +d(2035,10,28,9,0,0), +d(2036,4,6,10,0,0), +d(2036,10,26,9,0,0), +d(2037,4,5,10,0,0), +d(2037,10,25,9,0,0), + ] + + _transition_info = [ +i(-28080,0,'LMT'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Ensenada = Ensenada() + diff --git a/vendor/pytz/zoneinfo/America/Fort_Wayne.py b/vendor/pytz/zoneinfo/America/Fort_Wayne.py new file mode 100644 index 00000000..4a1bd609 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Fort_Wayne.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for America/Fort_Wayne.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Fort_Wayne(DstTzInfo): + '''America/Fort_Wayne timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Fort_Wayne' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1941,6,22,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Fort_Wayne = Fort_Wayne() + diff --git a/vendor/pytz/zoneinfo/America/Fortaleza.py b/vendor/pytz/zoneinfo/America/Fortaleza.py new file mode 100644 index 00000000..44ca5ae1 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Fortaleza.py @@ -0,0 +1,98 @@ +'''tzinfo timezone information for America/Fortaleza.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Fortaleza(DstTzInfo): + '''America/Fortaleza timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Fortaleza' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,34,0), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2000,10,22,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), + ] + + _transition_info = [ +i(-9240,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Fortaleza = Fortaleza() + diff --git a/vendor/pytz/zoneinfo/America/Glace_Bay.py b/vendor/pytz/zoneinfo/America/Glace_Bay.py new file mode 100644 index 00000000..cd5edff1 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Glace_Bay.py @@ -0,0 +1,300 @@ +'''tzinfo timezone information for America/Glace_Bay.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Glace_Bay(DstTzInfo): + '''America/Glace_Bay timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Glace_Bay' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1902,6,15,3,59,48), +d(1918,4,14,6,0,0), +d(1918,10,31,5,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), +d(1953,4,26,6,0,0), +d(1953,9,27,5,0,0), +d(1972,4,30,6,0,0), +d(1972,10,29,5,0,0), +d(1973,4,29,6,0,0), +d(1973,10,28,5,0,0), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,5,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,5,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,5,0,0), +d(1998,4,5,6,0,0), +d(1998,10,25,5,0,0), +d(1999,4,4,6,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,6,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,6,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,6,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,6,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,6,0,0), +d(2004,10,31,5,0,0), +d(2005,4,3,6,0,0), +d(2005,10,30,5,0,0), +d(2006,4,2,6,0,0), +d(2006,10,29,5,0,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-14400,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Glace_Bay = Glace_Bay() + diff --git a/vendor/pytz/zoneinfo/America/Godthab.py b/vendor/pytz/zoneinfo/America/Godthab.py new file mode 100644 index 00000000..bce7b307 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Godthab.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for America/Godthab.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Godthab(DstTzInfo): + '''America/Godthab timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Godthab' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,28,3,26,56), +d(1980,4,6,5,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-12420,0,'LMT'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), +i(-7200,3600,'WGST'), +i(-10800,0,'WGT'), + ] + +Godthab = Godthab() + diff --git a/vendor/pytz/zoneinfo/America/Goose_Bay.py b/vendor/pytz/zoneinfo/America/Goose_Bay.py new file mode 100644 index 00000000..b2bc26cc --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Goose_Bay.py @@ -0,0 +1,426 @@ +'''tzinfo timezone information for America/Goose_Bay.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Goose_Bay(DstTzInfo): + '''America/Goose_Bay timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Goose_Bay' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,5,30,52), +d(1918,10,31,4,30,52), +d(1935,3,30,3,30,52), +d(1936,5,11,3,30,0), +d(1936,10,5,2,30,0), +d(1937,5,10,3,30,0), +d(1937,10,4,2,30,0), +d(1938,5,9,3,30,0), +d(1938,10,3,2,30,0), +d(1939,5,15,3,30,0), +d(1939,10,2,2,30,0), +d(1940,5,13,3,30,0), +d(1940,10,7,2,30,0), +d(1941,5,12,3,30,0), +d(1941,10,6,2,30,0), +d(1942,5,11,3,30,0), +d(1945,8,14,23,0,0), +d(1945,9,30,4,30,0), +d(1946,5,12,5,30,0), +d(1946,10,6,4,30,0), +d(1947,5,11,5,30,0), +d(1947,10,5,4,30,0), +d(1948,5,9,5,30,0), +d(1948,10,3,4,30,0), +d(1949,5,8,5,30,0), +d(1949,10,2,4,30,0), +d(1950,5,14,5,30,0), +d(1950,10,8,4,30,0), +d(1951,4,29,5,30,0), +d(1951,9,30,4,30,0), +d(1952,4,27,5,30,0), +d(1952,9,28,4,30,0), +d(1953,4,26,5,30,0), +d(1953,9,27,4,30,0), +d(1954,4,25,5,30,0), +d(1954,9,26,4,30,0), +d(1955,4,24,5,30,0), +d(1955,9,25,4,30,0), +d(1956,4,29,5,30,0), +d(1956,9,30,4,30,0), +d(1957,4,28,5,30,0), +d(1957,9,29,4,30,0), +d(1958,4,27,5,30,0), +d(1958,9,28,4,30,0), +d(1959,4,26,5,30,0), +d(1959,9,27,4,30,0), +d(1960,4,24,5,30,0), +d(1960,10,30,4,30,0), +d(1961,4,30,5,30,0), +d(1961,10,29,4,30,0), +d(1962,4,29,5,30,0), +d(1962,10,28,4,30,0), +d(1963,4,28,5,30,0), +d(1963,10,27,4,30,0), +d(1964,4,26,5,30,0), +d(1964,10,25,4,30,0), +d(1965,4,25,5,30,0), +d(1965,10,31,4,30,0), +d(1966,3,15,5,30,0), +d(1966,4,24,6,0,0), +d(1966,10,30,5,0,0), +d(1967,4,30,6,0,0), +d(1967,10,29,5,0,0), +d(1968,4,28,6,0,0), +d(1968,10,27,5,0,0), +d(1969,4,27,6,0,0), +d(1969,10,26,5,0,0), +d(1970,4,26,6,0,0), +d(1970,10,25,5,0,0), +d(1971,4,25,6,0,0), +d(1971,10,31,5,0,0), +d(1972,4,30,6,0,0), +d(1972,10,29,5,0,0), +d(1973,4,29,6,0,0), +d(1973,10,28,5,0,0), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,4,1,0), +d(1987,10,25,3,1,0), +d(1988,4,3,4,1,0), +d(1988,10,30,2,1,0), +d(1989,4,2,4,1,0), +d(1989,10,29,3,1,0), +d(1990,4,1,4,1,0), +d(1990,10,28,3,1,0), +d(1991,4,7,4,1,0), +d(1991,10,27,3,1,0), +d(1992,4,5,4,1,0), +d(1992,10,25,3,1,0), +d(1993,4,4,4,1,0), +d(1993,10,31,3,1,0), +d(1994,4,3,4,1,0), +d(1994,10,30,3,1,0), +d(1995,4,2,4,1,0), +d(1995,10,29,3,1,0), +d(1996,4,7,4,1,0), +d(1996,10,27,3,1,0), +d(1997,4,6,4,1,0), +d(1997,10,26,3,1,0), +d(1998,4,5,4,1,0), +d(1998,10,25,3,1,0), +d(1999,4,4,4,1,0), +d(1999,10,31,3,1,0), +d(2000,4,2,4,1,0), +d(2000,10,29,3,1,0), +d(2001,4,1,4,1,0), +d(2001,10,28,3,1,0), +d(2002,4,7,4,1,0), +d(2002,10,27,3,1,0), +d(2003,4,6,4,1,0), +d(2003,10,26,3,1,0), +d(2004,4,4,4,1,0), +d(2004,10,31,3,1,0), +d(2005,4,3,4,1,0), +d(2005,10,30,3,1,0), +d(2006,4,2,4,1,0), +d(2006,10,29,3,1,0), +d(2007,3,11,4,1,0), +d(2007,11,4,3,1,0), +d(2008,3,9,4,1,0), +d(2008,11,2,3,1,0), +d(2009,3,8,4,1,0), +d(2009,11,1,3,1,0), +d(2010,3,14,4,1,0), +d(2010,11,7,3,1,0), +d(2011,3,13,4,1,0), +d(2011,11,6,3,1,0), +d(2012,3,11,4,1,0), +d(2012,11,4,3,1,0), +d(2013,3,10,4,1,0), +d(2013,11,3,3,1,0), +d(2014,3,9,4,1,0), +d(2014,11,2,3,1,0), +d(2015,3,8,4,1,0), +d(2015,11,1,3,1,0), +d(2016,3,13,4,1,0), +d(2016,11,6,3,1,0), +d(2017,3,12,4,1,0), +d(2017,11,5,3,1,0), +d(2018,3,11,4,1,0), +d(2018,11,4,3,1,0), +d(2019,3,10,4,1,0), +d(2019,11,3,3,1,0), +d(2020,3,8,4,1,0), +d(2020,11,1,3,1,0), +d(2021,3,14,4,1,0), +d(2021,11,7,3,1,0), +d(2022,3,13,4,1,0), +d(2022,11,6,3,1,0), +d(2023,3,12,4,1,0), +d(2023,11,5,3,1,0), +d(2024,3,10,4,1,0), +d(2024,11,3,3,1,0), +d(2025,3,9,4,1,0), +d(2025,11,2,3,1,0), +d(2026,3,8,4,1,0), +d(2026,11,1,3,1,0), +d(2027,3,14,4,1,0), +d(2027,11,7,3,1,0), +d(2028,3,12,4,1,0), +d(2028,11,5,3,1,0), +d(2029,3,11,4,1,0), +d(2029,11,4,3,1,0), +d(2030,3,10,4,1,0), +d(2030,11,3,3,1,0), +d(2031,3,9,4,1,0), +d(2031,11,2,3,1,0), +d(2032,3,14,4,1,0), +d(2032,11,7,3,1,0), +d(2033,3,13,4,1,0), +d(2033,11,6,3,1,0), +d(2034,3,12,4,1,0), +d(2034,11,5,3,1,0), +d(2035,3,11,4,1,0), +d(2035,11,4,3,1,0), +d(2036,3,9,4,1,0), +d(2036,11,2,3,1,0), +d(2037,3,8,4,1,0), +d(2037,11,1,3,1,0), + ] + + _transition_info = [ +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NWT'), +i(-9000,3600,'NPT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-7200,7200,'ADDT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Goose_Bay = Goose_Bay() + diff --git a/vendor/pytz/zoneinfo/America/Grand_Turk.py b/vendor/pytz/zoneinfo/America/Grand_Turk.py new file mode 100644 index 00000000..ba4cae50 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Grand_Turk.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for America/Grand_Turk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Grand_Turk(DstTzInfo): + '''America/Grand_Turk timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Grand_Turk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,1,5,7,12), +d(1979,4,29,5,0,0), +d(1979,10,28,4,0,0), +d(1980,4,27,5,0,0), +d(1980,10,26,4,0,0), +d(1981,4,26,5,0,0), +d(1981,10,25,4,0,0), +d(1982,4,25,5,0,0), +d(1982,10,31,4,0,0), +d(1983,4,24,5,0,0), +d(1983,10,30,4,0,0), +d(1984,4,29,5,0,0), +d(1984,10,28,4,0,0), +d(1985,4,28,5,0,0), +d(1985,10,27,4,0,0), +d(1986,4,27,5,0,0), +d(1986,10,26,4,0,0), +d(1987,4,5,5,0,0), +d(1987,10,25,4,0,0), +d(1988,4,3,5,0,0), +d(1988,10,30,4,0,0), +d(1989,4,2,5,0,0), +d(1989,10,29,4,0,0), +d(1990,4,1,5,0,0), +d(1990,10,28,4,0,0), +d(1991,4,7,5,0,0), +d(1991,10,27,4,0,0), +d(1992,4,5,5,0,0), +d(1992,10,25,4,0,0), +d(1993,4,4,5,0,0), +d(1993,10,31,4,0,0), +d(1994,4,3,5,0,0), +d(1994,10,30,4,0,0), +d(1995,4,2,5,0,0), +d(1995,10,29,4,0,0), +d(1996,4,7,5,0,0), +d(1996,10,27,4,0,0), +d(1997,4,6,5,0,0), +d(1997,10,26,4,0,0), +d(1998,4,5,5,0,0), +d(1998,10,25,4,0,0), +d(1999,4,4,5,0,0), +d(1999,10,31,4,0,0), +d(2000,4,2,5,0,0), +d(2000,10,29,4,0,0), +d(2001,4,1,5,0,0), +d(2001,10,28,4,0,0), +d(2002,4,7,5,0,0), +d(2002,10,27,4,0,0), +d(2003,4,6,5,0,0), +d(2003,10,26,4,0,0), +d(2004,4,4,5,0,0), +d(2004,10,31,4,0,0), +d(2005,4,3,5,0,0), +d(2005,10,30,4,0,0), +d(2006,4,2,5,0,0), +d(2006,10,29,4,0,0), +d(2007,4,1,5,0,0), +d(2007,10,28,4,0,0), +d(2008,4,6,5,0,0), +d(2008,10,26,4,0,0), +d(2009,4,5,5,0,0), +d(2009,10,25,4,0,0), +d(2010,4,4,5,0,0), +d(2010,10,31,4,0,0), +d(2011,4,3,5,0,0), +d(2011,10,30,4,0,0), +d(2012,4,1,5,0,0), +d(2012,10,28,4,0,0), +d(2013,4,7,5,0,0), +d(2013,10,27,4,0,0), +d(2014,4,6,5,0,0), +d(2014,10,26,4,0,0), +d(2015,4,5,5,0,0), +d(2015,10,25,4,0,0), +d(2016,4,3,5,0,0), +d(2016,10,30,4,0,0), +d(2017,4,2,5,0,0), +d(2017,10,29,4,0,0), +d(2018,4,1,5,0,0), +d(2018,10,28,4,0,0), +d(2019,4,7,5,0,0), +d(2019,10,27,4,0,0), +d(2020,4,5,5,0,0), +d(2020,10,25,4,0,0), +d(2021,4,4,5,0,0), +d(2021,10,31,4,0,0), +d(2022,4,3,5,0,0), +d(2022,10,30,4,0,0), +d(2023,4,2,5,0,0), +d(2023,10,29,4,0,0), +d(2024,4,7,5,0,0), +d(2024,10,27,4,0,0), +d(2025,4,6,5,0,0), +d(2025,10,26,4,0,0), +d(2026,4,5,5,0,0), +d(2026,10,25,4,0,0), +d(2027,4,4,5,0,0), +d(2027,10,31,4,0,0), +d(2028,4,2,5,0,0), +d(2028,10,29,4,0,0), +d(2029,4,1,5,0,0), +d(2029,10,28,4,0,0), +d(2030,4,7,5,0,0), +d(2030,10,27,4,0,0), +d(2031,4,6,5,0,0), +d(2031,10,26,4,0,0), +d(2032,4,4,5,0,0), +d(2032,10,31,4,0,0), +d(2033,4,3,5,0,0), +d(2033,10,30,4,0,0), +d(2034,4,2,5,0,0), +d(2034,10,29,4,0,0), +d(2035,4,1,5,0,0), +d(2035,10,28,4,0,0), +d(2036,4,6,5,0,0), +d(2036,10,26,4,0,0), +d(2037,4,5,5,0,0), +d(2037,10,25,4,0,0), + ] + + _transition_info = [ +i(-18420,0,'KMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Grand_Turk = Grand_Turk() + diff --git a/vendor/pytz/zoneinfo/America/Grenada.py b/vendor/pytz/zoneinfo/America/Grenada.py new file mode 100644 index 00000000..37d67e85 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Grenada.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Grenada.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Grenada(DstTzInfo): + '''America/Grenada timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Grenada' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,7,0), + ] + + _transition_info = [ +i(-14820,0,'LMT'), +i(-14400,0,'AST'), + ] + +Grenada = Grenada() + diff --git a/vendor/pytz/zoneinfo/America/Guadeloupe.py b/vendor/pytz/zoneinfo/America/Guadeloupe.py new file mode 100644 index 00000000..19720756 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Guadeloupe.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Guadeloupe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guadeloupe(DstTzInfo): + '''America/Guadeloupe timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Guadeloupe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,6,8,4,6,8), + ] + + _transition_info = [ +i(-14760,0,'LMT'), +i(-14400,0,'AST'), + ] + +Guadeloupe = Guadeloupe() + diff --git a/vendor/pytz/zoneinfo/America/Guatemala.py b/vendor/pytz/zoneinfo/America/Guatemala.py new file mode 100644 index 00000000..6d4a29ca --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Guatemala.py @@ -0,0 +1,38 @@ +'''tzinfo timezone information for America/Guatemala.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guatemala(DstTzInfo): + '''America/Guatemala timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Guatemala' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,10,5,6,2,4), +d(1973,11,25,6,0,0), +d(1974,2,24,5,0,0), +d(1983,5,21,6,0,0), +d(1983,9,22,5,0,0), +d(1991,3,23,6,0,0), +d(1991,9,7,5,0,0), +d(2006,4,30,6,0,0), +d(2006,10,1,5,0,0), + ] + + _transition_info = [ +i(-21720,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Guatemala = Guatemala() + diff --git a/vendor/pytz/zoneinfo/America/Guayaquil.py b/vendor/pytz/zoneinfo/America/Guayaquil.py new file mode 100644 index 00000000..c44a5f14 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Guayaquil.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Guayaquil.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guayaquil(DstTzInfo): + '''America/Guayaquil timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Guayaquil' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1931,1,1,5,14,0), + ] + + _transition_info = [ +i(-18840,0,'QMT'), +i(-18000,0,'ECT'), + ] + +Guayaquil = Guayaquil() + diff --git a/vendor/pytz/zoneinfo/America/Guyana.py b/vendor/pytz/zoneinfo/America/Guyana.py new file mode 100644 index 00000000..3397d5e5 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Guyana.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for America/Guyana.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guyana(DstTzInfo): + '''America/Guyana timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Guyana' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,3,1,3,52,40), +d(1966,5,26,3,45,0), +d(1975,7,31,3,45,0), +d(1991,1,1,3,0,0), + ] + + _transition_info = [ +i(-13980,0,'LMT'), +i(-13500,0,'GBGT'), +i(-13500,0,'GYT'), +i(-10800,0,'GYT'), +i(-14400,0,'GYT'), + ] + +Guyana = Guyana() + diff --git a/vendor/pytz/zoneinfo/America/Halifax.py b/vendor/pytz/zoneinfo/America/Halifax.py new file mode 100644 index 00000000..ae673915 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Halifax.py @@ -0,0 +1,476 @@ +'''tzinfo timezone information for America/Halifax.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Halifax(DstTzInfo): + '''America/Halifax timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Halifax' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1902,6,15,4,14,24), +d(1916,4,1,4,0,0), +d(1916,10,1,3,0,0), +d(1918,4,14,6,0,0), +d(1918,10,31,5,0,0), +d(1920,5,9,4,0,0), +d(1920,8,29,3,0,0), +d(1921,5,6,4,0,0), +d(1921,9,5,3,0,0), +d(1922,4,30,4,0,0), +d(1922,9,5,3,0,0), +d(1923,5,6,4,0,0), +d(1923,9,4,3,0,0), +d(1924,5,4,4,0,0), +d(1924,9,15,3,0,0), +d(1925,5,3,4,0,0), +d(1925,9,28,3,0,0), +d(1926,5,16,4,0,0), +d(1926,9,13,3,0,0), +d(1927,5,1,4,0,0), +d(1927,9,26,3,0,0), +d(1928,5,13,4,0,0), +d(1928,9,9,3,0,0), +d(1929,5,12,4,0,0), +d(1929,9,3,3,0,0), +d(1930,5,11,4,0,0), +d(1930,9,15,3,0,0), +d(1931,5,10,4,0,0), +d(1931,9,28,3,0,0), +d(1932,5,1,4,0,0), +d(1932,9,26,3,0,0), +d(1933,4,30,4,0,0), +d(1933,10,2,3,0,0), +d(1934,5,20,4,0,0), +d(1934,9,16,3,0,0), +d(1935,6,2,4,0,0), +d(1935,9,30,3,0,0), +d(1936,6,1,4,0,0), +d(1936,9,14,3,0,0), +d(1937,5,2,4,0,0), +d(1937,9,27,3,0,0), +d(1938,5,1,4,0,0), +d(1938,9,26,3,0,0), +d(1939,5,28,4,0,0), +d(1939,9,25,3,0,0), +d(1940,5,5,4,0,0), +d(1940,9,30,3,0,0), +d(1941,5,4,4,0,0), +d(1941,9,29,3,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), +d(1946,4,28,6,0,0), +d(1946,9,29,5,0,0), +d(1947,4,27,6,0,0), +d(1947,9,28,5,0,0), +d(1948,4,25,6,0,0), +d(1948,9,26,5,0,0), +d(1949,4,24,6,0,0), +d(1949,9,25,5,0,0), +d(1951,4,29,6,0,0), +d(1951,9,30,5,0,0), +d(1952,4,27,6,0,0), +d(1952,9,28,5,0,0), +d(1953,4,26,6,0,0), +d(1953,9,27,5,0,0), +d(1954,4,25,6,0,0), +d(1954,9,26,5,0,0), +d(1956,4,29,6,0,0), +d(1956,9,30,5,0,0), +d(1957,4,28,6,0,0), +d(1957,9,29,5,0,0), +d(1958,4,27,6,0,0), +d(1958,9,28,5,0,0), +d(1959,4,26,6,0,0), +d(1959,9,27,5,0,0), +d(1962,4,29,6,0,0), +d(1962,10,28,5,0,0), +d(1963,4,28,6,0,0), +d(1963,10,27,5,0,0), +d(1964,4,26,6,0,0), +d(1964,10,25,5,0,0), +d(1965,4,25,6,0,0), +d(1965,10,31,5,0,0), +d(1966,4,24,6,0,0), +d(1966,10,30,5,0,0), +d(1967,4,30,6,0,0), +d(1967,10,29,5,0,0), +d(1968,4,28,6,0,0), +d(1968,10,27,5,0,0), +d(1969,4,27,6,0,0), +d(1969,10,26,5,0,0), +d(1970,4,26,6,0,0), +d(1970,10,25,5,0,0), +d(1971,4,25,6,0,0), +d(1971,10,31,5,0,0), +d(1972,4,30,6,0,0), +d(1972,10,29,5,0,0), +d(1973,4,29,6,0,0), +d(1973,10,28,5,0,0), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,5,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,5,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,5,0,0), +d(1998,4,5,6,0,0), +d(1998,10,25,5,0,0), +d(1999,4,4,6,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,6,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,6,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,6,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,6,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,6,0,0), +d(2004,10,31,5,0,0), +d(2005,4,3,6,0,0), +d(2005,10,30,5,0,0), +d(2006,4,2,6,0,0), +d(2006,10,29,5,0,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-15240,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Halifax = Halifax() + diff --git a/vendor/pytz/zoneinfo/America/Havana.py b/vendor/pytz/zoneinfo/America/Havana.py new file mode 100644 index 00000000..988a380b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Havana.py @@ -0,0 +1,330 @@ +'''tzinfo timezone information for America/Havana.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Havana(DstTzInfo): + '''America/Havana timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Havana' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1925,7,19,17,29,36), +d(1928,6,10,5,0,0), +d(1928,10,10,4,0,0), +d(1940,6,2,5,0,0), +d(1940,9,1,4,0,0), +d(1941,6,1,5,0,0), +d(1941,9,7,4,0,0), +d(1942,6,7,5,0,0), +d(1942,9,6,4,0,0), +d(1945,6,3,5,0,0), +d(1945,9,2,4,0,0), +d(1946,6,2,5,0,0), +d(1946,9,1,4,0,0), +d(1965,6,1,5,0,0), +d(1965,9,30,4,0,0), +d(1966,5,29,5,0,0), +d(1966,10,2,4,0,0), +d(1967,4,8,5,0,0), +d(1967,9,10,4,0,0), +d(1968,4,14,5,0,0), +d(1968,9,8,4,0,0), +d(1969,4,27,5,0,0), +d(1969,10,26,4,0,0), +d(1970,4,26,5,0,0), +d(1970,10,25,4,0,0), +d(1971,4,25,5,0,0), +d(1971,10,31,4,0,0), +d(1972,4,30,5,0,0), +d(1972,10,8,4,0,0), +d(1973,4,29,5,0,0), +d(1973,10,8,4,0,0), +d(1974,4,28,5,0,0), +d(1974,10,8,4,0,0), +d(1975,4,27,5,0,0), +d(1975,10,26,4,0,0), +d(1976,4,25,5,0,0), +d(1976,10,31,4,0,0), +d(1977,4,24,5,0,0), +d(1977,10,30,4,0,0), +d(1978,5,7,5,0,0), +d(1978,10,8,4,0,0), +d(1979,3,18,5,0,0), +d(1979,10,14,4,0,0), +d(1980,3,16,5,0,0), +d(1980,10,12,4,0,0), +d(1981,5,10,5,0,0), +d(1981,10,11,4,0,0), +d(1982,5,9,5,0,0), +d(1982,10,10,4,0,0), +d(1983,5,8,5,0,0), +d(1983,10,9,4,0,0), +d(1984,5,6,5,0,0), +d(1984,10,14,4,0,0), +d(1985,5,5,5,0,0), +d(1985,10,13,4,0,0), +d(1986,3,16,5,0,0), +d(1986,10,12,4,0,0), +d(1987,3,15,5,0,0), +d(1987,10,11,4,0,0), +d(1988,3,20,5,0,0), +d(1988,10,9,4,0,0), +d(1989,3,19,5,0,0), +d(1989,10,8,4,0,0), +d(1990,4,1,5,0,0), +d(1990,10,14,4,0,0), +d(1991,4,7,5,0,0), +d(1991,10,13,5,0,0), +d(1992,4,5,5,0,0), +d(1992,10,11,5,0,0), +d(1993,4,4,5,0,0), +d(1993,10,10,5,0,0), +d(1994,4,3,5,0,0), +d(1994,10,9,5,0,0), +d(1995,4,2,5,0,0), +d(1995,10,8,5,0,0), +d(1996,4,7,5,0,0), +d(1996,10,6,5,0,0), +d(1997,4,6,5,0,0), +d(1997,10,12,5,0,0), +d(1998,3,29,5,0,0), +d(1998,10,25,5,0,0), +d(1999,3,28,5,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,5,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,5,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,5,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,5,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,5,0,0), +d(2006,10,29,5,0,0), +d(2007,4,1,5,0,0), +d(2007,10,28,5,0,0), +d(2008,4,6,5,0,0), +d(2008,10,26,5,0,0), +d(2009,4,5,5,0,0), +d(2009,10,25,5,0,0), +d(2010,4,4,5,0,0), +d(2010,10,31,5,0,0), +d(2011,4,3,5,0,0), +d(2011,10,30,5,0,0), +d(2012,4,1,5,0,0), +d(2012,10,28,5,0,0), +d(2013,4,7,5,0,0), +d(2013,10,27,5,0,0), +d(2014,4,6,5,0,0), +d(2014,10,26,5,0,0), +d(2015,4,5,5,0,0), +d(2015,10,25,5,0,0), +d(2016,4,3,5,0,0), +d(2016,10,30,5,0,0), +d(2017,4,2,5,0,0), +d(2017,10,29,5,0,0), +d(2018,4,1,5,0,0), +d(2018,10,28,5,0,0), +d(2019,4,7,5,0,0), +d(2019,10,27,5,0,0), +d(2020,4,5,5,0,0), +d(2020,10,25,5,0,0), +d(2021,4,4,5,0,0), +d(2021,10,31,5,0,0), +d(2022,4,3,5,0,0), +d(2022,10,30,5,0,0), +d(2023,4,2,5,0,0), +d(2023,10,29,5,0,0), +d(2024,4,7,5,0,0), +d(2024,10,27,5,0,0), +d(2025,4,6,5,0,0), +d(2025,10,26,5,0,0), +d(2026,4,5,5,0,0), +d(2026,10,25,5,0,0), +d(2027,4,4,5,0,0), +d(2027,10,31,5,0,0), +d(2028,4,2,5,0,0), +d(2028,10,29,5,0,0), +d(2029,4,1,5,0,0), +d(2029,10,28,5,0,0), +d(2030,4,7,5,0,0), +d(2030,10,27,5,0,0), +d(2031,4,6,5,0,0), +d(2031,10,26,5,0,0), +d(2032,4,4,5,0,0), +d(2032,10,31,5,0,0), +d(2033,4,3,5,0,0), +d(2033,10,30,5,0,0), +d(2034,4,2,5,0,0), +d(2034,10,29,5,0,0), +d(2035,4,1,5,0,0), +d(2035,10,28,5,0,0), +d(2036,4,6,5,0,0), +d(2036,10,26,5,0,0), +d(2037,4,5,5,0,0), +d(2037,10,25,5,0,0), + ] + + _transition_info = [ +i(-19800,0,'HMT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), + ] + +Havana = Havana() + diff --git a/vendor/pytz/zoneinfo/America/Hermosillo.py b/vendor/pytz/zoneinfo/America/Hermosillo.py new file mode 100644 index 00000000..926ea817 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Hermosillo.py @@ -0,0 +1,50 @@ +'''tzinfo timezone information for America/Hermosillo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hermosillo(DstTzInfo): + '''America/Hermosillo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Hermosillo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1942,4,24,6,0,0), +d(1949,1,14,7,0,0), +d(1970,1,1,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), + ] + + _transition_info = [ +i(-26640,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Hermosillo = Hermosillo() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Indianapolis.py b/vendor/pytz/zoneinfo/America/Indiana/Indianapolis.py new file mode 100644 index 00000000..21369f1b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Indianapolis.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for America/Indiana/Indianapolis.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Indianapolis(DstTzInfo): + '''America/Indiana/Indianapolis timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Indianapolis' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1941,6,22,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Indianapolis = Indianapolis() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Knox.py b/vendor/pytz/zoneinfo/America/Indiana/Knox.py new file mode 100644 index 00000000..4ee2f5d4 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Knox.py @@ -0,0 +1,326 @@ +'''tzinfo timezone information for America/Indiana/Knox.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Knox(DstTzInfo): + '''America/Indiana/Knox timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Knox' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,10,30,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1963,10,27,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Knox = Knox() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Marengo.py b/vendor/pytz/zoneinfo/America/Indiana/Marengo.py new file mode 100644 index 00000000..3eca6df0 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Marengo.py @@ -0,0 +1,224 @@ +'''tzinfo timezone information for America/Indiana/Marengo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Marengo(DstTzInfo): + '''America/Indiana/Marengo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Marengo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,9,30,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,9,27,7,0,0), +d(1960,4,24,8,0,0), +d(1960,9,25,7,0,0), +d(1961,4,30,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Marengo = Marengo() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Petersburg.py b/vendor/pytz/zoneinfo/America/Indiana/Petersburg.py new file mode 100644 index 00000000..71b842d1 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Petersburg.py @@ -0,0 +1,250 @@ +'''tzinfo timezone information for America/Indiana/Petersburg.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Petersburg(DstTzInfo): + '''America/Indiana/Petersburg timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Petersburg' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1955,5,1,6,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,9,30,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,9,27,7,0,0), +d(1960,4,24,8,0,0), +d(1960,9,25,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1962,10,28,7,0,0), +d(1963,4,28,8,0,0), +d(1963,10,27,7,0,0), +d(1964,4,26,8,0,0), +d(1964,10,25,7,0,0), +d(1965,4,25,8,0,0), +d(1966,10,30,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Petersburg = Petersburg() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Vevay.py b/vendor/pytz/zoneinfo/America/Indiana/Vevay.py new file mode 100644 index 00000000..614e1de4 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Vevay.py @@ -0,0 +1,180 @@ +'''tzinfo timezone information for America/Indiana/Vevay.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vevay(DstTzInfo): + '''America/Indiana/Vevay timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Vevay' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1954,4,25,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Vevay = Vevay() + diff --git a/vendor/pytz/zoneinfo/America/Indiana/Vincennes.py b/vendor/pytz/zoneinfo/America/Indiana/Vincennes.py new file mode 100644 index 00000000..8365daeb --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indiana/Vincennes.py @@ -0,0 +1,220 @@ +'''tzinfo timezone information for America/Indiana/Vincennes.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vincennes(DstTzInfo): + '''America/Indiana/Vincennes timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indiana/Vincennes' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,5,1,6,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,9,30,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,9,27,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,9,24,7,0,0), +d(1962,4,29,8,0,0), +d(1962,10,28,7,0,0), +d(1963,4,28,8,0,0), +d(1963,10,27,7,0,0), +d(1964,4,26,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Vincennes = Vincennes() + diff --git a/vendor/flask/testsuite/test_apps/moduleapp/apps/__init__.py b/vendor/pytz/zoneinfo/America/Indiana/__init__.py similarity index 100% rename from vendor/flask/testsuite/test_apps/moduleapp/apps/__init__.py rename to vendor/pytz/zoneinfo/America/Indiana/__init__.py diff --git a/vendor/pytz/zoneinfo/America/Indianapolis.py b/vendor/pytz/zoneinfo/America/Indianapolis.py new file mode 100644 index 00000000..5cd52ede --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Indianapolis.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for America/Indianapolis.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Indianapolis(DstTzInfo): + '''America/Indianapolis timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Indianapolis' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1941,6,22,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Indianapolis = Indianapolis() + diff --git a/vendor/pytz/zoneinfo/America/Inuvik.py b/vendor/pytz/zoneinfo/America/Inuvik.py new file mode 100644 index 00000000..235d774d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Inuvik.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for America/Inuvik.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Inuvik(DstTzInfo): + '''America/Inuvik timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Inuvik' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,10,0,0), +d(1918,10,27,9,0,0), +d(1919,5,25,10,0,0), +d(1919,11,1,7,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1965,4,25,8,0,0), +d(1965,10,31,8,0,0), +d(1979,4,29,10,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-21600,7200,'PDDT'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Inuvik = Inuvik() + diff --git a/vendor/pytz/zoneinfo/America/Iqaluit.py b/vendor/pytz/zoneinfo/America/Iqaluit.py new file mode 100644 index 00000000..69597a4e --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Iqaluit.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for America/Iqaluit.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Iqaluit(DstTzInfo): + '''America/Iqaluit timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Iqaluit' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,7,0,0), +d(1918,10,27,6,0,0), +d(1919,5,25,7,0,0), +d(1919,11,1,4,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1965,4,25,5,0,0), +d(1965,10,31,5,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-10800,7200,'EDDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Iqaluit = Iqaluit() + diff --git a/vendor/pytz/zoneinfo/America/Jamaica.py b/vendor/pytz/zoneinfo/America/Jamaica.py new file mode 100644 index 00000000..e9a82f58 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Jamaica.py @@ -0,0 +1,62 @@ +'''tzinfo timezone information for America/Jamaica.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jamaica(DstTzInfo): + '''America/Jamaica timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Jamaica' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,1,5,7,12), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), + ] + + _transition_info = [ +i(-18420,0,'KMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Jamaica = Jamaica() + diff --git a/vendor/pytz/zoneinfo/America/Jujuy.py b/vendor/pytz/zoneinfo/America/Jujuy.py new file mode 100644 index 00000000..3a1025b7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Jujuy.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Jujuy.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jujuy(DstTzInfo): + '''America/Jujuy timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Jujuy' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,28,4,0,0), +d(1991,3,17,3,0,0), +d(1991,10,6,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Jujuy = Jujuy() + diff --git a/vendor/pytz/zoneinfo/America/Juneau.py b/vendor/pytz/zoneinfo/America/Juneau.py new file mode 100644 index 00000000..def09cc7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Juneau.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for America/Juneau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Juneau(DstTzInfo): + '''America/Juneau timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Juneau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,1,6,10,0,0), +d(1974,10,27,9,0,0), +d(1975,2,23,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1983,11,30,9,0,0), +d(1984,4,29,11,0,0), +d(1984,10,28,10,0,0), +d(1985,4,28,11,0,0), +d(1985,10,27,10,0,0), +d(1986,4,27,11,0,0), +d(1986,10,26,10,0,0), +d(1987,4,5,11,0,0), +d(1987,10,25,10,0,0), +d(1988,4,3,11,0,0), +d(1988,10,30,10,0,0), +d(1989,4,2,11,0,0), +d(1989,10,29,10,0,0), +d(1990,4,1,11,0,0), +d(1990,10,28,10,0,0), +d(1991,4,7,11,0,0), +d(1991,10,27,10,0,0), +d(1992,4,5,11,0,0), +d(1992,10,25,10,0,0), +d(1993,4,4,11,0,0), +d(1993,10,31,10,0,0), +d(1994,4,3,11,0,0), +d(1994,10,30,10,0,0), +d(1995,4,2,11,0,0), +d(1995,10,29,10,0,0), +d(1996,4,7,11,0,0), +d(1996,10,27,10,0,0), +d(1997,4,6,11,0,0), +d(1997,10,26,10,0,0), +d(1998,4,5,11,0,0), +d(1998,10,25,10,0,0), +d(1999,4,4,11,0,0), +d(1999,10,31,10,0,0), +d(2000,4,2,11,0,0), +d(2000,10,29,10,0,0), +d(2001,4,1,11,0,0), +d(2001,10,28,10,0,0), +d(2002,4,7,11,0,0), +d(2002,10,27,10,0,0), +d(2003,4,6,11,0,0), +d(2003,10,26,10,0,0), +d(2004,4,4,11,0,0), +d(2004,10,31,10,0,0), +d(2005,4,3,11,0,0), +d(2005,10,30,10,0,0), +d(2006,4,2,11,0,0), +d(2006,10,29,10,0,0), +d(2007,3,11,11,0,0), +d(2007,11,4,10,0,0), +d(2008,3,9,11,0,0), +d(2008,11,2,10,0,0), +d(2009,3,8,11,0,0), +d(2009,11,1,10,0,0), +d(2010,3,14,11,0,0), +d(2010,11,7,10,0,0), +d(2011,3,13,11,0,0), +d(2011,11,6,10,0,0), +d(2012,3,11,11,0,0), +d(2012,11,4,10,0,0), +d(2013,3,10,11,0,0), +d(2013,11,3,10,0,0), +d(2014,3,9,11,0,0), +d(2014,11,2,10,0,0), +d(2015,3,8,11,0,0), +d(2015,11,1,10,0,0), +d(2016,3,13,11,0,0), +d(2016,11,6,10,0,0), +d(2017,3,12,11,0,0), +d(2017,11,5,10,0,0), +d(2018,3,11,11,0,0), +d(2018,11,4,10,0,0), +d(2019,3,10,11,0,0), +d(2019,11,3,10,0,0), +d(2020,3,8,11,0,0), +d(2020,11,1,10,0,0), +d(2021,3,14,11,0,0), +d(2021,11,7,10,0,0), +d(2022,3,13,11,0,0), +d(2022,11,6,10,0,0), +d(2023,3,12,11,0,0), +d(2023,11,5,10,0,0), +d(2024,3,10,11,0,0), +d(2024,11,3,10,0,0), +d(2025,3,9,11,0,0), +d(2025,11,2,10,0,0), +d(2026,3,8,11,0,0), +d(2026,11,1,10,0,0), +d(2027,3,14,11,0,0), +d(2027,11,7,10,0,0), +d(2028,3,12,11,0,0), +d(2028,11,5,10,0,0), +d(2029,3,11,11,0,0), +d(2029,11,4,10,0,0), +d(2030,3,10,11,0,0), +d(2030,11,3,10,0,0), +d(2031,3,9,11,0,0), +d(2031,11,2,10,0,0), +d(2032,3,14,11,0,0), +d(2032,11,7,10,0,0), +d(2033,3,13,11,0,0), +d(2033,11,6,10,0,0), +d(2034,3,12,11,0,0), +d(2034,11,5,10,0,0), +d(2035,3,11,11,0,0), +d(2035,11,4,10,0,0), +d(2036,3,9,11,0,0), +d(2036,11,2,10,0,0), +d(2037,3,8,11,0,0), +d(2037,11,1,10,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-32400,0,'YST'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), + ] + +Juneau = Juneau() + diff --git a/vendor/pytz/zoneinfo/America/Kentucky/Louisville.py b/vendor/pytz/zoneinfo/America/Kentucky/Louisville.py new file mode 100644 index 00000000..501f4566 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Kentucky/Louisville.py @@ -0,0 +1,374 @@ +'''tzinfo timezone information for America/Kentucky/Louisville.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Louisville(DstTzInfo): + '''America/Kentucky/Louisville timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Kentucky/Louisville' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1921,5,1,8,0,0), +d(1921,9,1,7,0,0), +d(1941,4,27,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,1,1,6,0,0), +d(1946,6,2,7,0,0), +d(1947,4,27,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,10,27,7,0,0), +d(1958,4,27,8,0,0), +d(1958,10,26,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,7,23,7,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Louisville = Louisville() + diff --git a/vendor/pytz/zoneinfo/America/Kentucky/Monticello.py b/vendor/pytz/zoneinfo/America/Kentucky/Monticello.py new file mode 100644 index 00000000..a74d82b9 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Kentucky/Monticello.py @@ -0,0 +1,314 @@ +'''tzinfo timezone information for America/Kentucky/Monticello.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Monticello(DstTzInfo): + '''America/Kentucky/Monticello timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Kentucky/Monticello' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Monticello = Monticello() + diff --git a/vendor/jinja2/testsuite/res/__init__.py b/vendor/pytz/zoneinfo/America/Kentucky/__init__.py similarity index 100% rename from vendor/jinja2/testsuite/res/__init__.py rename to vendor/pytz/zoneinfo/America/Kentucky/__init__.py diff --git a/vendor/pytz/zoneinfo/America/Knox_IN.py b/vendor/pytz/zoneinfo/America/Knox_IN.py new file mode 100644 index 00000000..b0f3b85a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Knox_IN.py @@ -0,0 +1,326 @@ +'''tzinfo timezone information for America/Knox_IN.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Knox_IN(DstTzInfo): + '''America/Knox_IN timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Knox_IN' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,10,30,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1963,10,27,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Knox_IN = Knox_IN() + diff --git a/vendor/pytz/zoneinfo/America/La_Paz.py b/vendor/pytz/zoneinfo/America/La_Paz.py new file mode 100644 index 00000000..bca04b08 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/La_Paz.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for America/La_Paz.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class La_Paz(DstTzInfo): + '''America/La_Paz timezone definition. See datetime.tzinfo for details''' + + zone = 'America/La_Paz' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1931,10,15,4,32,36), +d(1932,3,21,3,32,36), + ] + + _transition_info = [ +i(-16380,0,'CMT'), +i(-12780,3600,'BOST'), +i(-14400,0,'BOT'), + ] + +La_Paz = La_Paz() + diff --git a/vendor/pytz/zoneinfo/America/Lima.py b/vendor/pytz/zoneinfo/America/Lima.py new file mode 100644 index 00000000..657d87a5 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Lima.py @@ -0,0 +1,50 @@ +'''tzinfo timezone information for America/Lima.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lima(DstTzInfo): + '''America/Lima timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Lima' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,7,28,5,8,36), +d(1938,1,1,5,0,0), +d(1938,4,1,4,0,0), +d(1938,9,25,5,0,0), +d(1939,3,26,4,0,0), +d(1939,9,24,5,0,0), +d(1940,3,24,4,0,0), +d(1986,1,1,5,0,0), +d(1986,4,1,4,0,0), +d(1987,1,1,5,0,0), +d(1987,4,1,4,0,0), +d(1990,1,1,5,0,0), +d(1990,4,1,4,0,0), +d(1994,1,1,5,0,0), +d(1994,4,1,4,0,0), + ] + + _transition_info = [ +i(-18540,0,'LMT'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), +i(-14400,3600,'PEST'), +i(-18000,0,'PET'), + ] + +Lima = Lima() + diff --git a/vendor/pytz/zoneinfo/America/Los_Angeles.py b/vendor/pytz/zoneinfo/America/Los_Angeles.py new file mode 100644 index 00000000..5add3d1a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Los_Angeles.py @@ -0,0 +1,390 @@ +'''tzinfo timezone information for America/Los_Angeles.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Los_Angeles(DstTzInfo): + '''America/Los_Angeles timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Los_Angeles' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,10,0,0), +d(1918,10,27,9,0,0), +d(1919,3,30,10,0,0), +d(1919,10,26,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1948,3,14,10,0,0), +d(1949,1,1,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,1,6,10,0,0), +d(1974,10,27,9,0,0), +d(1975,2,23,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Los_Angeles = Los_Angeles() + diff --git a/vendor/pytz/zoneinfo/America/Louisville.py b/vendor/pytz/zoneinfo/America/Louisville.py new file mode 100644 index 00000000..1c0e3ccf --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Louisville.py @@ -0,0 +1,374 @@ +'''tzinfo timezone information for America/Louisville.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Louisville(DstTzInfo): + '''America/Louisville timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Louisville' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1921,5,1,8,0,0), +d(1921,9,1,7,0,0), +d(1941,4,27,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,1,1,6,0,0), +d(1946,6,2,7,0,0), +d(1947,4,27,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,10,27,7,0,0), +d(1958,4,27,8,0,0), +d(1958,10,26,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,7,23,7,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Louisville = Louisville() + diff --git a/vendor/pytz/zoneinfo/America/Maceio.py b/vendor/pytz/zoneinfo/America/Maceio.py new file mode 100644 index 00000000..d4ac830c --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Maceio.py @@ -0,0 +1,102 @@ +'''tzinfo timezone information for America/Maceio.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Maceio(DstTzInfo): + '''America/Maceio timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Maceio' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,22,52), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1995,10,15,3,0,0), +d(1996,2,11,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2000,10,22,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), + ] + + _transition_info = [ +i(-8580,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Maceio = Maceio() + diff --git a/vendor/pytz/zoneinfo/America/Managua.py b/vendor/pytz/zoneinfo/America/Managua.py new file mode 100644 index 00000000..bf8a6beb --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Managua.py @@ -0,0 +1,50 @@ +'''tzinfo timezone information for America/Managua.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Managua(DstTzInfo): + '''America/Managua timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Managua' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1934,6,23,5,45,12), +d(1973,5,1,6,0,0), +d(1975,2,16,5,0,0), +d(1979,3,18,6,0,0), +d(1979,6,25,5,0,0), +d(1980,3,16,6,0,0), +d(1980,6,23,5,0,0), +d(1992,1,1,10,0,0), +d(1992,9,24,5,0,0), +d(1993,1,1,6,0,0), +d(1997,1,1,5,0,0), +d(2005,4,10,6,0,0), +d(2005,10,2,5,0,0), +d(2006,4,30,8,0,0), +d(2006,10,1,6,0,0), + ] + + _transition_info = [ +i(-20700,0,'MMT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Managua = Managua() + diff --git a/vendor/pytz/zoneinfo/America/Manaus.py b/vendor/pytz/zoneinfo/America/Manaus.py new file mode 100644 index 00000000..b190af1b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Manaus.py @@ -0,0 +1,82 @@ +'''tzinfo timezone information for America/Manaus.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Manaus(DstTzInfo): + '''America/Manaus timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Manaus' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,0,4), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), +d(1993,10,17,4,0,0), +d(1994,2,20,3,0,0), + ] + + _transition_info = [ +i(-14400,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), + ] + +Manaus = Manaus() + diff --git a/vendor/pytz/zoneinfo/America/Martinique.py b/vendor/pytz/zoneinfo/America/Martinique.py new file mode 100644 index 00000000..7154b4f2 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Martinique.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for America/Martinique.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Martinique(DstTzInfo): + '''America/Martinique timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Martinique' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,1,4,4,20), +d(1980,4,6,4,0,0), +d(1980,9,28,3,0,0), + ] + + _transition_info = [ +i(-14640,0,'FFMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Martinique = Martinique() + diff --git a/vendor/pytz/zoneinfo/America/Mazatlan.py b/vendor/pytz/zoneinfo/America/Mazatlan.py new file mode 100644 index 00000000..30490aa4 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Mazatlan.py @@ -0,0 +1,206 @@ +'''tzinfo timezone information for America/Mazatlan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mazatlan(DstTzInfo): + '''America/Mazatlan timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Mazatlan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1942,4,24,6,0,0), +d(1949,1,14,7,0,0), +d(1970,1,1,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,5,6,9,0,0), +d(2001,9,30,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,4,1,9,0,0), +d(2007,10,28,8,0,0), +d(2008,4,6,9,0,0), +d(2008,10,26,8,0,0), +d(2009,4,5,9,0,0), +d(2009,10,25,8,0,0), +d(2010,4,4,9,0,0), +d(2010,10,31,8,0,0), +d(2011,4,3,9,0,0), +d(2011,10,30,8,0,0), +d(2012,4,1,9,0,0), +d(2012,10,28,8,0,0), +d(2013,4,7,9,0,0), +d(2013,10,27,8,0,0), +d(2014,4,6,9,0,0), +d(2014,10,26,8,0,0), +d(2015,4,5,9,0,0), +d(2015,10,25,8,0,0), +d(2016,4,3,9,0,0), +d(2016,10,30,8,0,0), +d(2017,4,2,9,0,0), +d(2017,10,29,8,0,0), +d(2018,4,1,9,0,0), +d(2018,10,28,8,0,0), +d(2019,4,7,9,0,0), +d(2019,10,27,8,0,0), +d(2020,4,5,9,0,0), +d(2020,10,25,8,0,0), +d(2021,4,4,9,0,0), +d(2021,10,31,8,0,0), +d(2022,4,3,9,0,0), +d(2022,10,30,8,0,0), +d(2023,4,2,9,0,0), +d(2023,10,29,8,0,0), +d(2024,4,7,9,0,0), +d(2024,10,27,8,0,0), +d(2025,4,6,9,0,0), +d(2025,10,26,8,0,0), +d(2026,4,5,9,0,0), +d(2026,10,25,8,0,0), +d(2027,4,4,9,0,0), +d(2027,10,31,8,0,0), +d(2028,4,2,9,0,0), +d(2028,10,29,8,0,0), +d(2029,4,1,9,0,0), +d(2029,10,28,8,0,0), +d(2030,4,7,9,0,0), +d(2030,10,27,8,0,0), +d(2031,4,6,9,0,0), +d(2031,10,26,8,0,0), +d(2032,4,4,9,0,0), +d(2032,10,31,8,0,0), +d(2033,4,3,9,0,0), +d(2033,10,30,8,0,0), +d(2034,4,2,9,0,0), +d(2034,10,29,8,0,0), +d(2035,4,1,9,0,0), +d(2035,10,28,8,0,0), +d(2036,4,6,9,0,0), +d(2036,10,26,8,0,0), +d(2037,4,5,9,0,0), +d(2037,10,25,8,0,0), + ] + + _transition_info = [ +i(-25560,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Mazatlan = Mazatlan() + diff --git a/vendor/pytz/zoneinfo/America/Mendoza.py b/vendor/pytz/zoneinfo/America/Mendoza.py new file mode 100644 index 00000000..2c00395a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Mendoza.py @@ -0,0 +1,136 @@ +'''tzinfo timezone information for America/Mendoza.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mendoza(DstTzInfo): + '''America/Mendoza timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Mendoza' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,15,4,0,0), +d(1991,3,1,3,0,0), +d(1991,10,15,4,0,0), +d(1992,3,1,3,0,0), +d(1992,10,18,4,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), +d(2004,5,23,3,0,0), +d(2004,9,26,4,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-10800,3600,'WARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'WART'), +i(-10800,0,'ART'), + ] + +Mendoza = Mendoza() + diff --git a/vendor/pytz/zoneinfo/America/Menominee.py b/vendor/pytz/zoneinfo/America/Menominee.py new file mode 100644 index 00000000..63a65310 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Menominee.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for America/Menominee.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Menominee(DstTzInfo): + '''America/Menominee timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Menominee' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1966,4,24,8,0,0), +d(1966,10,30,7,0,0), +d(1969,4,27,8,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Menominee = Menominee() + diff --git a/vendor/pytz/zoneinfo/America/Merida.py b/vendor/pytz/zoneinfo/America/Merida.py new file mode 100644 index 00000000..e50f96ea --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Merida.py @@ -0,0 +1,194 @@ +'''tzinfo timezone information for America/Merida.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Merida(DstTzInfo): + '''America/Merida timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Merida' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,6,0,0), +d(1981,12,23,6,0,0), +d(1982,12,2,5,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,5,6,8,0,0), +d(2001,9,30,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,4,1,8,0,0), +d(2007,10,28,7,0,0), +d(2008,4,6,8,0,0), +d(2008,10,26,7,0,0), +d(2009,4,5,8,0,0), +d(2009,10,25,7,0,0), +d(2010,4,4,8,0,0), +d(2010,10,31,7,0,0), +d(2011,4,3,8,0,0), +d(2011,10,30,7,0,0), +d(2012,4,1,8,0,0), +d(2012,10,28,7,0,0), +d(2013,4,7,8,0,0), +d(2013,10,27,7,0,0), +d(2014,4,6,8,0,0), +d(2014,10,26,7,0,0), +d(2015,4,5,8,0,0), +d(2015,10,25,7,0,0), +d(2016,4,3,8,0,0), +d(2016,10,30,7,0,0), +d(2017,4,2,8,0,0), +d(2017,10,29,7,0,0), +d(2018,4,1,8,0,0), +d(2018,10,28,7,0,0), +d(2019,4,7,8,0,0), +d(2019,10,27,7,0,0), +d(2020,4,5,8,0,0), +d(2020,10,25,7,0,0), +d(2021,4,4,8,0,0), +d(2021,10,31,7,0,0), +d(2022,4,3,8,0,0), +d(2022,10,30,7,0,0), +d(2023,4,2,8,0,0), +d(2023,10,29,7,0,0), +d(2024,4,7,8,0,0), +d(2024,10,27,7,0,0), +d(2025,4,6,8,0,0), +d(2025,10,26,7,0,0), +d(2026,4,5,8,0,0), +d(2026,10,25,7,0,0), +d(2027,4,4,8,0,0), +d(2027,10,31,7,0,0), +d(2028,4,2,8,0,0), +d(2028,10,29,7,0,0), +d(2029,4,1,8,0,0), +d(2029,10,28,7,0,0), +d(2030,4,7,8,0,0), +d(2030,10,27,7,0,0), +d(2031,4,6,8,0,0), +d(2031,10,26,7,0,0), +d(2032,4,4,8,0,0), +d(2032,10,31,7,0,0), +d(2033,4,3,8,0,0), +d(2033,10,30,7,0,0), +d(2034,4,2,8,0,0), +d(2034,10,29,7,0,0), +d(2035,4,1,8,0,0), +d(2035,10,28,7,0,0), +d(2036,4,6,8,0,0), +d(2036,10,26,7,0,0), +d(2037,4,5,8,0,0), +d(2037,10,25,7,0,0), + ] + + _transition_info = [ +i(-21480,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Merida = Merida() + diff --git a/vendor/pytz/zoneinfo/America/Mexico_City.py b/vendor/pytz/zoneinfo/America/Mexico_City.py new file mode 100644 index 00000000..e9b6ed0b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Mexico_City.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for America/Mexico_City.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mexico_City(DstTzInfo): + '''America/Mexico_City timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Mexico_City' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1939,2,5,6,0,0), +d(1939,6,25,5,0,0), +d(1940,12,9,6,0,0), +d(1941,4,1,5,0,0), +d(1943,12,16,6,0,0), +d(1944,5,1,5,0,0), +d(1950,2,12,6,0,0), +d(1950,7,30,5,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,5,6,8,0,0), +d(2001,9,30,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,4,1,8,0,0), +d(2007,10,28,7,0,0), +d(2008,4,6,8,0,0), +d(2008,10,26,7,0,0), +d(2009,4,5,8,0,0), +d(2009,10,25,7,0,0), +d(2010,4,4,8,0,0), +d(2010,10,31,7,0,0), +d(2011,4,3,8,0,0), +d(2011,10,30,7,0,0), +d(2012,4,1,8,0,0), +d(2012,10,28,7,0,0), +d(2013,4,7,8,0,0), +d(2013,10,27,7,0,0), +d(2014,4,6,8,0,0), +d(2014,10,26,7,0,0), +d(2015,4,5,8,0,0), +d(2015,10,25,7,0,0), +d(2016,4,3,8,0,0), +d(2016,10,30,7,0,0), +d(2017,4,2,8,0,0), +d(2017,10,29,7,0,0), +d(2018,4,1,8,0,0), +d(2018,10,28,7,0,0), +d(2019,4,7,8,0,0), +d(2019,10,27,7,0,0), +d(2020,4,5,8,0,0), +d(2020,10,25,7,0,0), +d(2021,4,4,8,0,0), +d(2021,10,31,7,0,0), +d(2022,4,3,8,0,0), +d(2022,10,30,7,0,0), +d(2023,4,2,8,0,0), +d(2023,10,29,7,0,0), +d(2024,4,7,8,0,0), +d(2024,10,27,7,0,0), +d(2025,4,6,8,0,0), +d(2025,10,26,7,0,0), +d(2026,4,5,8,0,0), +d(2026,10,25,7,0,0), +d(2027,4,4,8,0,0), +d(2027,10,31,7,0,0), +d(2028,4,2,8,0,0), +d(2028,10,29,7,0,0), +d(2029,4,1,8,0,0), +d(2029,10,28,7,0,0), +d(2030,4,7,8,0,0), +d(2030,10,27,7,0,0), +d(2031,4,6,8,0,0), +d(2031,10,26,7,0,0), +d(2032,4,4,8,0,0), +d(2032,10,31,7,0,0), +d(2033,4,3,8,0,0), +d(2033,10,30,7,0,0), +d(2034,4,2,8,0,0), +d(2034,10,29,7,0,0), +d(2035,4,1,8,0,0), +d(2035,10,28,7,0,0), +d(2036,4,6,8,0,0), +d(2036,10,26,7,0,0), +d(2037,4,5,8,0,0), +d(2037,10,25,7,0,0), + ] + + _transition_info = [ +i(-23820,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Mexico_City = Mexico_City() + diff --git a/vendor/pytz/zoneinfo/America/Miquelon.py b/vendor/pytz/zoneinfo/America/Miquelon.py new file mode 100644 index 00000000..f4dedbfc --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Miquelon.py @@ -0,0 +1,228 @@ +'''tzinfo timezone information for America/Miquelon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Miquelon(DstTzInfo): + '''America/Miquelon timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Miquelon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,15,3,44,40), +d(1980,5,1,4,0,0), +d(1987,4,5,5,0,0), +d(1987,10,25,4,0,0), +d(1988,4,3,5,0,0), +d(1988,10,30,4,0,0), +d(1989,4,2,5,0,0), +d(1989,10,29,4,0,0), +d(1990,4,1,5,0,0), +d(1990,10,28,4,0,0), +d(1991,4,7,5,0,0), +d(1991,10,27,4,0,0), +d(1992,4,5,5,0,0), +d(1992,10,25,4,0,0), +d(1993,4,4,5,0,0), +d(1993,10,31,4,0,0), +d(1994,4,3,5,0,0), +d(1994,10,30,4,0,0), +d(1995,4,2,5,0,0), +d(1995,10,29,4,0,0), +d(1996,4,7,5,0,0), +d(1996,10,27,4,0,0), +d(1997,4,6,5,0,0), +d(1997,10,26,4,0,0), +d(1998,4,5,5,0,0), +d(1998,10,25,4,0,0), +d(1999,4,4,5,0,0), +d(1999,10,31,4,0,0), +d(2000,4,2,5,0,0), +d(2000,10,29,4,0,0), +d(2001,4,1,5,0,0), +d(2001,10,28,4,0,0), +d(2002,4,7,5,0,0), +d(2002,10,27,4,0,0), +d(2003,4,6,5,0,0), +d(2003,10,26,4,0,0), +d(2004,4,4,5,0,0), +d(2004,10,31,4,0,0), +d(2005,4,3,5,0,0), +d(2005,10,30,4,0,0), +d(2006,4,2,5,0,0), +d(2006,10,29,4,0,0), +d(2007,3,11,5,0,0), +d(2007,11,4,4,0,0), +d(2008,3,9,5,0,0), +d(2008,11,2,4,0,0), +d(2009,3,8,5,0,0), +d(2009,11,1,4,0,0), +d(2010,3,14,5,0,0), +d(2010,11,7,4,0,0), +d(2011,3,13,5,0,0), +d(2011,11,6,4,0,0), +d(2012,3,11,5,0,0), +d(2012,11,4,4,0,0), +d(2013,3,10,5,0,0), +d(2013,11,3,4,0,0), +d(2014,3,9,5,0,0), +d(2014,11,2,4,0,0), +d(2015,3,8,5,0,0), +d(2015,11,1,4,0,0), +d(2016,3,13,5,0,0), +d(2016,11,6,4,0,0), +d(2017,3,12,5,0,0), +d(2017,11,5,4,0,0), +d(2018,3,11,5,0,0), +d(2018,11,4,4,0,0), +d(2019,3,10,5,0,0), +d(2019,11,3,4,0,0), +d(2020,3,8,5,0,0), +d(2020,11,1,4,0,0), +d(2021,3,14,5,0,0), +d(2021,11,7,4,0,0), +d(2022,3,13,5,0,0), +d(2022,11,6,4,0,0), +d(2023,3,12,5,0,0), +d(2023,11,5,4,0,0), +d(2024,3,10,5,0,0), +d(2024,11,3,4,0,0), +d(2025,3,9,5,0,0), +d(2025,11,2,4,0,0), +d(2026,3,8,5,0,0), +d(2026,11,1,4,0,0), +d(2027,3,14,5,0,0), +d(2027,11,7,4,0,0), +d(2028,3,12,5,0,0), +d(2028,11,5,4,0,0), +d(2029,3,11,5,0,0), +d(2029,11,4,4,0,0), +d(2030,3,10,5,0,0), +d(2030,11,3,4,0,0), +d(2031,3,9,5,0,0), +d(2031,11,2,4,0,0), +d(2032,3,14,5,0,0), +d(2032,11,7,4,0,0), +d(2033,3,13,5,0,0), +d(2033,11,6,4,0,0), +d(2034,3,12,5,0,0), +d(2034,11,5,4,0,0), +d(2035,3,11,5,0,0), +d(2035,11,4,4,0,0), +d(2036,3,9,5,0,0), +d(2036,11,2,4,0,0), +d(2037,3,8,5,0,0), +d(2037,11,1,4,0,0), + ] + + _transition_info = [ +i(-13500,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), +i(-7200,3600,'PMDT'), +i(-10800,0,'PMST'), + ] + +Miquelon = Miquelon() + diff --git a/vendor/pytz/zoneinfo/America/Moncton.py b/vendor/pytz/zoneinfo/America/Moncton.py new file mode 100644 index 00000000..f72c5e0a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Moncton.py @@ -0,0 +1,432 @@ +'''tzinfo timezone information for America/Moncton.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Moncton(DstTzInfo): + '''America/Moncton timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Moncton' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1902,6,15,5,0,0), +d(1918,4,14,6,0,0), +d(1918,10,31,5,0,0), +d(1933,6,11,5,0,0), +d(1933,9,10,4,0,0), +d(1934,6,10,5,0,0), +d(1934,9,9,4,0,0), +d(1935,6,9,5,0,0), +d(1935,9,8,4,0,0), +d(1936,6,7,5,0,0), +d(1936,9,6,4,0,0), +d(1937,6,6,5,0,0), +d(1937,9,5,4,0,0), +d(1938,6,5,5,0,0), +d(1938,9,4,4,0,0), +d(1939,5,27,5,0,0), +d(1939,9,23,4,0,0), +d(1940,5,19,5,0,0), +d(1940,9,21,4,0,0), +d(1941,5,4,5,0,0), +d(1941,9,27,4,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), +d(1946,4,28,6,0,0), +d(1946,9,29,5,0,0), +d(1947,4,27,6,0,0), +d(1947,9,28,5,0,0), +d(1948,4,25,6,0,0), +d(1948,9,26,5,0,0), +d(1949,4,24,6,0,0), +d(1949,9,25,5,0,0), +d(1950,4,30,6,0,0), +d(1950,9,24,5,0,0), +d(1951,4,29,6,0,0), +d(1951,9,30,5,0,0), +d(1952,4,27,6,0,0), +d(1952,9,28,5,0,0), +d(1953,4,26,6,0,0), +d(1953,9,27,5,0,0), +d(1954,4,25,6,0,0), +d(1954,9,26,5,0,0), +d(1955,4,24,6,0,0), +d(1955,9,25,5,0,0), +d(1956,4,29,6,0,0), +d(1956,9,30,5,0,0), +d(1957,4,28,6,0,0), +d(1957,10,27,5,0,0), +d(1958,4,27,6,0,0), +d(1958,10,26,5,0,0), +d(1959,4,26,6,0,0), +d(1959,10,25,5,0,0), +d(1960,4,24,6,0,0), +d(1960,10,30,5,0,0), +d(1961,4,30,6,0,0), +d(1961,10,29,5,0,0), +d(1962,4,29,6,0,0), +d(1962,10,28,5,0,0), +d(1963,4,28,6,0,0), +d(1963,10,27,5,0,0), +d(1964,4,26,6,0,0), +d(1964,10,25,5,0,0), +d(1965,4,25,6,0,0), +d(1965,10,31,5,0,0), +d(1966,4,24,6,0,0), +d(1966,10,30,5,0,0), +d(1967,4,30,6,0,0), +d(1967,10,29,5,0,0), +d(1968,4,28,6,0,0), +d(1968,10,27,5,0,0), +d(1969,4,27,6,0,0), +d(1969,10,26,5,0,0), +d(1970,4,26,6,0,0), +d(1970,10,25,5,0,0), +d(1971,4,25,6,0,0), +d(1971,10,31,5,0,0), +d(1972,4,30,6,0,0), +d(1972,10,29,5,0,0), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,4,1,0), +d(1993,10,31,3,1,0), +d(1994,4,3,4,1,0), +d(1994,10,30,3,1,0), +d(1995,4,2,4,1,0), +d(1995,10,29,3,1,0), +d(1996,4,7,4,1,0), +d(1996,10,27,3,1,0), +d(1997,4,6,4,1,0), +d(1997,10,26,3,1,0), +d(1998,4,5,4,1,0), +d(1998,10,25,3,1,0), +d(1999,4,4,4,1,0), +d(1999,10,31,3,1,0), +d(2000,4,2,4,1,0), +d(2000,10,29,3,1,0), +d(2001,4,1,4,1,0), +d(2001,10,28,3,1,0), +d(2002,4,7,4,1,0), +d(2002,10,27,3,1,0), +d(2003,4,6,4,1,0), +d(2003,10,26,3,1,0), +d(2004,4,4,4,1,0), +d(2004,10,31,3,1,0), +d(2005,4,3,4,1,0), +d(2005,10,30,3,1,0), +d(2006,4,2,4,1,0), +d(2006,10,29,3,1,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Moncton = Moncton() + diff --git a/vendor/pytz/zoneinfo/America/Monterrey.py b/vendor/pytz/zoneinfo/America/Monterrey.py new file mode 100644 index 00000000..32b924a7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Monterrey.py @@ -0,0 +1,194 @@ +'''tzinfo timezone information for America/Monterrey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Monterrey(DstTzInfo): + '''America/Monterrey timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Monterrey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,6,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,5,6,8,0,0), +d(2001,9,30,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,4,1,8,0,0), +d(2007,10,28,7,0,0), +d(2008,4,6,8,0,0), +d(2008,10,26,7,0,0), +d(2009,4,5,8,0,0), +d(2009,10,25,7,0,0), +d(2010,4,4,8,0,0), +d(2010,10,31,7,0,0), +d(2011,4,3,8,0,0), +d(2011,10,30,7,0,0), +d(2012,4,1,8,0,0), +d(2012,10,28,7,0,0), +d(2013,4,7,8,0,0), +d(2013,10,27,7,0,0), +d(2014,4,6,8,0,0), +d(2014,10,26,7,0,0), +d(2015,4,5,8,0,0), +d(2015,10,25,7,0,0), +d(2016,4,3,8,0,0), +d(2016,10,30,7,0,0), +d(2017,4,2,8,0,0), +d(2017,10,29,7,0,0), +d(2018,4,1,8,0,0), +d(2018,10,28,7,0,0), +d(2019,4,7,8,0,0), +d(2019,10,27,7,0,0), +d(2020,4,5,8,0,0), +d(2020,10,25,7,0,0), +d(2021,4,4,8,0,0), +d(2021,10,31,7,0,0), +d(2022,4,3,8,0,0), +d(2022,10,30,7,0,0), +d(2023,4,2,8,0,0), +d(2023,10,29,7,0,0), +d(2024,4,7,8,0,0), +d(2024,10,27,7,0,0), +d(2025,4,6,8,0,0), +d(2025,10,26,7,0,0), +d(2026,4,5,8,0,0), +d(2026,10,25,7,0,0), +d(2027,4,4,8,0,0), +d(2027,10,31,7,0,0), +d(2028,4,2,8,0,0), +d(2028,10,29,7,0,0), +d(2029,4,1,8,0,0), +d(2029,10,28,7,0,0), +d(2030,4,7,8,0,0), +d(2030,10,27,7,0,0), +d(2031,4,6,8,0,0), +d(2031,10,26,7,0,0), +d(2032,4,4,8,0,0), +d(2032,10,31,7,0,0), +d(2033,4,3,8,0,0), +d(2033,10,30,7,0,0), +d(2034,4,2,8,0,0), +d(2034,10,29,7,0,0), +d(2035,4,1,8,0,0), +d(2035,10,28,7,0,0), +d(2036,4,6,8,0,0), +d(2036,10,26,7,0,0), +d(2037,4,5,8,0,0), +d(2037,10,25,7,0,0), + ] + + _transition_info = [ +i(-24060,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Monterrey = Monterrey() + diff --git a/vendor/pytz/zoneinfo/America/Montevideo.py b/vendor/pytz/zoneinfo/America/Montevideo.py new file mode 100644 index 00000000..1ca0a9ae --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Montevideo.py @@ -0,0 +1,282 @@ +'''tzinfo timezone information for America/Montevideo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Montevideo(DstTzInfo): + '''America/Montevideo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Montevideo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,3,44,44), +d(1923,10,2,3,30,0), +d(1924,4,1,3,0,0), +d(1924,10,1,3,30,0), +d(1925,4,1,3,0,0), +d(1925,10,1,3,30,0), +d(1926,4,1,3,0,0), +d(1933,10,29,3,30,0), +d(1934,4,1,3,0,0), +d(1934,10,28,3,30,0), +d(1935,3,31,3,0,0), +d(1935,10,27,3,30,0), +d(1936,3,29,3,0,0), +d(1936,11,1,3,30,0), +d(1937,3,28,3,0,0), +d(1937,10,31,3,30,0), +d(1938,3,27,3,0,0), +d(1938,10,30,3,30,0), +d(1939,3,26,3,0,0), +d(1939,10,29,3,30,0), +d(1940,3,31,3,0,0), +d(1940,10,27,3,30,0), +d(1941,3,30,3,0,0), +d(1941,8,1,3,30,0), +d(1942,1,1,3,0,0), +d(1942,12,14,3,30,0), +d(1943,3,14,2,0,0), +d(1959,5,24,3,0,0), +d(1959,11,15,2,0,0), +d(1960,1,17,3,0,0), +d(1960,3,6,2,0,0), +d(1965,4,4,3,0,0), +d(1965,9,26,2,0,0), +d(1966,4,3,3,0,0), +d(1966,10,31,2,0,0), +d(1967,4,2,3,0,0), +d(1967,10,31,2,0,0), +d(1968,5,27,3,0,0), +d(1968,12,2,2,30,0), +d(1969,5,27,3,0,0), +d(1969,12,2,2,30,0), +d(1970,5,27,3,0,0), +d(1970,12,2,2,30,0), +d(1972,4,24,3,0,0), +d(1972,8,15,2,0,0), +d(1974,3,10,3,0,0), +d(1974,12,22,2,30,0), +d(1976,10,1,2,0,0), +d(1977,12,4,3,0,0), +d(1978,4,1,2,0,0), +d(1979,10,1,3,0,0), +d(1980,5,1,2,0,0), +d(1987,12,14,3,0,0), +d(1988,3,14,2,0,0), +d(1988,12,11,3,0,0), +d(1989,3,12,2,0,0), +d(1989,10,29,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,27,3,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,2,28,2,0,0), +d(2004,9,19,3,0,0), +d(2005,3,27,4,0,0), +d(2005,10,9,5,0,0), +d(2006,3,12,4,0,0), +d(2006,10,1,5,0,0), +d(2007,3,11,4,0,0), +d(2007,10,7,5,0,0), +d(2008,3,9,4,0,0), +d(2008,10,5,5,0,0), +d(2009,3,8,4,0,0), +d(2009,10,4,5,0,0), +d(2010,3,14,4,0,0), +d(2010,10,3,5,0,0), +d(2011,3,13,4,0,0), +d(2011,10,2,5,0,0), +d(2012,3,11,4,0,0), +d(2012,10,7,5,0,0), +d(2013,3,10,4,0,0), +d(2013,10,6,5,0,0), +d(2014,3,9,4,0,0), +d(2014,10,5,5,0,0), +d(2015,3,8,4,0,0), +d(2015,10,4,5,0,0), +d(2016,3,13,4,0,0), +d(2016,10,2,5,0,0), +d(2017,3,12,4,0,0), +d(2017,10,1,5,0,0), +d(2018,3,11,4,0,0), +d(2018,10,7,5,0,0), +d(2019,3,10,4,0,0), +d(2019,10,6,5,0,0), +d(2020,3,8,4,0,0), +d(2020,10,4,5,0,0), +d(2021,3,14,4,0,0), +d(2021,10,3,5,0,0), +d(2022,3,13,4,0,0), +d(2022,10,2,5,0,0), +d(2023,3,12,4,0,0), +d(2023,10,1,5,0,0), +d(2024,3,10,4,0,0), +d(2024,10,6,5,0,0), +d(2025,3,9,4,0,0), +d(2025,10,5,5,0,0), +d(2026,3,8,4,0,0), +d(2026,10,4,5,0,0), +d(2027,3,14,4,0,0), +d(2027,10,3,5,0,0), +d(2028,3,12,4,0,0), +d(2028,10,1,5,0,0), +d(2029,3,11,4,0,0), +d(2029,10,7,5,0,0), +d(2030,3,10,4,0,0), +d(2030,10,6,5,0,0), +d(2031,3,9,4,0,0), +d(2031,10,5,5,0,0), +d(2032,3,14,4,0,0), +d(2032,10,3,5,0,0), +d(2033,3,13,4,0,0), +d(2033,10,2,5,0,0), +d(2034,3,12,4,0,0), +d(2034,10,1,5,0,0), +d(2035,3,11,4,0,0), +d(2035,10,7,5,0,0), +d(2036,3,9,4,0,0), +d(2036,10,5,5,0,0), +d(2037,3,8,4,0,0), +d(2037,10,4,5,0,0), + ] + + _transition_info = [ +i(-13500,0,'MMT'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-10800,1800,'UYHST'), +i(-12600,0,'UYT'), +i(-7200,5400,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-9000,1800,'UYHST'), +i(-10800,0,'UYT'), +i(-9000,1800,'UYHST'), +i(-10800,0,'UYT'), +i(-9000,1800,'UYHST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-9000,1800,'UYHST'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), +i(-10800,0,'UYT'), +i(-7200,3600,'UYST'), + ] + +Montevideo = Montevideo() + diff --git a/vendor/pytz/zoneinfo/America/Montreal.py b/vendor/pytz/zoneinfo/America/Montreal.py new file mode 100644 index 00000000..f780e39f --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Montreal.py @@ -0,0 +1,484 @@ +'''tzinfo timezone information for America/Montreal.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Montreal(DstTzInfo): + '''America/Montreal timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Montreal' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,3,25,7,0,0), +d(1917,4,24,4,0,0), +d(1918,4,14,7,0,0), +d(1918,10,31,6,0,0), +d(1919,3,31,7,30,0), +d(1919,10,25,6,30,0), +d(1920,5,2,7,30,0), +d(1920,10,3,6,30,0), +d(1921,5,1,7,0,0), +d(1921,10,2,6,30,0), +d(1922,4,30,7,0,0), +d(1922,10,1,6,30,0), +d(1924,5,17,7,0,0), +d(1924,9,28,6,30,0), +d(1925,5,3,7,0,0), +d(1925,9,27,6,30,0), +d(1926,5,2,7,0,0), +d(1926,9,26,6,30,0), +d(1927,5,1,5,0,0), +d(1927,9,25,4,0,0), +d(1928,4,29,5,0,0), +d(1928,9,30,4,0,0), +d(1929,4,28,5,0,0), +d(1929,9,29,4,0,0), +d(1930,4,27,5,0,0), +d(1930,9,28,4,0,0), +d(1931,4,26,5,0,0), +d(1931,9,27,4,0,0), +d(1932,5,1,5,0,0), +d(1932,9,25,4,0,0), +d(1933,4,30,5,0,0), +d(1933,10,1,4,0,0), +d(1934,4,29,5,0,0), +d(1934,9,30,4,0,0), +d(1935,4,28,5,0,0), +d(1935,9,29,4,0,0), +d(1936,4,26,5,0,0), +d(1936,9,27,4,0,0), +d(1937,4,25,5,0,0), +d(1937,9,26,4,0,0), +d(1938,4,24,5,0,0), +d(1938,9,25,4,0,0), +d(1939,4,30,5,0,0), +d(1939,9,24,4,0,0), +d(1940,4,28,5,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,7,0,0), +d(1947,9,28,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1949,4,24,7,0,0), +d(1949,10,30,6,0,0), +d(1950,4,30,7,0,0), +d(1950,10,29,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,9,25,6,0,0), +d(1956,4,29,7,0,0), +d(1956,9,30,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Montreal = Montreal() + diff --git a/vendor/pytz/zoneinfo/America/Montserrat.py b/vendor/pytz/zoneinfo/America/Montserrat.py new file mode 100644 index 00000000..65ba519e --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Montserrat.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Montserrat.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Montserrat(DstTzInfo): + '''America/Montserrat timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Montserrat' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,9,52), + ] + + _transition_info = [ +i(-14940,0,'LMT'), +i(-14400,0,'AST'), + ] + +Montserrat = Montserrat() + diff --git a/vendor/pytz/zoneinfo/America/Nassau.py b/vendor/pytz/zoneinfo/America/Nassau.py new file mode 100644 index 00000000..d4bcdada --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Nassau.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for America/Nassau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nassau(DstTzInfo): + '''America/Nassau timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Nassau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,2,5,9,24), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,4,1,7,0,0), +d(2007,10,28,6,0,0), +d(2008,4,6,7,0,0), +d(2008,10,26,6,0,0), +d(2009,4,5,7,0,0), +d(2009,10,25,6,0,0), +d(2010,4,4,7,0,0), +d(2010,10,31,6,0,0), +d(2011,4,3,7,0,0), +d(2011,10,30,6,0,0), +d(2012,4,1,7,0,0), +d(2012,10,28,6,0,0), +d(2013,4,7,7,0,0), +d(2013,10,27,6,0,0), +d(2014,4,6,7,0,0), +d(2014,10,26,6,0,0), +d(2015,4,5,7,0,0), +d(2015,10,25,6,0,0), +d(2016,4,3,7,0,0), +d(2016,10,30,6,0,0), +d(2017,4,2,7,0,0), +d(2017,10,29,6,0,0), +d(2018,4,1,7,0,0), +d(2018,10,28,6,0,0), +d(2019,4,7,7,0,0), +d(2019,10,27,6,0,0), +d(2020,4,5,7,0,0), +d(2020,10,25,6,0,0), +d(2021,4,4,7,0,0), +d(2021,10,31,6,0,0), +d(2022,4,3,7,0,0), +d(2022,10,30,6,0,0), +d(2023,4,2,7,0,0), +d(2023,10,29,6,0,0), +d(2024,4,7,7,0,0), +d(2024,10,27,6,0,0), +d(2025,4,6,7,0,0), +d(2025,10,26,6,0,0), +d(2026,4,5,7,0,0), +d(2026,10,25,6,0,0), +d(2027,4,4,7,0,0), +d(2027,10,31,6,0,0), +d(2028,4,2,7,0,0), +d(2028,10,29,6,0,0), +d(2029,4,1,7,0,0), +d(2029,10,28,6,0,0), +d(2030,4,7,7,0,0), +d(2030,10,27,6,0,0), +d(2031,4,6,7,0,0), +d(2031,10,26,6,0,0), +d(2032,4,4,7,0,0), +d(2032,10,31,6,0,0), +d(2033,4,3,7,0,0), +d(2033,10,30,6,0,0), +d(2034,4,2,7,0,0), +d(2034,10,29,6,0,0), +d(2035,4,1,7,0,0), +d(2035,10,28,6,0,0), +d(2036,4,6,7,0,0), +d(2036,10,26,6,0,0), +d(2037,4,5,7,0,0), +d(2037,10,25,6,0,0), + ] + + _transition_info = [ +i(-18540,0,'LMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Nassau = Nassau() + diff --git a/vendor/pytz/zoneinfo/America/New_York.py b/vendor/pytz/zoneinfo/America/New_York.py new file mode 100644 index 00000000..9acebd98 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/New_York.py @@ -0,0 +1,490 @@ +'''tzinfo timezone information for America/New_York.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class New_York(DstTzInfo): + '''America/New_York timezone definition. See datetime.tzinfo for details''' + + zone = 'America/New_York' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,7,0,0), +d(1918,10,27,6,0,0), +d(1919,3,30,7,0,0), +d(1919,10,26,6,0,0), +d(1920,3,28,7,0,0), +d(1920,10,31,6,0,0), +d(1921,4,24,7,0,0), +d(1921,9,25,6,0,0), +d(1922,4,30,7,0,0), +d(1922,9,24,6,0,0), +d(1923,4,29,7,0,0), +d(1923,9,30,6,0,0), +d(1924,4,27,7,0,0), +d(1924,9,28,6,0,0), +d(1925,4,26,7,0,0), +d(1925,9,27,6,0,0), +d(1926,4,25,7,0,0), +d(1926,9,26,6,0,0), +d(1927,4,24,7,0,0), +d(1927,9,25,6,0,0), +d(1928,4,29,7,0,0), +d(1928,9,30,6,0,0), +d(1929,4,28,7,0,0), +d(1929,9,29,6,0,0), +d(1930,4,27,7,0,0), +d(1930,9,28,6,0,0), +d(1931,4,26,7,0,0), +d(1931,9,27,6,0,0), +d(1932,4,24,7,0,0), +d(1932,9,25,6,0,0), +d(1933,4,30,7,0,0), +d(1933,9,24,6,0,0), +d(1934,4,29,7,0,0), +d(1934,9,30,6,0,0), +d(1935,4,28,7,0,0), +d(1935,9,29,6,0,0), +d(1936,4,26,7,0,0), +d(1936,9,27,6,0,0), +d(1937,4,25,7,0,0), +d(1937,9,26,6,0,0), +d(1938,4,24,7,0,0), +d(1938,9,25,6,0,0), +d(1939,4,30,7,0,0), +d(1939,9,24,6,0,0), +d(1940,4,28,7,0,0), +d(1940,9,29,6,0,0), +d(1941,4,27,7,0,0), +d(1941,9,28,6,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,7,0,0), +d(1947,9,28,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1949,4,24,7,0,0), +d(1949,9,25,6,0,0), +d(1950,4,30,7,0,0), +d(1950,9,24,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,10,30,6,0,0), +d(1956,4,29,7,0,0), +d(1956,10,28,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +New_York = New_York() + diff --git a/vendor/pytz/zoneinfo/America/Nipigon.py b/vendor/pytz/zoneinfo/America/Nipigon.py new file mode 100644 index 00000000..29b1397c --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Nipigon.py @@ -0,0 +1,288 @@ +'''tzinfo timezone information for America/Nipigon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nipigon(DstTzInfo): + '''America/Nipigon timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Nipigon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,7,0,0), +d(1918,10,31,6,0,0), +d(1940,9,29,5,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Nipigon = Nipigon() + diff --git a/vendor/pytz/zoneinfo/America/Nome.py b/vendor/pytz/zoneinfo/America/Nome.py new file mode 100644 index 00000000..5889ab26 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Nome.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for America/Nome.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nome(DstTzInfo): + '''America/Nome timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Nome' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,13,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,12,0,0), +d(1967,4,1,11,0,0), +d(1969,4,27,13,0,0), +d(1969,10,26,12,0,0), +d(1970,4,26,13,0,0), +d(1970,10,25,12,0,0), +d(1971,4,25,13,0,0), +d(1971,10,31,12,0,0), +d(1972,4,30,13,0,0), +d(1972,10,29,12,0,0), +d(1973,4,29,13,0,0), +d(1973,10,28,12,0,0), +d(1974,1,6,13,0,0), +d(1974,10,27,12,0,0), +d(1975,2,23,13,0,0), +d(1975,10,26,12,0,0), +d(1976,4,25,13,0,0), +d(1976,10,31,12,0,0), +d(1977,4,24,13,0,0), +d(1977,10,30,12,0,0), +d(1978,4,30,13,0,0), +d(1978,10,29,12,0,0), +d(1979,4,29,13,0,0), +d(1979,10,28,12,0,0), +d(1980,4,27,13,0,0), +d(1980,10,26,12,0,0), +d(1981,4,26,13,0,0), +d(1981,10,25,12,0,0), +d(1982,4,25,13,0,0), +d(1982,10,31,12,0,0), +d(1983,4,24,13,0,0), +d(1983,10,30,12,0,0), +d(1983,11,30,9,0,0), +d(1984,4,29,11,0,0), +d(1984,10,28,10,0,0), +d(1985,4,28,11,0,0), +d(1985,10,27,10,0,0), +d(1986,4,27,11,0,0), +d(1986,10,26,10,0,0), +d(1987,4,5,11,0,0), +d(1987,10,25,10,0,0), +d(1988,4,3,11,0,0), +d(1988,10,30,10,0,0), +d(1989,4,2,11,0,0), +d(1989,10,29,10,0,0), +d(1990,4,1,11,0,0), +d(1990,10,28,10,0,0), +d(1991,4,7,11,0,0), +d(1991,10,27,10,0,0), +d(1992,4,5,11,0,0), +d(1992,10,25,10,0,0), +d(1993,4,4,11,0,0), +d(1993,10,31,10,0,0), +d(1994,4,3,11,0,0), +d(1994,10,30,10,0,0), +d(1995,4,2,11,0,0), +d(1995,10,29,10,0,0), +d(1996,4,7,11,0,0), +d(1996,10,27,10,0,0), +d(1997,4,6,11,0,0), +d(1997,10,26,10,0,0), +d(1998,4,5,11,0,0), +d(1998,10,25,10,0,0), +d(1999,4,4,11,0,0), +d(1999,10,31,10,0,0), +d(2000,4,2,11,0,0), +d(2000,10,29,10,0,0), +d(2001,4,1,11,0,0), +d(2001,10,28,10,0,0), +d(2002,4,7,11,0,0), +d(2002,10,27,10,0,0), +d(2003,4,6,11,0,0), +d(2003,10,26,10,0,0), +d(2004,4,4,11,0,0), +d(2004,10,31,10,0,0), +d(2005,4,3,11,0,0), +d(2005,10,30,10,0,0), +d(2006,4,2,11,0,0), +d(2006,10,29,10,0,0), +d(2007,3,11,11,0,0), +d(2007,11,4,10,0,0), +d(2008,3,9,11,0,0), +d(2008,11,2,10,0,0), +d(2009,3,8,11,0,0), +d(2009,11,1,10,0,0), +d(2010,3,14,11,0,0), +d(2010,11,7,10,0,0), +d(2011,3,13,11,0,0), +d(2011,11,6,10,0,0), +d(2012,3,11,11,0,0), +d(2012,11,4,10,0,0), +d(2013,3,10,11,0,0), +d(2013,11,3,10,0,0), +d(2014,3,9,11,0,0), +d(2014,11,2,10,0,0), +d(2015,3,8,11,0,0), +d(2015,11,1,10,0,0), +d(2016,3,13,11,0,0), +d(2016,11,6,10,0,0), +d(2017,3,12,11,0,0), +d(2017,11,5,10,0,0), +d(2018,3,11,11,0,0), +d(2018,11,4,10,0,0), +d(2019,3,10,11,0,0), +d(2019,11,3,10,0,0), +d(2020,3,8,11,0,0), +d(2020,11,1,10,0,0), +d(2021,3,14,11,0,0), +d(2021,11,7,10,0,0), +d(2022,3,13,11,0,0), +d(2022,11,6,10,0,0), +d(2023,3,12,11,0,0), +d(2023,11,5,10,0,0), +d(2024,3,10,11,0,0), +d(2024,11,3,10,0,0), +d(2025,3,9,11,0,0), +d(2025,11,2,10,0,0), +d(2026,3,8,11,0,0), +d(2026,11,1,10,0,0), +d(2027,3,14,11,0,0), +d(2027,11,7,10,0,0), +d(2028,3,12,11,0,0), +d(2028,11,5,10,0,0), +d(2029,3,11,11,0,0), +d(2029,11,4,10,0,0), +d(2030,3,10,11,0,0), +d(2030,11,3,10,0,0), +d(2031,3,9,11,0,0), +d(2031,11,2,10,0,0), +d(2032,3,14,11,0,0), +d(2032,11,7,10,0,0), +d(2033,3,13,11,0,0), +d(2033,11,6,10,0,0), +d(2034,3,12,11,0,0), +d(2034,11,5,10,0,0), +d(2035,3,11,11,0,0), +d(2035,11,4,10,0,0), +d(2036,3,9,11,0,0), +d(2036,11,2,10,0,0), +d(2037,3,8,11,0,0), +d(2037,11,1,10,0,0), + ] + + _transition_info = [ +i(-39600,0,'NST'), +i(-36000,3600,'NWT'), +i(-36000,3600,'NPT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-32400,0,'YST'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), + ] + +Nome = Nome() + diff --git a/vendor/pytz/zoneinfo/America/Noronha.py b/vendor/pytz/zoneinfo/America/Noronha.py new file mode 100644 index 00000000..915773c9 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Noronha.py @@ -0,0 +1,98 @@ +'''tzinfo timezone information for America/Noronha.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Noronha(DstTzInfo): + '''America/Noronha timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Noronha' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,9,40), +d(1931,10,3,13,0,0), +d(1932,4,1,1,0,0), +d(1932,10,3,2,0,0), +d(1933,4,1,1,0,0), +d(1949,12,1,2,0,0), +d(1950,4,16,2,0,0), +d(1950,12,1,2,0,0), +d(1951,4,1,1,0,0), +d(1951,12,1,2,0,0), +d(1952,4,1,1,0,0), +d(1952,12,1,2,0,0), +d(1953,3,1,1,0,0), +d(1963,12,9,2,0,0), +d(1964,3,1,1,0,0), +d(1965,1,31,2,0,0), +d(1965,3,31,1,0,0), +d(1965,12,1,2,0,0), +d(1966,3,1,1,0,0), +d(1966,11,1,2,0,0), +d(1967,3,1,1,0,0), +d(1967,11,1,2,0,0), +d(1968,3,1,1,0,0), +d(1985,11,2,2,0,0), +d(1986,3,15,1,0,0), +d(1986,10,25,2,0,0), +d(1987,2,14,1,0,0), +d(1987,10,25,2,0,0), +d(1988,2,7,1,0,0), +d(1988,10,16,2,0,0), +d(1989,1,29,1,0,0), +d(1989,10,15,2,0,0), +d(1990,2,11,1,0,0), +d(1999,10,3,2,0,0), +d(2000,2,27,1,0,0), +d(2000,10,8,2,0,0), +d(2000,10,15,1,0,0), +d(2001,10,14,2,0,0), +d(2002,2,17,1,0,0), + ] + + _transition_info = [ +i(-7800,0,'LMT'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), + ] + +Noronha = Noronha() + diff --git a/vendor/pytz/zoneinfo/America/North_Dakota/Center.py b/vendor/pytz/zoneinfo/America/North_Dakota/Center.py new file mode 100644 index 00000000..e9460b69 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/North_Dakota/Center.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for America/North_Dakota/Center.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Center(DstTzInfo): + '''America/North_Dakota/Center timezone definition. See datetime.tzinfo for details''' + + zone = 'America/North_Dakota/Center' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Center = Center() + diff --git a/vendor/pytz/zoneinfo/America/North_Dakota/New_Salem.py b/vendor/pytz/zoneinfo/America/North_Dakota/New_Salem.py new file mode 100644 index 00000000..126b5c67 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/North_Dakota/New_Salem.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for America/North_Dakota/New_Salem.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class New_Salem(DstTzInfo): + '''America/North_Dakota/New_Salem timezone definition. See datetime.tzinfo for details''' + + zone = 'America/North_Dakota/New_Salem' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +New_Salem = New_Salem() + diff --git a/vendor/tornado/test/__init__.py b/vendor/pytz/zoneinfo/America/North_Dakota/__init__.py similarity index 100% rename from vendor/tornado/test/__init__.py rename to vendor/pytz/zoneinfo/America/North_Dakota/__init__.py diff --git a/vendor/pytz/zoneinfo/America/Panama.py b/vendor/pytz/zoneinfo/America/Panama.py new file mode 100644 index 00000000..d0f9fa76 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Panama.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Panama.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Panama(DstTzInfo): + '''America/Panama timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Panama' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,4,22,5,19,36), + ] + + _transition_info = [ +i(-19200,0,'CMT'), +i(-18000,0,'EST'), + ] + +Panama = Panama() + diff --git a/vendor/pytz/zoneinfo/America/Pangnirtung.py b/vendor/pytz/zoneinfo/America/Pangnirtung.py new file mode 100644 index 00000000..79dfa10c --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Pangnirtung.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for America/Pangnirtung.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pangnirtung(DstTzInfo): + '''America/Pangnirtung timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Pangnirtung' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,6,0,0), +d(1918,10,27,5,0,0), +d(1919,5,25,6,0,0), +d(1919,11,1,3,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), +d(1965,4,25,4,0,0), +d(1965,10,31,4,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), +i(-7200,7200,'ADDT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-14400,0,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Pangnirtung = Pangnirtung() + diff --git a/vendor/pytz/zoneinfo/America/Paramaribo.py b/vendor/pytz/zoneinfo/America/Paramaribo.py new file mode 100644 index 00000000..5238f9d5 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Paramaribo.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for America/Paramaribo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Paramaribo(DstTzInfo): + '''America/Paramaribo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Paramaribo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,1,1,3,40,40), +d(1935,1,1,3,40,52), +d(1945,10,1,3,40,36), +d(1975,11,20,3,30,0), +d(1984,10,1,3,30,0), + ] + + _transition_info = [ +i(-13260,0,'LMT'), +i(-13260,0,'PMT'), +i(-13260,0,'PMT'), +i(-12600,0,'NEGT'), +i(-12600,0,'SRT'), +i(-10800,0,'SRT'), + ] + +Paramaribo = Paramaribo() + diff --git a/vendor/pytz/zoneinfo/America/Phoenix.py b/vendor/pytz/zoneinfo/America/Phoenix.py new file mode 100644 index 00000000..1cc351ee --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Phoenix.py @@ -0,0 +1,40 @@ +'''tzinfo timezone information for America/Phoenix.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Phoenix(DstTzInfo): + '''America/Phoenix timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Phoenix' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1942,2,9,9,0,0), +d(1944,1,1,6,1,0), +d(1944,4,1,7,1,0), +d(1944,10,1,6,1,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Phoenix = Phoenix() + diff --git a/vendor/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py b/vendor/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py new file mode 100644 index 00000000..248a9817 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Port_minus_au_minus_Prince.py @@ -0,0 +1,214 @@ +'''tzinfo timezone information for America/Port_minus_au_minus_Prince.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Port_minus_au_minus_Prince(DstTzInfo): + '''America/Port_minus_au_minus_Prince timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Port_minus_au_minus_Prince' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,1,24,16,49,0), +d(1983,5,8,5,0,0), +d(1983,10,30,4,0,0), +d(1984,4,29,5,0,0), +d(1984,10,28,4,0,0), +d(1985,4,28,5,0,0), +d(1985,10,27,4,0,0), +d(1986,4,27,5,0,0), +d(1986,10,26,4,0,0), +d(1987,4,26,5,0,0), +d(1987,10,25,4,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,6,0,0), +d(2005,4,3,5,0,0), +d(2005,10,30,4,0,0), +d(2006,4,2,5,0,0), +d(2006,10,29,4,0,0), +d(2007,4,1,5,0,0), +d(2007,10,28,4,0,0), +d(2008,4,6,5,0,0), +d(2008,10,26,4,0,0), +d(2009,4,5,5,0,0), +d(2009,10,25,4,0,0), +d(2010,4,4,5,0,0), +d(2010,10,31,4,0,0), +d(2011,4,3,5,0,0), +d(2011,10,30,4,0,0), +d(2012,4,1,5,0,0), +d(2012,10,28,4,0,0), +d(2013,4,7,5,0,0), +d(2013,10,27,4,0,0), +d(2014,4,6,5,0,0), +d(2014,10,26,4,0,0), +d(2015,4,5,5,0,0), +d(2015,10,25,4,0,0), +d(2016,4,3,5,0,0), +d(2016,10,30,4,0,0), +d(2017,4,2,5,0,0), +d(2017,10,29,4,0,0), +d(2018,4,1,5,0,0), +d(2018,10,28,4,0,0), +d(2019,4,7,5,0,0), +d(2019,10,27,4,0,0), +d(2020,4,5,5,0,0), +d(2020,10,25,4,0,0), +d(2021,4,4,5,0,0), +d(2021,10,31,4,0,0), +d(2022,4,3,5,0,0), +d(2022,10,30,4,0,0), +d(2023,4,2,5,0,0), +d(2023,10,29,4,0,0), +d(2024,4,7,5,0,0), +d(2024,10,27,4,0,0), +d(2025,4,6,5,0,0), +d(2025,10,26,4,0,0), +d(2026,4,5,5,0,0), +d(2026,10,25,4,0,0), +d(2027,4,4,5,0,0), +d(2027,10,31,4,0,0), +d(2028,4,2,5,0,0), +d(2028,10,29,4,0,0), +d(2029,4,1,5,0,0), +d(2029,10,28,4,0,0), +d(2030,4,7,5,0,0), +d(2030,10,27,4,0,0), +d(2031,4,6,5,0,0), +d(2031,10,26,4,0,0), +d(2032,4,4,5,0,0), +d(2032,10,31,4,0,0), +d(2033,4,3,5,0,0), +d(2033,10,30,4,0,0), +d(2034,4,2,5,0,0), +d(2034,10,29,4,0,0), +d(2035,4,1,5,0,0), +d(2035,10,28,4,0,0), +d(2036,4,6,5,0,0), +d(2036,10,26,4,0,0), +d(2037,4,5,5,0,0), +d(2037,10,25,4,0,0), + ] + + _transition_info = [ +i(-17340,0,'PPMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Port_minus_au_minus_Prince = Port_minus_au_minus_Prince() + diff --git a/vendor/pytz/zoneinfo/America/Port_of_Spain.py b/vendor/pytz/zoneinfo/America/Port_of_Spain.py new file mode 100644 index 00000000..f1a37eb6 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Port_of_Spain.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Port_of_Spain.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Port_of_Spain(DstTzInfo): + '''America/Port_of_Spain timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Port_of_Spain' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,2,4,6,4), + ] + + _transition_info = [ +i(-14760,0,'LMT'), +i(-14400,0,'AST'), + ] + +Port_of_Spain = Port_of_Spain() + diff --git a/vendor/pytz/zoneinfo/America/Porto_Acre.py b/vendor/pytz/zoneinfo/America/Porto_Acre.py new file mode 100644 index 00000000..34dce668 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Porto_Acre.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for America/Porto_Acre.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Porto_Acre(DstTzInfo): + '''America/Porto_Acre timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Porto_Acre' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,31,12), +d(1931,10,3,16,0,0), +d(1932,4,1,4,0,0), +d(1932,10,3,5,0,0), +d(1933,4,1,4,0,0), +d(1949,12,1,5,0,0), +d(1950,4,16,5,0,0), +d(1950,12,1,5,0,0), +d(1951,4,1,4,0,0), +d(1951,12,1,5,0,0), +d(1952,4,1,4,0,0), +d(1952,12,1,5,0,0), +d(1953,3,1,4,0,0), +d(1963,12,9,5,0,0), +d(1964,3,1,4,0,0), +d(1965,1,31,5,0,0), +d(1965,3,31,4,0,0), +d(1965,12,1,5,0,0), +d(1966,3,1,4,0,0), +d(1966,11,1,5,0,0), +d(1967,3,1,4,0,0), +d(1967,11,1,5,0,0), +d(1968,3,1,4,0,0), +d(1985,11,2,5,0,0), +d(1986,3,15,4,0,0), +d(1986,10,25,5,0,0), +d(1987,2,14,4,0,0), +d(1987,10,25,5,0,0), +d(1988,2,7,4,0,0), + ] + + _transition_info = [ +i(-16260,0,'LMT'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), + ] + +Porto_Acre = Porto_Acre() + diff --git a/vendor/pytz/zoneinfo/America/Porto_Velho.py b/vendor/pytz/zoneinfo/America/Porto_Velho.py new file mode 100644 index 00000000..85620897 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Porto_Velho.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for America/Porto_Velho.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Porto_Velho(DstTzInfo): + '''America/Porto_Velho timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Porto_Velho' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,15,36), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), + ] + + _transition_info = [ +i(-15360,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), + ] + +Porto_Velho = Porto_Velho() + diff --git a/vendor/pytz/zoneinfo/America/Puerto_Rico.py b/vendor/pytz/zoneinfo/America/Puerto_Rico.py new file mode 100644 index 00000000..ea00f20b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Puerto_Rico.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for America/Puerto_Rico.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Puerto_Rico(DstTzInfo): + '''America/Puerto_Rico timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Puerto_Rico' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,5,3,4,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), + ] + + _transition_info = [ +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), + ] + +Puerto_Rico = Puerto_Rico() + diff --git a/vendor/pytz/zoneinfo/America/Rainy_River.py b/vendor/pytz/zoneinfo/America/Rainy_River.py new file mode 100644 index 00000000..9863d587 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Rainy_River.py @@ -0,0 +1,288 @@ +'''tzinfo timezone information for America/Rainy_River.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rainy_River(DstTzInfo): + '''America/Rainy_River timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Rainy_River' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,8,0,0), +d(1918,10,31,7,0,0), +d(1940,9,29,6,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1974,4,28,8,0,0), +d(1974,10,27,7,0,0), +d(1975,4,27,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Rainy_River = Rainy_River() + diff --git a/vendor/pytz/zoneinfo/America/Rankin_Inlet.py b/vendor/pytz/zoneinfo/America/Rankin_Inlet.py new file mode 100644 index 00000000..033c8bb3 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Rankin_Inlet.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for America/Rankin_Inlet.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rankin_Inlet(DstTzInfo): + '''America/Rankin_Inlet timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Rankin_Inlet' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,8,0,0), +d(1918,10,27,7,0,0), +d(1919,5,25,8,0,0), +d(1919,11,1,5,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1965,4,25,6,0,0), +d(1965,10,31,6,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-14400,7200,'CDDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Rankin_Inlet = Rankin_Inlet() + diff --git a/vendor/pytz/zoneinfo/America/Recife.py b/vendor/pytz/zoneinfo/America/Recife.py new file mode 100644 index 00000000..a30a40df --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Recife.py @@ -0,0 +1,98 @@ +'''tzinfo timezone information for America/Recife.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Recife(DstTzInfo): + '''America/Recife timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Recife' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,19,36), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,12,9,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2000,10,15,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), + ] + + _transition_info = [ +i(-8400,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), + ] + +Recife = Recife() + diff --git a/vendor/pytz/zoneinfo/America/Regina.py b/vendor/pytz/zoneinfo/America/Regina.py new file mode 100644 index 00000000..08b11abf --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Regina.py @@ -0,0 +1,126 @@ +'''tzinfo timezone information for America/Regina.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Regina(DstTzInfo): + '''America/Regina timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Regina' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,9,1,6,58,36), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1930,5,4,7,0,0), +d(1930,10,5,6,0,0), +d(1931,5,3,7,0,0), +d(1931,10,4,6,0,0), +d(1932,5,1,7,0,0), +d(1932,10,2,6,0,0), +d(1933,5,7,7,0,0), +d(1933,10,1,6,0,0), +d(1934,5,6,7,0,0), +d(1934,10,7,6,0,0), +d(1937,4,11,7,0,0), +d(1937,10,10,6,0,0), +d(1938,4,10,7,0,0), +d(1938,10,2,6,0,0), +d(1939,4,9,7,0,0), +d(1939,10,8,6,0,0), +d(1940,4,14,7,0,0), +d(1940,10,13,6,0,0), +d(1941,4,13,7,0,0), +d(1941,10,12,6,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1946,4,14,9,0,0), +d(1946,10,13,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1948,4,25,9,0,0), +d(1948,9,26,8,0,0), +d(1949,4,24,9,0,0), +d(1949,9,25,8,0,0), +d(1950,4,30,9,0,0), +d(1950,9,24,8,0,0), +d(1951,4,29,9,0,0), +d(1951,9,30,8,0,0), +d(1952,4,27,9,0,0), +d(1952,9,28,8,0,0), +d(1953,4,26,9,0,0), +d(1953,9,27,8,0,0), +d(1954,4,25,9,0,0), +d(1954,9,26,8,0,0), +d(1955,4,24,9,0,0), +d(1955,9,25,8,0,0), +d(1956,4,29,9,0,0), +d(1956,9,30,8,0,0), +d(1957,4,28,9,0,0), +d(1957,9,29,8,0,0), +d(1959,4,26,9,0,0), +d(1959,10,25,8,0,0), +d(1960,4,24,9,0,0), + ] + + _transition_info = [ +i(-25140,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), + ] + +Regina = Regina() + diff --git a/vendor/pytz/zoneinfo/America/Rio_Branco.py b/vendor/pytz/zoneinfo/America/Rio_Branco.py new file mode 100644 index 00000000..14b71ddb --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Rio_Branco.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for America/Rio_Branco.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rio_Branco(DstTzInfo): + '''America/Rio_Branco timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Rio_Branco' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,31,12), +d(1931,10,3,16,0,0), +d(1932,4,1,4,0,0), +d(1932,10,3,5,0,0), +d(1933,4,1,4,0,0), +d(1949,12,1,5,0,0), +d(1950,4,16,5,0,0), +d(1950,12,1,5,0,0), +d(1951,4,1,4,0,0), +d(1951,12,1,5,0,0), +d(1952,4,1,4,0,0), +d(1952,12,1,5,0,0), +d(1953,3,1,4,0,0), +d(1963,12,9,5,0,0), +d(1964,3,1,4,0,0), +d(1965,1,31,5,0,0), +d(1965,3,31,4,0,0), +d(1965,12,1,5,0,0), +d(1966,3,1,4,0,0), +d(1966,11,1,5,0,0), +d(1967,3,1,4,0,0), +d(1967,11,1,5,0,0), +d(1968,3,1,4,0,0), +d(1985,11,2,5,0,0), +d(1986,3,15,4,0,0), +d(1986,10,25,5,0,0), +d(1987,2,14,4,0,0), +d(1987,10,25,5,0,0), +d(1988,2,7,4,0,0), + ] + + _transition_info = [ +i(-16260,0,'LMT'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), + ] + +Rio_Branco = Rio_Branco() + diff --git a/vendor/pytz/zoneinfo/America/Rosario.py b/vendor/pytz/zoneinfo/America/Rosario.py new file mode 100644 index 00000000..a0aaa92d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Rosario.py @@ -0,0 +1,132 @@ +'''tzinfo timezone information for America/Rosario.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rosario(DstTzInfo): + '''America/Rosario timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Rosario' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,5,1,4,16,48), +d(1930,12,1,4,0,0), +d(1931,4,1,3,0,0), +d(1931,10,15,4,0,0), +d(1932,3,1,3,0,0), +d(1932,11,1,4,0,0), +d(1933,3,1,3,0,0), +d(1933,11,1,4,0,0), +d(1934,3,1,3,0,0), +d(1934,11,1,4,0,0), +d(1935,3,1,3,0,0), +d(1935,11,1,4,0,0), +d(1936,3,1,3,0,0), +d(1936,11,1,4,0,0), +d(1937,3,1,3,0,0), +d(1937,11,1,4,0,0), +d(1938,3,1,3,0,0), +d(1938,11,1,4,0,0), +d(1939,3,1,3,0,0), +d(1939,11,1,4,0,0), +d(1940,3,1,3,0,0), +d(1940,7,1,4,0,0), +d(1941,6,15,3,0,0), +d(1941,10,15,4,0,0), +d(1943,8,1,3,0,0), +d(1943,10,15,4,0,0), +d(1946,3,1,3,0,0), +d(1946,10,1,4,0,0), +d(1963,10,1,3,0,0), +d(1963,12,15,4,0,0), +d(1964,3,1,3,0,0), +d(1964,10,15,4,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1988,12,1,3,0,0), +d(1989,3,5,2,0,0), +d(1989,10,15,3,0,0), +d(1990,3,4,2,0,0), +d(1990,10,21,3,0,0), +d(1991,3,3,2,0,0), +d(1991,10,20,4,0,0), +d(1992,3,1,2,0,0), +d(1992,10,18,3,0,0), +d(1993,3,7,2,0,0), +d(1999,10,3,3,0,0), +d(2000,3,3,3,0,0), + ] + + _transition_info = [ +i(-15420,0,'CMT'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-14400,0,'WART'), +i(-7200,7200,'ARST'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-10800,0,'ARST'), +i(-10800,0,'ART'), + ] + +Rosario = Rosario() + diff --git a/vendor/pytz/zoneinfo/America/Santiago.py b/vendor/pytz/zoneinfo/America/Santiago.py new file mode 100644 index 00000000..120190d5 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Santiago.py @@ -0,0 +1,336 @@ +'''tzinfo timezone information for America/Santiago.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Santiago(DstTzInfo): + '''America/Santiago timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Santiago' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,1,1,4,42,46), +d(1916,7,1,5,0,0), +d(1918,9,1,4,42,46), +d(1919,7,1,4,0,0), +d(1927,9,1,4,42,46), +d(1928,4,1,4,0,0), +d(1928,9,1,5,0,0), +d(1929,4,1,4,0,0), +d(1929,9,1,5,0,0), +d(1930,4,1,4,0,0), +d(1930,9,1,5,0,0), +d(1931,4,1,4,0,0), +d(1931,9,1,5,0,0), +d(1932,4,1,4,0,0), +d(1932,9,1,5,0,0), +d(1942,6,1,4,0,0), +d(1942,8,1,5,0,0), +d(1946,9,1,3,0,0), +d(1947,5,22,5,0,0), +d(1968,11,3,4,0,0), +d(1969,3,30,3,0,0), +d(1969,11,23,4,0,0), +d(1970,3,29,3,0,0), +d(1970,10,11,4,0,0), +d(1971,3,14,3,0,0), +d(1971,10,10,4,0,0), +d(1972,3,12,3,0,0), +d(1972,10,15,4,0,0), +d(1973,3,11,3,0,0), +d(1973,9,30,4,0,0), +d(1974,3,10,3,0,0), +d(1974,10,13,4,0,0), +d(1975,3,9,3,0,0), +d(1975,10,12,4,0,0), +d(1976,3,14,3,0,0), +d(1976,10,10,4,0,0), +d(1977,3,13,3,0,0), +d(1977,10,9,4,0,0), +d(1978,3,12,3,0,0), +d(1978,10,15,4,0,0), +d(1979,3,11,3,0,0), +d(1979,10,14,4,0,0), +d(1980,3,9,3,0,0), +d(1980,10,12,4,0,0), +d(1981,3,15,3,0,0), +d(1981,10,11,4,0,0), +d(1982,3,14,3,0,0), +d(1982,10,10,4,0,0), +d(1983,3,13,3,0,0), +d(1983,10,9,4,0,0), +d(1984,3,11,3,0,0), +d(1984,10,14,4,0,0), +d(1985,3,10,3,0,0), +d(1985,10,13,4,0,0), +d(1986,3,9,3,0,0), +d(1986,10,12,4,0,0), +d(1987,4,12,3,0,0), +d(1987,10,11,4,0,0), +d(1988,3,13,3,0,0), +d(1988,10,2,4,0,0), +d(1989,3,12,3,0,0), +d(1989,10,15,4,0,0), +d(1990,3,18,3,0,0), +d(1990,9,16,4,0,0), +d(1991,3,10,3,0,0), +d(1991,10,13,4,0,0), +d(1992,3,15,3,0,0), +d(1992,10,11,4,0,0), +d(1993,3,14,3,0,0), +d(1993,10,10,4,0,0), +d(1994,3,13,3,0,0), +d(1994,10,9,4,0,0), +d(1995,3,12,3,0,0), +d(1995,10,15,4,0,0), +d(1996,3,10,3,0,0), +d(1996,10,13,4,0,0), +d(1997,3,30,3,0,0), +d(1997,10,12,4,0,0), +d(1998,3,15,3,0,0), +d(1998,9,27,4,0,0), +d(1999,4,4,3,0,0), +d(1999,10,10,4,0,0), +d(2000,3,12,3,0,0), +d(2000,10,15,4,0,0), +d(2001,3,11,3,0,0), +d(2001,10,14,4,0,0), +d(2002,3,10,3,0,0), +d(2002,10,13,4,0,0), +d(2003,3,9,3,0,0), +d(2003,10,12,4,0,0), +d(2004,3,14,3,0,0), +d(2004,10,10,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,9,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,14,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,12,4,0,0), +d(2009,3,15,3,0,0), +d(2009,10,11,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,10,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,9,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,14,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,13,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,12,4,0,0), +d(2015,3,15,3,0,0), +d(2015,10,11,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,9,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,14,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,13,4,0,0), +d(2020,3,15,3,0,0), +d(2020,10,11,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,10,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,9,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,13,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,12,4,0,0), +d(2026,3,15,3,0,0), +d(2026,10,11,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,10,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,14,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,13,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,12,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,10,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,9,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,14,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,12,4,0,0), +d(2037,3,15,3,0,0), +d(2037,10,11,4,0,0), + ] + + _transition_info = [ +i(-16980,0,'SMT'), +i(-18000,0,'CLT'), +i(-16980,0,'SMT'), +i(-14400,0,'CLT'), +i(-16980,0,'SMT'), +i(-14400,2580,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), + ] + +Santiago = Santiago() + diff --git a/vendor/pytz/zoneinfo/America/Santo_Domingo.py b/vendor/pytz/zoneinfo/America/Santo_Domingo.py new file mode 100644 index 00000000..63963732 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Santo_Domingo.py @@ -0,0 +1,52 @@ +'''tzinfo timezone information for America/Santo_Domingo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Santo_Domingo(DstTzInfo): + '''America/Santo_Domingo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Santo_Domingo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1933,4,1,16,40,0), +d(1966,10,30,5,0,0), +d(1967,2,28,4,0,0), +d(1969,10,26,5,0,0), +d(1970,2,21,4,30,0), +d(1970,10,25,5,0,0), +d(1971,1,20,4,30,0), +d(1971,10,31,5,0,0), +d(1972,1,21,4,30,0), +d(1972,10,29,5,0,0), +d(1973,1,21,4,30,0), +d(1973,10,28,5,0,0), +d(1974,1,21,4,30,0), +d(1974,10,27,5,0,0), +d(2000,10,29,6,0,0), +d(2000,12,3,6,0,0), + ] + + _transition_info = [ +i(-16800,0,'SDMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-16200,1800,'EHDT'), +i(-18000,0,'EST'), +i(-16200,1800,'EHDT'), +i(-18000,0,'EST'), +i(-16200,1800,'EHDT'), +i(-18000,0,'EST'), +i(-16200,1800,'EHDT'), +i(-18000,0,'EST'), +i(-16200,1800,'EHDT'), +i(-18000,0,'EST'), +i(-14400,0,'AST'), +i(-18000,0,'EST'), +i(-14400,0,'AST'), + ] + +Santo_Domingo = Santo_Domingo() + diff --git a/vendor/pytz/zoneinfo/America/Sao_Paulo.py b/vendor/pytz/zoneinfo/America/Sao_Paulo.py new file mode 100644 index 00000000..d1e8c192 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Sao_Paulo.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for America/Sao_Paulo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sao_Paulo(DstTzInfo): + '''America/Sao_Paulo timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Sao_Paulo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,6,28), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,10,23,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1990,10,21,3,0,0), +d(1991,2,17,2,0,0), +d(1991,10,20,3,0,0), +d(1992,2,9,2,0,0), +d(1992,10,25,3,0,0), +d(1993,1,31,2,0,0), +d(1993,10,17,3,0,0), +d(1994,2,20,2,0,0), +d(1994,10,16,3,0,0), +d(1995,2,19,2,0,0), +d(1995,10,15,3,0,0), +d(1996,2,11,2,0,0), +d(1996,10,6,3,0,0), +d(1997,2,16,2,0,0), +d(1997,10,6,3,0,0), +d(1998,3,1,2,0,0), +d(1998,10,11,3,0,0), +d(1999,2,21,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2001,2,18,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), +d(2002,11,3,3,0,0), +d(2003,2,16,2,0,0), +d(2003,10,19,3,0,0), +d(2004,2,15,2,0,0), +d(2004,11,2,3,0,0), +d(2005,2,20,2,0,0), +d(2005,10,16,3,0,0), +d(2006,2,19,2,0,0), +d(2006,11,5,3,0,0), +d(2007,2,25,2,0,0), +d(2007,11,4,3,0,0), +d(2008,2,24,2,0,0), +d(2008,11,2,3,0,0), +d(2009,2,22,2,0,0), +d(2009,11,1,3,0,0), +d(2010,2,28,2,0,0), +d(2010,11,7,3,0,0), +d(2011,2,27,2,0,0), +d(2011,11,6,3,0,0), +d(2012,2,26,2,0,0), +d(2012,11,4,3,0,0), +d(2013,2,24,2,0,0), +d(2013,11,3,3,0,0), +d(2014,2,23,2,0,0), +d(2014,11,2,3,0,0), +d(2015,2,22,2,0,0), +d(2015,11,1,3,0,0), +d(2016,2,28,2,0,0), +d(2016,11,6,3,0,0), +d(2017,2,26,2,0,0), +d(2017,11,5,3,0,0), +d(2018,2,25,2,0,0), +d(2018,11,4,3,0,0), +d(2019,2,24,2,0,0), +d(2019,11,3,3,0,0), +d(2020,2,23,2,0,0), +d(2020,11,1,3,0,0), +d(2021,2,28,2,0,0), +d(2021,11,7,3,0,0), +d(2022,2,27,2,0,0), +d(2022,11,6,3,0,0), +d(2023,2,26,2,0,0), +d(2023,11,5,3,0,0), +d(2024,2,25,2,0,0), +d(2024,11,3,3,0,0), +d(2025,2,23,2,0,0), +d(2025,11,2,3,0,0), +d(2026,2,22,2,0,0), +d(2026,11,1,3,0,0), +d(2027,2,28,2,0,0), +d(2027,11,7,3,0,0), +d(2028,2,27,2,0,0), +d(2028,11,5,3,0,0), +d(2029,2,25,2,0,0), +d(2029,11,4,3,0,0), +d(2030,2,24,2,0,0), +d(2030,11,3,3,0,0), +d(2031,2,23,2,0,0), +d(2031,11,2,3,0,0), +d(2032,2,29,2,0,0), +d(2032,11,7,3,0,0), +d(2033,2,27,2,0,0), +d(2033,11,6,3,0,0), +d(2034,2,26,2,0,0), +d(2034,11,5,3,0,0), +d(2035,2,25,2,0,0), +d(2035,11,4,3,0,0), +d(2036,2,24,2,0,0), +d(2036,11,2,3,0,0), +d(2037,2,22,2,0,0), +d(2037,11,1,3,0,0), + ] + + _transition_info = [ +i(-11160,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), + ] + +Sao_Paulo = Sao_Paulo() + diff --git a/vendor/pytz/zoneinfo/America/Scoresbysund.py b/vendor/pytz/zoneinfo/America/Scoresbysund.py new file mode 100644 index 00000000..4beb56c3 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Scoresbysund.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for America/Scoresbysund.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Scoresbysund(DstTzInfo): + '''America/Scoresbysund timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Scoresbysund' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,28,1,27,52), +d(1980,4,6,4,0,0), +d(1980,9,28,4,0,0), +d(1981,3,29,2,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-5280,0,'LMT'), +i(-7200,0,'CGT'), +i(-3600,3600,'CGST'), +i(-7200,0,'CGT'), +i(0,7200,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), +i(0,3600,'EGST'), +i(-3600,0,'EGT'), + ] + +Scoresbysund = Scoresbysund() + diff --git a/vendor/pytz/zoneinfo/America/Shiprock.py b/vendor/pytz/zoneinfo/America/Shiprock.py new file mode 100644 index 00000000..2a3e4d09 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Shiprock.py @@ -0,0 +1,334 @@ +'''tzinfo timezone information for America/Shiprock.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Shiprock(DstTzInfo): + '''America/Shiprock timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Shiprock' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1920,3,28,9,0,0), +d(1920,10,31,8,0,0), +d(1921,3,27,9,0,0), +d(1921,5,22,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,8,0,0), +d(1966,4,24,9,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Shiprock = Shiprock() + diff --git a/vendor/pytz/zoneinfo/America/St_Johns.py b/vendor/pytz/zoneinfo/America/St_Johns.py new file mode 100644 index 00000000..48fd33dd --- /dev/null +++ b/vendor/pytz/zoneinfo/America/St_Johns.py @@ -0,0 +1,496 @@ +'''tzinfo timezone information for America/St_Johns.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Johns(DstTzInfo): + '''America/St_Johns timezone definition. See datetime.tzinfo for details''' + + zone = 'America/St_Johns' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,4,8,5,30,52), +d(1917,9,17,4,30,52), +d(1918,4,14,5,30,52), +d(1918,10,31,4,30,52), +d(1919,5,6,2,30,52), +d(1919,8,13,1,30,52), +d(1920,5,3,2,30,52), +d(1920,11,1,1,30,52), +d(1921,5,2,2,30,52), +d(1921,10,31,1,30,52), +d(1922,5,8,2,30,52), +d(1922,10,30,1,30,52), +d(1923,5,7,2,30,52), +d(1923,10,29,1,30,52), +d(1924,5,5,2,30,52), +d(1924,10,27,1,30,52), +d(1925,5,4,2,30,52), +d(1925,10,26,1,30,52), +d(1926,5,3,2,30,52), +d(1926,11,1,1,30,52), +d(1927,5,2,2,30,52), +d(1927,10,31,1,30,52), +d(1928,5,7,2,30,52), +d(1928,10,29,1,30,52), +d(1929,5,6,2,30,52), +d(1929,10,28,1,30,52), +d(1930,5,5,2,30,52), +d(1930,10,27,1,30,52), +d(1931,5,4,2,30,52), +d(1931,10,26,1,30,52), +d(1932,5,2,2,30,52), +d(1932,10,31,1,30,52), +d(1933,5,8,2,30,52), +d(1933,10,30,1,30,52), +d(1934,5,7,2,30,52), +d(1934,10,29,1,30,52), +d(1935,3,30,3,30,52), +d(1935,5,6,2,30,0), +d(1935,10,28,1,30,0), +d(1936,5,11,3,30,0), +d(1936,10,5,2,30,0), +d(1937,5,10,3,30,0), +d(1937,10,4,2,30,0), +d(1938,5,9,3,30,0), +d(1938,10,3,2,30,0), +d(1939,5,15,3,30,0), +d(1939,10,2,2,30,0), +d(1940,5,13,3,30,0), +d(1940,10,7,2,30,0), +d(1941,5,12,3,30,0), +d(1941,10,6,2,30,0), +d(1942,5,11,3,30,0), +d(1945,8,14,23,0,0), +d(1945,9,30,4,30,0), +d(1946,5,12,5,30,0), +d(1946,10,6,4,30,0), +d(1947,5,11,5,30,0), +d(1947,10,5,4,30,0), +d(1948,5,9,5,30,0), +d(1948,10,3,4,30,0), +d(1949,5,8,5,30,0), +d(1949,10,2,4,30,0), +d(1950,5,14,5,30,0), +d(1950,10,8,4,30,0), +d(1951,4,29,5,30,0), +d(1951,9,30,4,30,0), +d(1952,4,27,5,30,0), +d(1952,9,28,4,30,0), +d(1953,4,26,5,30,0), +d(1953,9,27,4,30,0), +d(1954,4,25,5,30,0), +d(1954,9,26,4,30,0), +d(1955,4,24,5,30,0), +d(1955,9,25,4,30,0), +d(1956,4,29,5,30,0), +d(1956,9,30,4,30,0), +d(1957,4,28,5,30,0), +d(1957,9,29,4,30,0), +d(1958,4,27,5,30,0), +d(1958,9,28,4,30,0), +d(1959,4,26,5,30,0), +d(1959,9,27,4,30,0), +d(1960,4,24,5,30,0), +d(1960,10,30,4,30,0), +d(1961,4,30,5,30,0), +d(1961,10,29,4,30,0), +d(1962,4,29,5,30,0), +d(1962,10,28,4,30,0), +d(1963,4,28,5,30,0), +d(1963,10,27,4,30,0), +d(1964,4,26,5,30,0), +d(1964,10,25,4,30,0), +d(1965,4,25,5,30,0), +d(1965,10,31,4,30,0), +d(1966,4,24,5,30,0), +d(1966,10,30,4,30,0), +d(1967,4,30,5,30,0), +d(1967,10,29,4,30,0), +d(1968,4,28,5,30,0), +d(1968,10,27,4,30,0), +d(1969,4,27,5,30,0), +d(1969,10,26,4,30,0), +d(1970,4,26,5,30,0), +d(1970,10,25,4,30,0), +d(1971,4,25,5,30,0), +d(1971,10,31,4,30,0), +d(1972,4,30,5,30,0), +d(1972,10,29,4,30,0), +d(1973,4,29,5,30,0), +d(1973,10,28,4,30,0), +d(1974,4,28,5,30,0), +d(1974,10,27,4,30,0), +d(1975,4,27,5,30,0), +d(1975,10,26,4,30,0), +d(1976,4,25,5,30,0), +d(1976,10,31,4,30,0), +d(1977,4,24,5,30,0), +d(1977,10,30,4,30,0), +d(1978,4,30,5,30,0), +d(1978,10,29,4,30,0), +d(1979,4,29,5,30,0), +d(1979,10,28,4,30,0), +d(1980,4,27,5,30,0), +d(1980,10,26,4,30,0), +d(1981,4,26,5,30,0), +d(1981,10,25,4,30,0), +d(1982,4,25,5,30,0), +d(1982,10,31,4,30,0), +d(1983,4,24,5,30,0), +d(1983,10,30,4,30,0), +d(1984,4,29,5,30,0), +d(1984,10,28,4,30,0), +d(1985,4,28,5,30,0), +d(1985,10,27,4,30,0), +d(1986,4,27,5,30,0), +d(1986,10,26,4,30,0), +d(1987,4,5,3,31,0), +d(1987,10,25,2,31,0), +d(1988,4,3,3,31,0), +d(1988,10,30,1,31,0), +d(1989,4,2,3,31,0), +d(1989,10,29,2,31,0), +d(1990,4,1,3,31,0), +d(1990,10,28,2,31,0), +d(1991,4,7,3,31,0), +d(1991,10,27,2,31,0), +d(1992,4,5,3,31,0), +d(1992,10,25,2,31,0), +d(1993,4,4,3,31,0), +d(1993,10,31,2,31,0), +d(1994,4,3,3,31,0), +d(1994,10,30,2,31,0), +d(1995,4,2,3,31,0), +d(1995,10,29,2,31,0), +d(1996,4,7,3,31,0), +d(1996,10,27,2,31,0), +d(1997,4,6,3,31,0), +d(1997,10,26,2,31,0), +d(1998,4,5,3,31,0), +d(1998,10,25,2,31,0), +d(1999,4,4,3,31,0), +d(1999,10,31,2,31,0), +d(2000,4,2,3,31,0), +d(2000,10,29,2,31,0), +d(2001,4,1,3,31,0), +d(2001,10,28,2,31,0), +d(2002,4,7,3,31,0), +d(2002,10,27,2,31,0), +d(2003,4,6,3,31,0), +d(2003,10,26,2,31,0), +d(2004,4,4,3,31,0), +d(2004,10,31,2,31,0), +d(2005,4,3,3,31,0), +d(2005,10,30,2,31,0), +d(2006,4,2,3,31,0), +d(2006,10,29,2,31,0), +d(2007,3,11,3,31,0), +d(2007,11,4,2,31,0), +d(2008,3,9,3,31,0), +d(2008,11,2,2,31,0), +d(2009,3,8,3,31,0), +d(2009,11,1,2,31,0), +d(2010,3,14,3,31,0), +d(2010,11,7,2,31,0), +d(2011,3,13,3,31,0), +d(2011,11,6,2,31,0), +d(2012,3,11,3,31,0), +d(2012,11,4,2,31,0), +d(2013,3,10,3,31,0), +d(2013,11,3,2,31,0), +d(2014,3,9,3,31,0), +d(2014,11,2,2,31,0), +d(2015,3,8,3,31,0), +d(2015,11,1,2,31,0), +d(2016,3,13,3,31,0), +d(2016,11,6,2,31,0), +d(2017,3,12,3,31,0), +d(2017,11,5,2,31,0), +d(2018,3,11,3,31,0), +d(2018,11,4,2,31,0), +d(2019,3,10,3,31,0), +d(2019,11,3,2,31,0), +d(2020,3,8,3,31,0), +d(2020,11,1,2,31,0), +d(2021,3,14,3,31,0), +d(2021,11,7,2,31,0), +d(2022,3,13,3,31,0), +d(2022,11,6,2,31,0), +d(2023,3,12,3,31,0), +d(2023,11,5,2,31,0), +d(2024,3,10,3,31,0), +d(2024,11,3,2,31,0), +d(2025,3,9,3,31,0), +d(2025,11,2,2,31,0), +d(2026,3,8,3,31,0), +d(2026,11,1,2,31,0), +d(2027,3,14,3,31,0), +d(2027,11,7,2,31,0), +d(2028,3,12,3,31,0), +d(2028,11,5,2,31,0), +d(2029,3,11,3,31,0), +d(2029,11,4,2,31,0), +d(2030,3,10,3,31,0), +d(2030,11,3,2,31,0), +d(2031,3,9,3,31,0), +d(2031,11,2,2,31,0), +d(2032,3,14,3,31,0), +d(2032,11,7,2,31,0), +d(2033,3,13,3,31,0), +d(2033,11,6,2,31,0), +d(2034,3,12,3,31,0), +d(2034,11,5,2,31,0), +d(2035,3,11,3,31,0), +d(2035,11,4,2,31,0), +d(2036,3,9,3,31,0), +d(2036,11,2,2,31,0), +d(2037,3,8,3,31,0), +d(2037,11,1,2,31,0), + ] + + _transition_info = [ +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NWT'), +i(-9000,3600,'NPT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-5400,7200,'NDDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), + ] + +St_Johns = St_Johns() + diff --git a/vendor/pytz/zoneinfo/America/St_Kitts.py b/vendor/pytz/zoneinfo/America/St_Kitts.py new file mode 100644 index 00000000..6092919d --- /dev/null +++ b/vendor/pytz/zoneinfo/America/St_Kitts.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/St_Kitts.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Kitts(DstTzInfo): + '''America/St_Kitts timezone definition. See datetime.tzinfo for details''' + + zone = 'America/St_Kitts' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,2,4,10,52), + ] + + _transition_info = [ +i(-15060,0,'LMT'), +i(-14400,0,'AST'), + ] + +St_Kitts = St_Kitts() + diff --git a/vendor/pytz/zoneinfo/America/St_Lucia.py b/vendor/pytz/zoneinfo/America/St_Lucia.py new file mode 100644 index 00000000..ae785136 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/St_Lucia.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/St_Lucia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Lucia(DstTzInfo): + '''America/St_Lucia timezone definition. See datetime.tzinfo for details''' + + zone = 'America/St_Lucia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,4,4,0), + ] + + _transition_info = [ +i(-14640,0,'CMT'), +i(-14400,0,'AST'), + ] + +St_Lucia = St_Lucia() + diff --git a/vendor/pytz/zoneinfo/America/St_Thomas.py b/vendor/pytz/zoneinfo/America/St_Thomas.py new file mode 100644 index 00000000..4367e35a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/St_Thomas.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/St_Thomas.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Thomas(DstTzInfo): + '''America/St_Thomas timezone definition. See datetime.tzinfo for details''' + + zone = 'America/St_Thomas' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,19,44), + ] + + _transition_info = [ +i(-15600,0,'LMT'), +i(-14400,0,'AST'), + ] + +St_Thomas = St_Thomas() + diff --git a/vendor/pytz/zoneinfo/America/St_Vincent.py b/vendor/pytz/zoneinfo/America/St_Vincent.py new file mode 100644 index 00000000..fca39da8 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/St_Vincent.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/St_Vincent.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Vincent(DstTzInfo): + '''America/St_Vincent timezone definition. See datetime.tzinfo for details''' + + zone = 'America/St_Vincent' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,4,4,56), + ] + + _transition_info = [ +i(-14700,0,'KMT'), +i(-14400,0,'AST'), + ] + +St_Vincent = St_Vincent() + diff --git a/vendor/pytz/zoneinfo/America/Swift_Current.py b/vendor/pytz/zoneinfo/America/Swift_Current.py new file mode 100644 index 00000000..e4bab9f7 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Swift_Current.py @@ -0,0 +1,66 @@ +'''tzinfo timezone information for America/Swift_Current.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Swift_Current(DstTzInfo): + '''America/Swift_Current timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Swift_Current' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,9,1,7,11,20), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1946,4,28,9,0,0), +d(1946,10,13,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1948,4,25,9,0,0), +d(1948,9,26,8,0,0), +d(1949,4,24,9,0,0), +d(1949,9,25,8,0,0), +d(1957,4,28,9,0,0), +d(1957,10,27,8,0,0), +d(1959,4,26,9,0,0), +d(1959,10,25,8,0,0), +d(1960,4,24,9,0,0), +d(1960,9,25,8,0,0), +d(1961,4,30,9,0,0), +d(1961,9,24,8,0,0), +d(1972,4,30,9,0,0), + ] + + _transition_info = [ +i(-25860,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), + ] + +Swift_Current = Swift_Current() + diff --git a/vendor/pytz/zoneinfo/America/Tegucigalpa.py b/vendor/pytz/zoneinfo/America/Tegucigalpa.py new file mode 100644 index 00000000..3f74d02a --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Tegucigalpa.py @@ -0,0 +1,46 @@ +'''tzinfo timezone information for America/Tegucigalpa.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tegucigalpa(DstTzInfo): + '''America/Tegucigalpa timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Tegucigalpa' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,4,1,5,48,52), +d(1987,5,3,6,0,0), +d(1987,9,27,5,0,0), +d(1988,5,1,6,0,0), +d(1988,9,25,5,0,0), +d(2006,5,7,6,0,0), +d(2006,8,7,5,0,0), +d(2007,5,6,6,0,0), +d(2007,8,6,5,0,0), +d(2008,5,4,6,0,0), +d(2008,8,4,5,0,0), +d(2009,5,3,6,0,0), +d(2009,8,3,5,0,0), + ] + + _transition_info = [ +i(-20940,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Tegucigalpa = Tegucigalpa() + diff --git a/vendor/pytz/zoneinfo/America/Thule.py b/vendor/pytz/zoneinfo/America/Thule.py new file mode 100644 index 00000000..8a773ab1 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Thule.py @@ -0,0 +1,210 @@ +'''tzinfo timezone information for America/Thule.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Thule(DstTzInfo): + '''America/Thule timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Thule' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,28,4,35,8), +d(1991,3,31,6,0,0), +d(1991,9,29,5,0,0), +d(1992,3,29,6,0,0), +d(1992,9,27,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,5,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,5,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,5,0,0), +d(1998,4,5,6,0,0), +d(1998,10,25,5,0,0), +d(1999,4,4,6,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,6,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,6,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,6,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,6,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,6,0,0), +d(2004,10,31,5,0,0), +d(2005,4,3,6,0,0), +d(2005,10,30,5,0,0), +d(2006,4,2,6,0,0), +d(2006,10,29,5,0,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-16500,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Thule = Thule() + diff --git a/vendor/pytz/zoneinfo/America/Thunder_Bay.py b/vendor/pytz/zoneinfo/America/Thunder_Bay.py new file mode 100644 index 00000000..699cad24 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Thunder_Bay.py @@ -0,0 +1,296 @@ +'''tzinfo timezone information for America/Thunder_Bay.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Thunder_Bay(DstTzInfo): + '''America/Thunder_Bay timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Thunder_Bay' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,1,1,6,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Thunder_Bay = Thunder_Bay() + diff --git a/vendor/pytz/zoneinfo/America/Tijuana.py b/vendor/pytz/zoneinfo/America/Tijuana.py new file mode 100644 index 00000000..79f6a970 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Tijuana.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for America/Tijuana.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tijuana(DstTzInfo): + '''America/Tijuana timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Tijuana' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,8,0,0), +d(1924,1,1,7,0,0), +d(1927,6,11,7,0,0), +d(1930,11,15,7,0,0), +d(1931,4,1,8,0,0), +d(1931,9,30,7,0,0), +d(1942,4,24,8,0,0), +d(1945,8,14,23,0,0), +d(1945,11,12,7,0,0), +d(1948,4,5,8,0,0), +d(1949,1,14,7,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,4,1,10,0,0), +d(2007,10,28,9,0,0), +d(2008,4,6,10,0,0), +d(2008,10,26,9,0,0), +d(2009,4,5,10,0,0), +d(2009,10,25,9,0,0), +d(2010,4,4,10,0,0), +d(2010,10,31,9,0,0), +d(2011,4,3,10,0,0), +d(2011,10,30,9,0,0), +d(2012,4,1,10,0,0), +d(2012,10,28,9,0,0), +d(2013,4,7,10,0,0), +d(2013,10,27,9,0,0), +d(2014,4,6,10,0,0), +d(2014,10,26,9,0,0), +d(2015,4,5,10,0,0), +d(2015,10,25,9,0,0), +d(2016,4,3,10,0,0), +d(2016,10,30,9,0,0), +d(2017,4,2,10,0,0), +d(2017,10,29,9,0,0), +d(2018,4,1,10,0,0), +d(2018,10,28,9,0,0), +d(2019,4,7,10,0,0), +d(2019,10,27,9,0,0), +d(2020,4,5,10,0,0), +d(2020,10,25,9,0,0), +d(2021,4,4,10,0,0), +d(2021,10,31,9,0,0), +d(2022,4,3,10,0,0), +d(2022,10,30,9,0,0), +d(2023,4,2,10,0,0), +d(2023,10,29,9,0,0), +d(2024,4,7,10,0,0), +d(2024,10,27,9,0,0), +d(2025,4,6,10,0,0), +d(2025,10,26,9,0,0), +d(2026,4,5,10,0,0), +d(2026,10,25,9,0,0), +d(2027,4,4,10,0,0), +d(2027,10,31,9,0,0), +d(2028,4,2,10,0,0), +d(2028,10,29,9,0,0), +d(2029,4,1,10,0,0), +d(2029,10,28,9,0,0), +d(2030,4,7,10,0,0), +d(2030,10,27,9,0,0), +d(2031,4,6,10,0,0), +d(2031,10,26,9,0,0), +d(2032,4,4,10,0,0), +d(2032,10,31,9,0,0), +d(2033,4,3,10,0,0), +d(2033,10,30,9,0,0), +d(2034,4,2,10,0,0), +d(2034,10,29,9,0,0), +d(2035,4,1,10,0,0), +d(2035,10,28,9,0,0), +d(2036,4,6,10,0,0), +d(2036,10,26,9,0,0), +d(2037,4,5,10,0,0), +d(2037,10,25,9,0,0), + ] + + _transition_info = [ +i(-28080,0,'LMT'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Tijuana = Tijuana() + diff --git a/vendor/pytz/zoneinfo/America/Toronto.py b/vendor/pytz/zoneinfo/America/Toronto.py new file mode 100644 index 00000000..25d4ae2f --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Toronto.py @@ -0,0 +1,484 @@ +'''tzinfo timezone information for America/Toronto.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Toronto(DstTzInfo): + '''America/Toronto timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Toronto' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,7,0,0), +d(1918,10,31,6,0,0), +d(1919,3,31,4,30,0), +d(1919,10,26,4,0,0), +d(1920,5,2,7,0,0), +d(1920,9,26,4,0,0), +d(1921,5,15,7,0,0), +d(1921,9,15,6,0,0), +d(1922,5,14,7,0,0), +d(1922,9,17,6,0,0), +d(1923,5,13,7,0,0), +d(1923,9,16,6,0,0), +d(1924,5,4,7,0,0), +d(1924,9,21,6,0,0), +d(1925,5,3,7,0,0), +d(1925,9,20,6,0,0), +d(1926,5,2,7,0,0), +d(1926,9,19,6,0,0), +d(1927,5,1,7,0,0), +d(1927,9,25,6,0,0), +d(1928,4,29,7,0,0), +d(1928,9,30,6,0,0), +d(1929,4,28,7,0,0), +d(1929,9,29,6,0,0), +d(1930,4,27,7,0,0), +d(1930,9,28,6,0,0), +d(1931,4,26,7,0,0), +d(1931,9,27,6,0,0), +d(1932,5,1,7,0,0), +d(1932,9,25,6,0,0), +d(1933,4,30,7,0,0), +d(1933,10,1,6,0,0), +d(1934,4,29,7,0,0), +d(1934,9,30,6,0,0), +d(1935,4,28,7,0,0), +d(1935,9,29,6,0,0), +d(1936,4,26,7,0,0), +d(1936,9,27,6,0,0), +d(1937,4,25,7,0,0), +d(1937,9,26,6,0,0), +d(1938,4,24,7,0,0), +d(1938,9,25,6,0,0), +d(1939,4,30,7,0,0), +d(1939,9,24,6,0,0), +d(1940,4,28,7,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,5,0,0), +d(1947,9,28,4,0,0), +d(1948,4,25,5,0,0), +d(1948,9,26,4,0,0), +d(1949,4,24,5,0,0), +d(1949,11,27,4,0,0), +d(1950,4,30,7,0,0), +d(1950,11,26,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,9,25,6,0,0), +d(1956,4,29,7,0,0), +d(1956,9,30,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Toronto = Toronto() + diff --git a/vendor/pytz/zoneinfo/America/Tortola.py b/vendor/pytz/zoneinfo/America/Tortola.py new file mode 100644 index 00000000..485f3841 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Tortola.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Tortola.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tortola(DstTzInfo): + '''America/Tortola timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Tortola' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,18,28), + ] + + _transition_info = [ +i(-15480,0,'LMT'), +i(-14400,0,'AST'), + ] + +Tortola = Tortola() + diff --git a/vendor/pytz/zoneinfo/America/Vancouver.py b/vendor/pytz/zoneinfo/America/Vancouver.py new file mode 100644 index 00000000..89e0aca9 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Vancouver.py @@ -0,0 +1,398 @@ +'''tzinfo timezone information for America/Vancouver.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vancouver(DstTzInfo): + '''America/Vancouver timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Vancouver' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,10,0,0), +d(1918,10,31,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1946,4,28,10,0,0), +d(1946,10,13,9,0,0), +d(1947,4,27,10,0,0), +d(1947,9,28,9,0,0), +d(1948,4,25,10,0,0), +d(1948,9,26,9,0,0), +d(1949,4,24,10,0,0), +d(1949,9,25,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,4,28,10,0,0), +d(1974,10,27,9,0,0), +d(1975,4,27,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Vancouver = Vancouver() + diff --git a/vendor/pytz/zoneinfo/America/Virgin.py b/vendor/pytz/zoneinfo/America/Virgin.py new file mode 100644 index 00000000..9d6529ac --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Virgin.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for America/Virgin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Virgin(DstTzInfo): + '''America/Virgin timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Virgin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,7,1,4,19,44), + ] + + _transition_info = [ +i(-15600,0,'LMT'), +i(-14400,0,'AST'), + ] + +Virgin = Virgin() + diff --git a/vendor/pytz/zoneinfo/America/Whitehorse.py b/vendor/pytz/zoneinfo/America/Whitehorse.py new file mode 100644 index 00000000..78d1d74b --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Whitehorse.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for America/Whitehorse.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Whitehorse(DstTzInfo): + '''America/Whitehorse timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Whitehorse' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,11,0,0), +d(1918,10,27,10,0,0), +d(1919,5,25,11,0,0), +d(1919,11,1,8,0,0), +d(1942,2,9,11,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,10,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,9,0,0), +d(1966,7,1,11,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YWT'), +i(-28800,3600,'YPT'), +i(-32400,0,'YST'), +i(-25200,7200,'YDDT'), +i(-32400,0,'YST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Whitehorse = Whitehorse() + diff --git a/vendor/pytz/zoneinfo/America/Winnipeg.py b/vendor/pytz/zoneinfo/America/Winnipeg.py new file mode 100644 index 00000000..96fa3236 --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Winnipeg.py @@ -0,0 +1,392 @@ +'''tzinfo timezone information for America/Winnipeg.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Winnipeg(DstTzInfo): + '''America/Winnipeg timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Winnipeg' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,23,6,0,0), +d(1916,9,17,5,0,0), +d(1918,4,14,8,0,0), +d(1918,10,31,7,0,0), +d(1937,5,16,8,0,0), +d(1937,9,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,5,12,8,0,0), +d(1946,10,13,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,5,1,8,0,0), +d(1950,9,30,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,9,30,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,9,25,7,0,0), +d(1963,4,28,8,0,0), +d(1963,9,22,7,0,0), +d(1966,4,24,8,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,8,0,0), +d(1974,4,28,8,0,0), +d(1974,10,27,8,0,0), +d(1975,4,27,8,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,8,0,0), +d(2006,1,1,6,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Winnipeg = Winnipeg() + diff --git a/vendor/pytz/zoneinfo/America/Yakutat.py b/vendor/pytz/zoneinfo/America/Yakutat.py new file mode 100644 index 00000000..b98a6afd --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Yakutat.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for America/Yakutat.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yakutat(DstTzInfo): + '''America/Yakutat timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Yakutat' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,11,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,10,0,0), +d(1969,4,27,11,0,0), +d(1969,10,26,10,0,0), +d(1970,4,26,11,0,0), +d(1970,10,25,10,0,0), +d(1971,4,25,11,0,0), +d(1971,10,31,10,0,0), +d(1972,4,30,11,0,0), +d(1972,10,29,10,0,0), +d(1973,4,29,11,0,0), +d(1973,10,28,10,0,0), +d(1974,1,6,11,0,0), +d(1974,10,27,10,0,0), +d(1975,2,23,11,0,0), +d(1975,10,26,10,0,0), +d(1976,4,25,11,0,0), +d(1976,10,31,10,0,0), +d(1977,4,24,11,0,0), +d(1977,10,30,10,0,0), +d(1978,4,30,11,0,0), +d(1978,10,29,10,0,0), +d(1979,4,29,11,0,0), +d(1979,10,28,10,0,0), +d(1980,4,27,11,0,0), +d(1980,10,26,10,0,0), +d(1981,4,26,11,0,0), +d(1981,10,25,10,0,0), +d(1982,4,25,11,0,0), +d(1982,10,31,10,0,0), +d(1983,4,24,11,0,0), +d(1983,10,30,10,0,0), +d(1983,11,30,9,0,0), +d(1984,4,29,11,0,0), +d(1984,10,28,10,0,0), +d(1985,4,28,11,0,0), +d(1985,10,27,10,0,0), +d(1986,4,27,11,0,0), +d(1986,10,26,10,0,0), +d(1987,4,5,11,0,0), +d(1987,10,25,10,0,0), +d(1988,4,3,11,0,0), +d(1988,10,30,10,0,0), +d(1989,4,2,11,0,0), +d(1989,10,29,10,0,0), +d(1990,4,1,11,0,0), +d(1990,10,28,10,0,0), +d(1991,4,7,11,0,0), +d(1991,10,27,10,0,0), +d(1992,4,5,11,0,0), +d(1992,10,25,10,0,0), +d(1993,4,4,11,0,0), +d(1993,10,31,10,0,0), +d(1994,4,3,11,0,0), +d(1994,10,30,10,0,0), +d(1995,4,2,11,0,0), +d(1995,10,29,10,0,0), +d(1996,4,7,11,0,0), +d(1996,10,27,10,0,0), +d(1997,4,6,11,0,0), +d(1997,10,26,10,0,0), +d(1998,4,5,11,0,0), +d(1998,10,25,10,0,0), +d(1999,4,4,11,0,0), +d(1999,10,31,10,0,0), +d(2000,4,2,11,0,0), +d(2000,10,29,10,0,0), +d(2001,4,1,11,0,0), +d(2001,10,28,10,0,0), +d(2002,4,7,11,0,0), +d(2002,10,27,10,0,0), +d(2003,4,6,11,0,0), +d(2003,10,26,10,0,0), +d(2004,4,4,11,0,0), +d(2004,10,31,10,0,0), +d(2005,4,3,11,0,0), +d(2005,10,30,10,0,0), +d(2006,4,2,11,0,0), +d(2006,10,29,10,0,0), +d(2007,3,11,11,0,0), +d(2007,11,4,10,0,0), +d(2008,3,9,11,0,0), +d(2008,11,2,10,0,0), +d(2009,3,8,11,0,0), +d(2009,11,1,10,0,0), +d(2010,3,14,11,0,0), +d(2010,11,7,10,0,0), +d(2011,3,13,11,0,0), +d(2011,11,6,10,0,0), +d(2012,3,11,11,0,0), +d(2012,11,4,10,0,0), +d(2013,3,10,11,0,0), +d(2013,11,3,10,0,0), +d(2014,3,9,11,0,0), +d(2014,11,2,10,0,0), +d(2015,3,8,11,0,0), +d(2015,11,1,10,0,0), +d(2016,3,13,11,0,0), +d(2016,11,6,10,0,0), +d(2017,3,12,11,0,0), +d(2017,11,5,10,0,0), +d(2018,3,11,11,0,0), +d(2018,11,4,10,0,0), +d(2019,3,10,11,0,0), +d(2019,11,3,10,0,0), +d(2020,3,8,11,0,0), +d(2020,11,1,10,0,0), +d(2021,3,14,11,0,0), +d(2021,11,7,10,0,0), +d(2022,3,13,11,0,0), +d(2022,11,6,10,0,0), +d(2023,3,12,11,0,0), +d(2023,11,5,10,0,0), +d(2024,3,10,11,0,0), +d(2024,11,3,10,0,0), +d(2025,3,9,11,0,0), +d(2025,11,2,10,0,0), +d(2026,3,8,11,0,0), +d(2026,11,1,10,0,0), +d(2027,3,14,11,0,0), +d(2027,11,7,10,0,0), +d(2028,3,12,11,0,0), +d(2028,11,5,10,0,0), +d(2029,3,11,11,0,0), +d(2029,11,4,10,0,0), +d(2030,3,10,11,0,0), +d(2030,11,3,10,0,0), +d(2031,3,9,11,0,0), +d(2031,11,2,10,0,0), +d(2032,3,14,11,0,0), +d(2032,11,7,10,0,0), +d(2033,3,13,11,0,0), +d(2033,11,6,10,0,0), +d(2034,3,12,11,0,0), +d(2034,11,5,10,0,0), +d(2035,3,11,11,0,0), +d(2035,11,4,10,0,0), +d(2036,3,9,11,0,0), +d(2036,11,2,10,0,0), +d(2037,3,8,11,0,0), +d(2037,11,1,10,0,0), + ] + + _transition_info = [ +i(-32400,0,'YST'), +i(-28800,3600,'YWT'), +i(-28800,3600,'YPT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), + ] + +Yakutat = Yakutat() + diff --git a/vendor/pytz/zoneinfo/America/Yellowknife.py b/vendor/pytz/zoneinfo/America/Yellowknife.py new file mode 100644 index 00000000..81494e5f --- /dev/null +++ b/vendor/pytz/zoneinfo/America/Yellowknife.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for America/Yellowknife.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yellowknife(DstTzInfo): + '''America/Yellowknife timezone definition. See datetime.tzinfo for details''' + + zone = 'America/Yellowknife' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,9,0,0), +d(1918,10,27,8,0,0), +d(1919,5,25,9,0,0), +d(1919,11,1,6,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,7,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-18000,7200,'MDDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Yellowknife = Yellowknife() + diff --git a/vendor/flask/testsuite/test_apps/flask_broken/b.py b/vendor/pytz/zoneinfo/America/__init__.py similarity index 100% rename from vendor/flask/testsuite/test_apps/flask_broken/b.py rename to vendor/pytz/zoneinfo/America/__init__.py diff --git a/vendor/pytz/zoneinfo/Antarctica/Casey.py b/vendor/pytz/zoneinfo/Antarctica/Casey.py new file mode 100644 index 00000000..b4bcceb4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Casey.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Antarctica/Casey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Casey(DstTzInfo): + '''Antarctica/Casey timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Casey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,1,1,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(28800,0,'WST'), + ] + +Casey = Casey() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Davis.py b/vendor/pytz/zoneinfo/Antarctica/Davis.py new file mode 100644 index 00000000..6c1384fa --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Davis.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Antarctica/Davis.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Davis(DstTzInfo): + '''Antarctica/Davis timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Davis' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1957,1,13,0,0,0), +d(1964,10,31,17,0,0), +d(1969,2,1,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(25200,0,'DAVT'), +i(0,0,'zzz'), +i(25200,0,'DAVT'), + ] + +Davis = Davis() + diff --git a/vendor/pytz/zoneinfo/Antarctica/DumontDUrville.py b/vendor/pytz/zoneinfo/Antarctica/DumontDUrville.py new file mode 100644 index 00000000..14af4df3 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/DumontDUrville.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Antarctica/DumontDUrville.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class DumontDUrville(DstTzInfo): + '''Antarctica/DumontDUrville timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/DumontDUrville' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1947,1,1,0,0,0), +d(1952,1,13,14,0,0), +d(1956,11,1,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(36000,0,'PMT'), +i(0,0,'zzz'), +i(36000,0,'DDUT'), + ] + +DumontDUrville = DumontDUrville() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Mawson.py b/vendor/pytz/zoneinfo/Antarctica/Mawson.py new file mode 100644 index 00000000..ea1bc6c2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Mawson.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Antarctica/Mawson.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mawson(DstTzInfo): + '''Antarctica/Mawson timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Mawson' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1954,2,13,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(21600,0,'MAWT'), + ] + +Mawson = Mawson() + diff --git a/vendor/pytz/zoneinfo/Antarctica/McMurdo.py b/vendor/pytz/zoneinfo/Antarctica/McMurdo.py new file mode 100644 index 00000000..f7a5f472 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/McMurdo.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for Antarctica/McMurdo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class McMurdo(DstTzInfo): + '''Antarctica/McMurdo timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/McMurdo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1956,1,1,0,0,0), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), + ] + +McMurdo = McMurdo() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Palmer.py b/vendor/pytz/zoneinfo/Antarctica/Palmer.py new file mode 100644 index 00000000..3d80c79c --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Palmer.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for Antarctica/Palmer.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Palmer(DstTzInfo): + '''Antarctica/Palmer timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Palmer' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1965,1,1,0,0,0), +d(1965,3,1,3,0,0), +d(1965,10,15,4,0,0), +d(1966,3,1,3,0,0), +d(1966,10,15,4,0,0), +d(1967,4,2,3,0,0), +d(1967,10,1,4,0,0), +d(1968,4,7,3,0,0), +d(1968,10,6,4,0,0), +d(1969,4,6,3,0,0), +d(1969,10,5,4,0,0), +d(1974,1,23,3,0,0), +d(1974,5,1,2,0,0), +d(1982,5,1,3,0,0), +d(1982,10,10,4,0,0), +d(1983,3,13,3,0,0), +d(1983,10,9,4,0,0), +d(1984,3,11,3,0,0), +d(1984,10,14,4,0,0), +d(1985,3,10,3,0,0), +d(1985,10,13,4,0,0), +d(1986,3,9,3,0,0), +d(1986,10,12,4,0,0), +d(1987,4,12,3,0,0), +d(1987,10,11,4,0,0), +d(1988,3,13,3,0,0), +d(1988,10,2,4,0,0), +d(1989,3,12,3,0,0), +d(1989,10,15,4,0,0), +d(1990,3,18,3,0,0), +d(1990,9,16,4,0,0), +d(1991,3,10,3,0,0), +d(1991,10,13,4,0,0), +d(1992,3,15,3,0,0), +d(1992,10,11,4,0,0), +d(1993,3,14,3,0,0), +d(1993,10,10,4,0,0), +d(1994,3,13,3,0,0), +d(1994,10,9,4,0,0), +d(1995,3,12,3,0,0), +d(1995,10,15,4,0,0), +d(1996,3,10,3,0,0), +d(1996,10,13,4,0,0), +d(1997,3,30,3,0,0), +d(1997,10,12,4,0,0), +d(1998,3,15,3,0,0), +d(1998,9,27,4,0,0), +d(1999,4,4,3,0,0), +d(1999,10,10,4,0,0), +d(2000,3,12,3,0,0), +d(2000,10,15,4,0,0), +d(2001,3,11,3,0,0), +d(2001,10,14,4,0,0), +d(2002,3,10,3,0,0), +d(2002,10,13,4,0,0), +d(2003,3,9,3,0,0), +d(2003,10,12,4,0,0), +d(2004,3,14,3,0,0), +d(2004,10,10,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,9,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,14,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,12,4,0,0), +d(2009,3,15,3,0,0), +d(2009,10,11,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,10,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,9,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,14,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,13,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,12,4,0,0), +d(2015,3,15,3,0,0), +d(2015,10,11,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,9,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,14,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,13,4,0,0), +d(2020,3,15,3,0,0), +d(2020,10,11,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,10,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,9,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,13,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,12,4,0,0), +d(2026,3,15,3,0,0), +d(2026,10,11,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,10,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,14,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,13,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,12,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,10,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,9,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,14,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,12,4,0,0), +d(2037,3,15,3,0,0), +d(2037,10,11,4,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(-10800,-10800,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,3600,'ARST'), +i(-14400,0,'ART'), +i(-10800,0,'ART'), +i(-7200,3600,'ARST'), +i(-10800,0,'ART'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), + ] + +Palmer = Palmer() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Rothera.py b/vendor/pytz/zoneinfo/Antarctica/Rothera.py new file mode 100644 index 00000000..ffd20cb4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Rothera.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Antarctica/Rothera.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rothera(DstTzInfo): + '''Antarctica/Rothera timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Rothera' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1976,12,1,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(-10800,0,'ROTT'), + ] + +Rothera = Rothera() + diff --git a/vendor/pytz/zoneinfo/Antarctica/South_Pole.py b/vendor/pytz/zoneinfo/Antarctica/South_Pole.py new file mode 100644 index 00000000..9cbd0ff4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/South_Pole.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for Antarctica/South_Pole.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class South_Pole(DstTzInfo): + '''Antarctica/South_Pole timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/South_Pole' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1956,1,1,0,0,0), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), + ] + +South_Pole = South_Pole() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Syowa.py b/vendor/pytz/zoneinfo/Antarctica/Syowa.py new file mode 100644 index 00000000..8941832d --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Syowa.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Antarctica/Syowa.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Syowa(DstTzInfo): + '''Antarctica/Syowa timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Syowa' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1957,1,29,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(10800,0,'SYOT'), + ] + +Syowa = Syowa() + diff --git a/vendor/pytz/zoneinfo/Antarctica/Vostok.py b/vendor/pytz/zoneinfo/Antarctica/Vostok.py new file mode 100644 index 00000000..6e2e41ec --- /dev/null +++ b/vendor/pytz/zoneinfo/Antarctica/Vostok.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Antarctica/Vostok.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vostok(DstTzInfo): + '''Antarctica/Vostok timezone definition. See datetime.tzinfo for details''' + + zone = 'Antarctica/Vostok' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1957,12,16,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(21600,0,'VOST'), + ] + +Vostok = Vostok() + diff --git a/vendor/pytz/zoneinfo/Antarctica/__init__.py b/vendor/pytz/zoneinfo/Antarctica/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Arctic/Longyearbyen.py b/vendor/pytz/zoneinfo/Arctic/Longyearbyen.py new file mode 100644 index 00000000..71577cbb --- /dev/null +++ b/vendor/pytz/zoneinfo/Arctic/Longyearbyen.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Arctic/Longyearbyen.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Longyearbyen(DstTzInfo): + '''Arctic/Longyearbyen timezone definition. See datetime.tzinfo for details''' + + zone = 'Arctic/Longyearbyen' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,22,0,0,0), +d(1916,9,29,22,0,0), +d(1940,8,10,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,10,1,1,0,0), +d(1959,3,15,1,0,0), +d(1959,9,20,1,0,0), +d(1960,3,20,1,0,0), +d(1960,9,18,1,0,0), +d(1961,3,19,1,0,0), +d(1961,9,17,1,0,0), +d(1962,3,18,1,0,0), +d(1962,9,16,1,0,0), +d(1963,3,17,1,0,0), +d(1963,9,15,1,0,0), +d(1964,3,15,1,0,0), +d(1964,9,20,1,0,0), +d(1965,4,25,1,0,0), +d(1965,9,19,1,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Longyearbyen = Longyearbyen() + diff --git a/vendor/pytz/zoneinfo/Arctic/__init__.py b/vendor/pytz/zoneinfo/Arctic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Asia/Aden.py b/vendor/pytz/zoneinfo/Asia/Aden.py new file mode 100644 index 00000000..0d0ac64e --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Aden.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Aden.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Aden(DstTzInfo): + '''Asia/Aden timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Aden' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1949,12,31,20,59,12), + ] + + _transition_info = [ +i(10860,0,'LMT'), +i(10800,0,'AST'), + ] + +Aden = Aden() + diff --git a/vendor/pytz/zoneinfo/Asia/Almaty.py b/vendor/pytz/zoneinfo/Asia/Almaty.py new file mode 100644 index 00000000..9d0df827 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Almaty.py @@ -0,0 +1,120 @@ +'''tzinfo timezone information for Asia/Almaty.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Almaty(DstTzInfo): + '''Asia/Almaty timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Almaty' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,18,52,12), +d(1930,6,20,19,0,0), +d(1981,3,31,18,0,0), +d(1981,9,30,17,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,17,0,0), +d(1983,3,31,18,0,0), +d(1983,9,30,17,0,0), +d(1984,3,31,18,0,0), +d(1984,9,29,20,0,0), +d(1985,3,30,20,0,0), +d(1985,9,28,20,0,0), +d(1986,3,29,20,0,0), +d(1986,9,27,20,0,0), +d(1987,3,28,20,0,0), +d(1987,9,26,20,0,0), +d(1988,3,26,20,0,0), +d(1988,9,24,20,0,0), +d(1989,3,25,20,0,0), +d(1989,9,23,20,0,0), +d(1990,3,24,20,0,0), +d(1990,9,29,20,0,0), +d(1990,12,31,18,0,0), +d(1992,3,28,17,0,0), +d(1992,9,26,16,0,0), +d(1993,3,27,20,0,0), +d(1993,9,25,20,0,0), +d(1994,3,26,20,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,20,0,0), +d(1995,9,23,20,0,0), +d(1996,3,30,20,0,0), +d(1996,10,26,20,0,0), +d(1997,3,29,20,0,0), +d(1997,10,25,20,0,0), +d(1998,3,28,20,0,0), +d(1998,10,24,20,0,0), +d(1999,3,27,20,0,0), +d(1999,10,30,20,0,0), +d(2000,3,25,20,0,0), +d(2000,10,28,20,0,0), +d(2001,3,24,20,0,0), +d(2001,10,27,20,0,0), +d(2002,3,30,20,0,0), +d(2002,10,26,20,0,0), +d(2003,3,29,20,0,0), +d(2003,10,25,20,0,0), +d(2004,3,27,20,0,0), +d(2004,10,30,20,0,0), +d(2005,3,14,18,0,0), + ] + + _transition_info = [ +i(18480,0,'LMT'), +i(18000,0,'ALMT'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(25200,3600,'ALMST'), +i(21600,0,'ALMT'), +i(21600,0,'ALMT'), + ] + +Almaty = Almaty() + diff --git a/vendor/pytz/zoneinfo/Asia/Amman.py b/vendor/pytz/zoneinfo/Asia/Amman.py new file mode 100644 index 00000000..4aa1b335 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Amman.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Asia/Amman.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Amman(DstTzInfo): + '''Asia/Amman timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Amman' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1930,12,31,21,36,16), +d(1973,6,5,22,0,0), +d(1973,9,30,21,0,0), +d(1974,4,30,22,0,0), +d(1974,9,30,21,0,0), +d(1975,4,30,22,0,0), +d(1975,9,30,21,0,0), +d(1976,4,30,22,0,0), +d(1976,10,31,21,0,0), +d(1977,4,30,22,0,0), +d(1977,9,30,21,0,0), +d(1978,4,29,22,0,0), +d(1978,9,29,21,0,0), +d(1985,3,31,22,0,0), +d(1985,9,30,21,0,0), +d(1986,4,3,22,0,0), +d(1986,10,2,21,0,0), +d(1987,4,2,22,0,0), +d(1987,10,1,21,0,0), +d(1988,3,31,22,0,0), +d(1988,10,6,21,0,0), +d(1989,5,7,22,0,0), +d(1989,10,5,21,0,0), +d(1990,4,26,22,0,0), +d(1990,10,4,21,0,0), +d(1991,4,16,22,0,0), +d(1991,9,26,21,0,0), +d(1992,4,9,22,0,0), +d(1992,10,1,21,0,0), +d(1993,4,1,22,0,0), +d(1993,9,30,21,0,0), +d(1994,3,31,22,0,0), +d(1994,9,15,21,0,0), +d(1995,4,6,22,0,0), +d(1995,9,14,22,0,0), +d(1996,4,4,22,0,0), +d(1996,9,19,22,0,0), +d(1997,4,3,22,0,0), +d(1997,9,18,22,0,0), +d(1998,4,2,22,0,0), +d(1998,9,17,22,0,0), +d(1999,6,30,22,0,0), +d(1999,9,29,22,0,0), +d(2000,3,29,22,0,0), +d(2000,9,27,22,0,0), +d(2001,3,28,22,0,0), +d(2001,9,26,22,0,0), +d(2002,3,27,22,0,0), +d(2002,9,25,22,0,0), +d(2003,3,26,22,0,0), +d(2003,10,23,22,0,0), +d(2004,3,24,22,0,0), +d(2004,10,14,22,0,0), +d(2005,3,30,22,0,0), +d(2005,9,29,22,0,0), +d(2006,3,29,22,0,0), +d(2006,10,26,22,0,0), +d(2007,3,28,22,0,0), +d(2007,10,25,22,0,0), +d(2008,3,26,22,0,0), +d(2008,10,30,22,0,0), +d(2009,3,25,22,0,0), +d(2009,10,29,22,0,0), +d(2010,3,24,22,0,0), +d(2010,10,28,22,0,0), +d(2011,3,30,22,0,0), +d(2011,10,27,22,0,0), +d(2012,3,28,22,0,0), +d(2012,10,25,22,0,0), +d(2013,3,27,22,0,0), +d(2013,10,24,22,0,0), +d(2014,3,26,22,0,0), +d(2014,10,30,22,0,0), +d(2015,3,25,22,0,0), +d(2015,10,29,22,0,0), +d(2016,3,30,22,0,0), +d(2016,10,27,22,0,0), +d(2017,3,29,22,0,0), +d(2017,10,26,22,0,0), +d(2018,3,28,22,0,0), +d(2018,10,25,22,0,0), +d(2019,3,27,22,0,0), +d(2019,10,24,22,0,0), +d(2020,3,25,22,0,0), +d(2020,10,29,22,0,0), +d(2021,3,24,22,0,0), +d(2021,10,28,22,0,0), +d(2022,3,30,22,0,0), +d(2022,10,27,22,0,0), +d(2023,3,29,22,0,0), +d(2023,10,26,22,0,0), +d(2024,3,27,22,0,0), +d(2024,10,24,22,0,0), +d(2025,3,26,22,0,0), +d(2025,10,30,22,0,0), +d(2026,3,25,22,0,0), +d(2026,10,29,22,0,0), +d(2027,3,24,22,0,0), +d(2027,10,28,22,0,0), +d(2028,3,29,22,0,0), +d(2028,10,26,22,0,0), +d(2029,3,28,22,0,0), +d(2029,10,25,22,0,0), +d(2030,3,27,22,0,0), +d(2030,10,24,22,0,0), +d(2031,3,26,22,0,0), +d(2031,10,30,22,0,0), +d(2032,3,24,22,0,0), +d(2032,10,28,22,0,0), +d(2033,3,30,22,0,0), +d(2033,10,27,22,0,0), +d(2034,3,29,22,0,0), +d(2034,10,26,22,0,0), +d(2035,3,28,22,0,0), +d(2035,10,25,22,0,0), +d(2036,3,26,22,0,0), +d(2036,10,30,22,0,0), +d(2037,3,25,22,0,0), +d(2037,10,29,22,0,0), + ] + + _transition_info = [ +i(8640,0,'LMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Amman = Amman() + diff --git a/vendor/pytz/zoneinfo/Asia/Anadyr.py b/vendor/pytz/zoneinfo/Asia/Anadyr.py new file mode 100644 index 00000000..37b50af9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Anadyr.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Anadyr.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Anadyr(DstTzInfo): + '''Asia/Anadyr timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Anadyr' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,12,10,4), +d(1930,6,20,12,0,0), +d(1981,3,31,11,0,0), +d(1981,9,30,10,0,0), +d(1982,3,31,11,0,0), +d(1982,9,30,11,0,0), +d(1983,3,31,12,0,0), +d(1983,9,30,11,0,0), +d(1984,3,31,12,0,0), +d(1984,9,29,14,0,0), +d(1985,3,30,14,0,0), +d(1985,9,28,14,0,0), +d(1986,3,29,14,0,0), +d(1986,9,27,14,0,0), +d(1987,3,28,14,0,0), +d(1987,9,26,14,0,0), +d(1988,3,26,14,0,0), +d(1988,9,24,14,0,0), +d(1989,3,25,14,0,0), +d(1989,9,23,14,0,0), +d(1990,3,24,14,0,0), +d(1990,9,29,14,0,0), +d(1991,3,30,14,0,0), +d(1991,9,28,15,0,0), +d(1992,1,18,15,0,0), +d(1992,3,28,11,0,0), +d(1992,9,26,10,0,0), +d(1993,3,27,14,0,0), +d(1993,9,25,14,0,0), +d(1994,3,26,14,0,0), +d(1994,9,24,14,0,0), +d(1995,3,25,14,0,0), +d(1995,9,23,14,0,0), +d(1996,3,30,14,0,0), +d(1996,10,26,14,0,0), +d(1997,3,29,14,0,0), +d(1997,10,25,14,0,0), +d(1998,3,28,14,0,0), +d(1998,10,24,14,0,0), +d(1999,3,27,14,0,0), +d(1999,10,30,14,0,0), +d(2000,3,25,14,0,0), +d(2000,10,28,14,0,0), +d(2001,3,24,14,0,0), +d(2001,10,27,14,0,0), +d(2002,3,30,14,0,0), +d(2002,10,26,14,0,0), +d(2003,3,29,14,0,0), +d(2003,10,25,14,0,0), +d(2004,3,27,14,0,0), +d(2004,10,30,14,0,0), +d(2005,3,26,14,0,0), +d(2005,10,29,14,0,0), +d(2006,3,25,14,0,0), +d(2006,10,28,14,0,0), +d(2007,3,24,14,0,0), +d(2007,10,27,14,0,0), +d(2008,3,29,14,0,0), +d(2008,10,25,14,0,0), +d(2009,3,28,14,0,0), +d(2009,10,24,14,0,0), +d(2010,3,27,14,0,0), +d(2010,10,30,14,0,0), +d(2011,3,26,14,0,0), +d(2011,10,29,14,0,0), +d(2012,3,24,14,0,0), +d(2012,10,27,14,0,0), +d(2013,3,30,14,0,0), +d(2013,10,26,14,0,0), +d(2014,3,29,14,0,0), +d(2014,10,25,14,0,0), +d(2015,3,28,14,0,0), +d(2015,10,24,14,0,0), +d(2016,3,26,14,0,0), +d(2016,10,29,14,0,0), +d(2017,3,25,14,0,0), +d(2017,10,28,14,0,0), +d(2018,3,24,14,0,0), +d(2018,10,27,14,0,0), +d(2019,3,30,14,0,0), +d(2019,10,26,14,0,0), +d(2020,3,28,14,0,0), +d(2020,10,24,14,0,0), +d(2021,3,27,14,0,0), +d(2021,10,30,14,0,0), +d(2022,3,26,14,0,0), +d(2022,10,29,14,0,0), +d(2023,3,25,14,0,0), +d(2023,10,28,14,0,0), +d(2024,3,30,14,0,0), +d(2024,10,26,14,0,0), +d(2025,3,29,14,0,0), +d(2025,10,25,14,0,0), +d(2026,3,28,14,0,0), +d(2026,10,24,14,0,0), +d(2027,3,27,14,0,0), +d(2027,10,30,14,0,0), +d(2028,3,25,14,0,0), +d(2028,10,28,14,0,0), +d(2029,3,24,14,0,0), +d(2029,10,27,14,0,0), +d(2030,3,30,14,0,0), +d(2030,10,26,14,0,0), +d(2031,3,29,14,0,0), +d(2031,10,25,14,0,0), +d(2032,3,27,14,0,0), +d(2032,10,30,14,0,0), +d(2033,3,26,14,0,0), +d(2033,10,29,14,0,0), +d(2034,3,25,14,0,0), +d(2034,10,28,14,0,0), +d(2035,3,24,14,0,0), +d(2035,10,27,14,0,0), +d(2036,3,29,14,0,0), +d(2036,10,25,14,0,0), +d(2037,3,28,14,0,0), +d(2037,10,24,14,0,0), + ] + + _transition_info = [ +i(42600,0,'LMT'), +i(43200,0,'ANAT'), +i(46800,0,'ANAT'), +i(50400,3600,'ANAST'), +i(46800,0,'ANAT'), +i(46800,0,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(43200,0,'ANAST'), +i(39600,0,'ANAT'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), +i(46800,3600,'ANAST'), +i(43200,0,'ANAT'), + ] + +Anadyr = Anadyr() + diff --git a/vendor/pytz/zoneinfo/Asia/Aqtau.py b/vendor/pytz/zoneinfo/Asia/Aqtau.py new file mode 100644 index 00000000..319f007c --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Aqtau.py @@ -0,0 +1,122 @@ +'''tzinfo timezone information for Asia/Aqtau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Aqtau(DstTzInfo): + '''Asia/Aqtau timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Aqtau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,38,56), +d(1930,6,20,20,0,0), +d(1962,12,31,19,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1990,12,31,19,0,0), +d(1991,12,15,19,0,0), +d(1992,3,28,18,0,0), +d(1992,9,26,17,0,0), +d(1993,3,27,21,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,21,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,21,0,0), +d(1995,9,23,22,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,22,0,0), +d(1997,3,29,22,0,0), +d(1997,10,25,22,0,0), +d(1998,3,28,22,0,0), +d(1998,10,24,22,0,0), +d(1999,3,27,22,0,0), +d(1999,10,30,22,0,0), +d(2000,3,25,22,0,0), +d(2000,10,28,22,0,0), +d(2001,3,24,22,0,0), +d(2001,10,27,22,0,0), +d(2002,3,30,22,0,0), +d(2002,10,26,22,0,0), +d(2003,3,29,22,0,0), +d(2003,10,25,22,0,0), +d(2004,3,27,22,0,0), +d(2004,10,30,22,0,0), +d(2005,3,14,20,0,0), + ] + + _transition_info = [ +i(12060,0,'LMT'), +i(14400,0,'FORT'), +i(18000,0,'FORT'), +i(18000,0,'SHET'), +i(21600,0,'SHET'), +i(21600,0,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(21600,3600,'SHEST'), +i(18000,0,'SHET'), +i(18000,0,'SHET'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(18000,0,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,3600,'AQTST'), +i(14400,0,'AQTT'), +i(18000,0,'AQTT'), + ] + +Aqtau = Aqtau() + diff --git a/vendor/pytz/zoneinfo/Asia/Aqtobe.py b/vendor/pytz/zoneinfo/Asia/Aqtobe.py new file mode 100644 index 00000000..2169a725 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Aqtobe.py @@ -0,0 +1,122 @@ +'''tzinfo timezone information for Asia/Aqtobe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Aqtobe(DstTzInfo): + '''Asia/Aqtobe timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Aqtobe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,11,20), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1990,12,31,19,0,0), +d(1991,12,15,19,0,0), +d(1992,3,28,18,0,0), +d(1992,9,26,17,0,0), +d(1993,3,27,21,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,21,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,21,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,21,0,0), +d(1996,10,26,21,0,0), +d(1997,3,29,21,0,0), +d(1997,10,25,21,0,0), +d(1998,3,28,21,0,0), +d(1998,10,24,21,0,0), +d(1999,3,27,21,0,0), +d(1999,10,30,21,0,0), +d(2000,3,25,21,0,0), +d(2000,10,28,21,0,0), +d(2001,3,24,21,0,0), +d(2001,10,27,21,0,0), +d(2002,3,30,21,0,0), +d(2002,10,26,21,0,0), +d(2003,3,29,21,0,0), +d(2003,10,25,21,0,0), +d(2004,3,27,21,0,0), +d(2004,10,30,21,0,0), +d(2005,3,14,19,0,0), + ] + + _transition_info = [ +i(13740,0,'LMT'), +i(14400,0,'AKTT'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(21600,0,'AKTT'), +i(21600,0,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(21600,3600,'AKTST'), +i(18000,0,'AKTT'), +i(18000,0,'AKTT'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(21600,3600,'AQTST'), +i(18000,0,'AQTT'), +i(18000,0,'AQTT'), + ] + +Aqtobe = Aqtobe() + diff --git a/vendor/pytz/zoneinfo/Asia/Ashgabat.py b/vendor/pytz/zoneinfo/Asia/Ashgabat.py new file mode 100644 index 00000000..92137c82 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Ashgabat.py @@ -0,0 +1,72 @@ +'''tzinfo timezone information for Asia/Ashgabat.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ashgabat(DstTzInfo): + '''Asia/Ashgabat timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Ashgabat' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,6,28), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,19,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,21,0,0), +d(1991,9,28,22,0,0), +d(1991,10,26,20,0,0), +d(1992,1,18,22,0,0), + ] + + _transition_info = [ +i(14040,0,'LMT'), +i(14400,0,'ASHT'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(18000,0,'ASHST'), +i(14400,0,'ASHT'), +i(14400,0,'TMT'), +i(18000,0,'TMT'), + ] + +Ashgabat = Ashgabat() + diff --git a/vendor/pytz/zoneinfo/Asia/Ashkhabad.py b/vendor/pytz/zoneinfo/Asia/Ashkhabad.py new file mode 100644 index 00000000..a99394d9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Ashkhabad.py @@ -0,0 +1,72 @@ +'''tzinfo timezone information for Asia/Ashkhabad.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ashkhabad(DstTzInfo): + '''Asia/Ashkhabad timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Ashkhabad' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,6,28), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,19,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,21,0,0), +d(1991,9,28,22,0,0), +d(1991,10,26,20,0,0), +d(1992,1,18,22,0,0), + ] + + _transition_info = [ +i(14040,0,'LMT'), +i(14400,0,'ASHT'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(21600,3600,'ASHST'), +i(18000,0,'ASHT'), +i(18000,0,'ASHST'), +i(14400,0,'ASHT'), +i(14400,0,'TMT'), +i(18000,0,'TMT'), + ] + +Ashkhabad = Ashkhabad() + diff --git a/vendor/pytz/zoneinfo/Asia/Baghdad.py b/vendor/pytz/zoneinfo/Asia/Baghdad.py new file mode 100644 index 00000000..8492cb21 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Baghdad.py @@ -0,0 +1,246 @@ +'''tzinfo timezone information for Asia/Baghdad.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Baghdad(DstTzInfo): + '''Asia/Baghdad timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Baghdad' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,12,31,21,2,24), +d(1982,4,30,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,30,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,30,20,0,0), +d(1985,3,31,21,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,22,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,22,0,0), +d(1991,4,1,0,0,0), +d(1991,10,1,0,0,0), +d(1992,4,1,0,0,0), +d(1992,10,1,0,0,0), +d(1993,4,1,0,0,0), +d(1993,10,1,0,0,0), +d(1994,4,1,0,0,0), +d(1994,10,1,0,0,0), +d(1995,4,1,0,0,0), +d(1995,10,1,0,0,0), +d(1996,4,1,0,0,0), +d(1996,10,1,0,0,0), +d(1997,4,1,0,0,0), +d(1997,10,1,0,0,0), +d(1998,4,1,0,0,0), +d(1998,10,1,0,0,0), +d(1999,4,1,0,0,0), +d(1999,10,1,0,0,0), +d(2000,4,1,0,0,0), +d(2000,10,1,0,0,0), +d(2001,4,1,0,0,0), +d(2001,10,1,0,0,0), +d(2002,4,1,0,0,0), +d(2002,10,1,0,0,0), +d(2003,4,1,0,0,0), +d(2003,10,1,0,0,0), +d(2004,4,1,0,0,0), +d(2004,10,1,0,0,0), +d(2005,4,1,0,0,0), +d(2005,10,1,0,0,0), +d(2006,4,1,0,0,0), +d(2006,10,1,0,0,0), +d(2007,4,1,0,0,0), +d(2007,10,1,0,0,0), +d(2008,4,1,0,0,0), +d(2008,10,1,0,0,0), +d(2009,4,1,0,0,0), +d(2009,10,1,0,0,0), +d(2010,4,1,0,0,0), +d(2010,10,1,0,0,0), +d(2011,4,1,0,0,0), +d(2011,10,1,0,0,0), +d(2012,4,1,0,0,0), +d(2012,10,1,0,0,0), +d(2013,4,1,0,0,0), +d(2013,10,1,0,0,0), +d(2014,4,1,0,0,0), +d(2014,10,1,0,0,0), +d(2015,4,1,0,0,0), +d(2015,10,1,0,0,0), +d(2016,4,1,0,0,0), +d(2016,10,1,0,0,0), +d(2017,4,1,0,0,0), +d(2017,10,1,0,0,0), +d(2018,4,1,0,0,0), +d(2018,10,1,0,0,0), +d(2019,4,1,0,0,0), +d(2019,10,1,0,0,0), +d(2020,4,1,0,0,0), +d(2020,10,1,0,0,0), +d(2021,4,1,0,0,0), +d(2021,10,1,0,0,0), +d(2022,4,1,0,0,0), +d(2022,10,1,0,0,0), +d(2023,4,1,0,0,0), +d(2023,10,1,0,0,0), +d(2024,4,1,0,0,0), +d(2024,10,1,0,0,0), +d(2025,4,1,0,0,0), +d(2025,10,1,0,0,0), +d(2026,4,1,0,0,0), +d(2026,10,1,0,0,0), +d(2027,4,1,0,0,0), +d(2027,10,1,0,0,0), +d(2028,4,1,0,0,0), +d(2028,10,1,0,0,0), +d(2029,4,1,0,0,0), +d(2029,10,1,0,0,0), +d(2030,4,1,0,0,0), +d(2030,10,1,0,0,0), +d(2031,4,1,0,0,0), +d(2031,10,1,0,0,0), +d(2032,4,1,0,0,0), +d(2032,10,1,0,0,0), +d(2033,4,1,0,0,0), +d(2033,10,1,0,0,0), +d(2034,4,1,0,0,0), +d(2034,10,1,0,0,0), +d(2035,4,1,0,0,0), +d(2035,10,1,0,0,0), +d(2036,4,1,0,0,0), +d(2036,10,1,0,0,0), +d(2037,4,1,0,0,0), +d(2037,10,1,0,0,0), + ] + + _transition_info = [ +i(10680,0,'BMT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), +i(14400,3600,'ADT'), +i(10800,0,'AST'), + ] + +Baghdad = Baghdad() + diff --git a/vendor/pytz/zoneinfo/Asia/Bahrain.py b/vendor/pytz/zoneinfo/Asia/Bahrain.py new file mode 100644 index 00000000..116d4895 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Bahrain.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Bahrain.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bahrain(DstTzInfo): + '''Asia/Bahrain timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Bahrain' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,20,37,40), +d(1972,5,31,20,0,0), + ] + + _transition_info = [ +i(12120,0,'LMT'), +i(14400,0,'GST'), +i(10800,0,'AST'), + ] + +Bahrain = Bahrain() + diff --git a/vendor/pytz/zoneinfo/Asia/Baku.py b/vendor/pytz/zoneinfo/Asia/Baku.py new file mode 100644 index 00000000..9efeb813 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Baku.py @@ -0,0 +1,244 @@ +'''tzinfo timezone information for Asia/Baku.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Baku(DstTzInfo): + '''Asia/Baku timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Baku' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,40,36), +d(1957,2,28,21,0,0), +d(1981,3,31,20,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,20,0,0), +d(1982,9,30,19,0,0), +d(1983,3,31,20,0,0), +d(1983,9,30,19,0,0), +d(1984,3,31,20,0,0), +d(1984,9,29,22,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,22,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,22,0,0), +d(1991,3,30,22,0,0), +d(1991,8,29,20,0,0), +d(1991,9,28,23,0,0), +d(1992,3,28,20,0,0), +d(1992,9,26,19,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1996,12,31,20,0,0), +d(1997,3,30,0,0,0), +d(1997,10,26,0,0,0), +d(1998,3,29,0,0,0), +d(1998,10,25,0,0,0), +d(1999,3,28,0,0,0), +d(1999,10,31,0,0,0), +d(2000,3,26,0,0,0), +d(2000,10,29,0,0,0), +d(2001,3,25,0,0,0), +d(2001,10,28,0,0,0), +d(2002,3,31,0,0,0), +d(2002,10,27,0,0,0), +d(2003,3,30,0,0,0), +d(2003,10,26,0,0,0), +d(2004,3,28,0,0,0), +d(2004,10,31,0,0,0), +d(2005,3,27,0,0,0), +d(2005,10,30,0,0,0), +d(2006,3,26,0,0,0), +d(2006,10,29,0,0,0), +d(2007,3,25,0,0,0), +d(2007,10,28,0,0,0), +d(2008,3,30,0,0,0), +d(2008,10,26,0,0,0), +d(2009,3,29,0,0,0), +d(2009,10,25,0,0,0), +d(2010,3,28,0,0,0), +d(2010,10,31,0,0,0), +d(2011,3,27,0,0,0), +d(2011,10,30,0,0,0), +d(2012,3,25,0,0,0), +d(2012,10,28,0,0,0), +d(2013,3,31,0,0,0), +d(2013,10,27,0,0,0), +d(2014,3,30,0,0,0), +d(2014,10,26,0,0,0), +d(2015,3,29,0,0,0), +d(2015,10,25,0,0,0), +d(2016,3,27,0,0,0), +d(2016,10,30,0,0,0), +d(2017,3,26,0,0,0), +d(2017,10,29,0,0,0), +d(2018,3,25,0,0,0), +d(2018,10,28,0,0,0), +d(2019,3,31,0,0,0), +d(2019,10,27,0,0,0), +d(2020,3,29,0,0,0), +d(2020,10,25,0,0,0), +d(2021,3,28,0,0,0), +d(2021,10,31,0,0,0), +d(2022,3,27,0,0,0), +d(2022,10,30,0,0,0), +d(2023,3,26,0,0,0), +d(2023,10,29,0,0,0), +d(2024,3,31,0,0,0), +d(2024,10,27,0,0,0), +d(2025,3,30,0,0,0), +d(2025,10,26,0,0,0), +d(2026,3,29,0,0,0), +d(2026,10,25,0,0,0), +d(2027,3,28,0,0,0), +d(2027,10,31,0,0,0), +d(2028,3,26,0,0,0), +d(2028,10,29,0,0,0), +d(2029,3,25,0,0,0), +d(2029,10,28,0,0,0), +d(2030,3,31,0,0,0), +d(2030,10,27,0,0,0), +d(2031,3,30,0,0,0), +d(2031,10,26,0,0,0), +d(2032,3,28,0,0,0), +d(2032,10,31,0,0,0), +d(2033,3,27,0,0,0), +d(2033,10,30,0,0,0), +d(2034,3,26,0,0,0), +d(2034,10,29,0,0,0), +d(2035,3,25,0,0,0), +d(2035,10,28,0,0,0), +d(2036,3,30,0,0,0), +d(2036,10,26,0,0,0), +d(2037,3,29,0,0,0), +d(2037,10,25,0,0,0), + ] + + _transition_info = [ +i(11940,0,'LMT'), +i(10800,0,'BAKT'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(18000,3600,'BAKST'), +i(14400,0,'BAKT'), +i(14400,0,'BAKST'), +i(14400,0,'AZST'), +i(10800,0,'AZT'), +i(14400,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), +i(18000,3600,'AZST'), +i(14400,0,'AZT'), + ] + +Baku = Baku() + diff --git a/vendor/pytz/zoneinfo/Asia/Bangkok.py b/vendor/pytz/zoneinfo/Asia/Bangkok.py new file mode 100644 index 00000000..e133e804 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Bangkok.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Bangkok.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bangkok(DstTzInfo): + '''Asia/Bangkok timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Bangkok' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,3,31,17,17,56), + ] + + _transition_info = [ +i(24120,0,'BMT'), +i(25200,0,'ICT'), + ] + +Bangkok = Bangkok() + diff --git a/vendor/pytz/zoneinfo/Asia/Beirut.py b/vendor/pytz/zoneinfo/Asia/Beirut.py new file mode 100644 index 00000000..5bfad431 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Beirut.py @@ -0,0 +1,300 @@ +'''tzinfo timezone information for Asia/Beirut.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Beirut(DstTzInfo): + '''Asia/Beirut timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Beirut' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,3,27,22,0,0), +d(1920,10,24,21,0,0), +d(1921,4,2,22,0,0), +d(1921,10,2,21,0,0), +d(1922,3,25,22,0,0), +d(1922,10,7,21,0,0), +d(1923,4,21,22,0,0), +d(1923,9,15,21,0,0), +d(1957,4,30,22,0,0), +d(1957,9,30,21,0,0), +d(1958,4,30,22,0,0), +d(1958,9,30,21,0,0), +d(1959,4,30,22,0,0), +d(1959,9,30,21,0,0), +d(1960,4,30,22,0,0), +d(1960,9,30,21,0,0), +d(1961,4,30,22,0,0), +d(1961,9,30,21,0,0), +d(1972,6,21,22,0,0), +d(1972,9,30,21,0,0), +d(1973,4,30,22,0,0), +d(1973,9,30,21,0,0), +d(1974,4,30,22,0,0), +d(1974,9,30,21,0,0), +d(1975,4,30,22,0,0), +d(1975,9,30,21,0,0), +d(1976,4,30,22,0,0), +d(1976,9,30,21,0,0), +d(1977,4,30,22,0,0), +d(1977,9,30,21,0,0), +d(1978,4,29,22,0,0), +d(1978,9,29,21,0,0), +d(1984,4,30,22,0,0), +d(1984,10,15,21,0,0), +d(1985,4,30,22,0,0), +d(1985,10,15,21,0,0), +d(1986,4,30,22,0,0), +d(1986,10,15,21,0,0), +d(1987,4,30,22,0,0), +d(1987,10,15,21,0,0), +d(1988,5,31,22,0,0), +d(1988,10,15,21,0,0), +d(1989,5,9,22,0,0), +d(1989,10,15,21,0,0), +d(1990,4,30,22,0,0), +d(1990,10,15,21,0,0), +d(1991,4,30,22,0,0), +d(1991,10,15,21,0,0), +d(1992,4,30,22,0,0), +d(1992,10,3,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,9,28,21,0,0), +d(1997,3,29,22,0,0), +d(1997,9,27,21,0,0), +d(1998,3,28,22,0,0), +d(1998,9,26,21,0,0), +d(1999,3,27,22,0,0), +d(1999,10,30,21,0,0), +d(2000,3,25,22,0,0), +d(2000,10,28,21,0,0), +d(2001,3,24,22,0,0), +d(2001,10,27,21,0,0), +d(2002,3,30,22,0,0), +d(2002,10,26,21,0,0), +d(2003,3,29,22,0,0), +d(2003,10,25,21,0,0), +d(2004,3,27,22,0,0), +d(2004,10,30,21,0,0), +d(2005,3,26,22,0,0), +d(2005,10,29,21,0,0), +d(2006,3,25,22,0,0), +d(2006,10,28,21,0,0), +d(2007,3,24,22,0,0), +d(2007,10,27,21,0,0), +d(2008,3,29,22,0,0), +d(2008,10,25,21,0,0), +d(2009,3,28,22,0,0), +d(2009,10,24,21,0,0), +d(2010,3,27,22,0,0), +d(2010,10,30,21,0,0), +d(2011,3,26,22,0,0), +d(2011,10,29,21,0,0), +d(2012,3,24,22,0,0), +d(2012,10,27,21,0,0), +d(2013,3,30,22,0,0), +d(2013,10,26,21,0,0), +d(2014,3,29,22,0,0), +d(2014,10,25,21,0,0), +d(2015,3,28,22,0,0), +d(2015,10,24,21,0,0), +d(2016,3,26,22,0,0), +d(2016,10,29,21,0,0), +d(2017,3,25,22,0,0), +d(2017,10,28,21,0,0), +d(2018,3,24,22,0,0), +d(2018,10,27,21,0,0), +d(2019,3,30,22,0,0), +d(2019,10,26,21,0,0), +d(2020,3,28,22,0,0), +d(2020,10,24,21,0,0), +d(2021,3,27,22,0,0), +d(2021,10,30,21,0,0), +d(2022,3,26,22,0,0), +d(2022,10,29,21,0,0), +d(2023,3,25,22,0,0), +d(2023,10,28,21,0,0), +d(2024,3,30,22,0,0), +d(2024,10,26,21,0,0), +d(2025,3,29,22,0,0), +d(2025,10,25,21,0,0), +d(2026,3,28,22,0,0), +d(2026,10,24,21,0,0), +d(2027,3,27,22,0,0), +d(2027,10,30,21,0,0), +d(2028,3,25,22,0,0), +d(2028,10,28,21,0,0), +d(2029,3,24,22,0,0), +d(2029,10,27,21,0,0), +d(2030,3,30,22,0,0), +d(2030,10,26,21,0,0), +d(2031,3,29,22,0,0), +d(2031,10,25,21,0,0), +d(2032,3,27,22,0,0), +d(2032,10,30,21,0,0), +d(2033,3,26,22,0,0), +d(2033,10,29,21,0,0), +d(2034,3,25,22,0,0), +d(2034,10,28,21,0,0), +d(2035,3,24,22,0,0), +d(2035,10,27,21,0,0), +d(2036,3,29,22,0,0), +d(2036,10,25,21,0,0), +d(2037,3,28,22,0,0), +d(2037,10,24,21,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Beirut = Beirut() + diff --git a/vendor/pytz/zoneinfo/Asia/Bishkek.py b/vendor/pytz/zoneinfo/Asia/Bishkek.py new file mode 100644 index 00000000..e5eb11b4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Bishkek.py @@ -0,0 +1,124 @@ +'''tzinfo timezone information for Asia/Bishkek.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bishkek(DstTzInfo): + '''Asia/Bishkek timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Bishkek' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,19,1,36), +d(1930,6,20,19,0,0), +d(1981,3,31,18,0,0), +d(1981,9,30,17,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,17,0,0), +d(1983,3,31,18,0,0), +d(1983,9,30,17,0,0), +d(1984,3,31,18,0,0), +d(1984,9,29,20,0,0), +d(1985,3,30,20,0,0), +d(1985,9,28,20,0,0), +d(1986,3,29,20,0,0), +d(1986,9,27,20,0,0), +d(1987,3,28,20,0,0), +d(1987,9,26,20,0,0), +d(1988,3,26,20,0,0), +d(1988,9,24,20,0,0), +d(1989,3,25,20,0,0), +d(1989,9,23,20,0,0), +d(1990,3,24,20,0,0), +d(1990,9,29,20,0,0), +d(1991,3,30,20,0,0), +d(1991,8,30,20,0,0), +d(1992,4,11,19,0,0), +d(1992,9,26,18,0,0), +d(1993,4,10,19,0,0), +d(1993,9,25,18,0,0), +d(1994,4,9,19,0,0), +d(1994,9,24,18,0,0), +d(1995,4,8,19,0,0), +d(1995,9,23,18,0,0), +d(1996,4,6,19,0,0), +d(1996,9,28,18,0,0), +d(1997,3,29,21,30,0), +d(1997,10,25,20,30,0), +d(1998,3,28,21,30,0), +d(1998,10,24,20,30,0), +d(1999,3,27,21,30,0), +d(1999,10,30,20,30,0), +d(2000,3,25,21,30,0), +d(2000,10,28,20,30,0), +d(2001,3,24,21,30,0), +d(2001,10,27,20,30,0), +d(2002,3,30,21,30,0), +d(2002,10,26,20,30,0), +d(2003,3,29,21,30,0), +d(2003,10,25,20,30,0), +d(2004,3,27,21,30,0), +d(2004,10,30,20,30,0), +d(2005,3,26,21,30,0), +d(2005,8,11,18,0,0), + ] + + _transition_info = [ +i(17880,0,'LMT'), +i(18000,0,'FRUT'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(25200,3600,'FRUST'), +i(21600,0,'FRUT'), +i(21600,0,'FRUST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(18000,0,'KGT'), +i(21600,3600,'KGST'), +i(21600,0,'KGT'), + ] + +Bishkek = Bishkek() + diff --git a/vendor/pytz/zoneinfo/Asia/Brunei.py b/vendor/pytz/zoneinfo/Asia/Brunei.py new file mode 100644 index 00000000..fbbc5a0d --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Brunei.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Brunei.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Brunei(DstTzInfo): + '''Asia/Brunei timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Brunei' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1926,2,28,16,20,20), +d(1932,12,31,16,30,0), + ] + + _transition_info = [ +i(27600,0,'LMT'), +i(27000,0,'BNT'), +i(28800,0,'BNT'), + ] + +Brunei = Brunei() + diff --git a/vendor/pytz/zoneinfo/Asia/Calcutta.py b/vendor/pytz/zoneinfo/Asia/Calcutta.py new file mode 100644 index 00000000..08e3f934 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Calcutta.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Calcutta.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Calcutta(DstTzInfo): + '''Asia/Calcutta timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Calcutta' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,9,30,18,6,40), +d(1942,5,14,17,30,0), +d(1942,8,31,18,30,0), +d(1945,10,14,17,30,0), + ] + + _transition_info = [ +i(21180,0,'HMT'), +i(23400,0,'BURT'), +i(19800,0,'IST'), +i(23400,3600,'IST'), +i(19800,0,'IST'), + ] + +Calcutta = Calcutta() + diff --git a/vendor/pytz/zoneinfo/Asia/Choibalsan.py b/vendor/pytz/zoneinfo/Asia/Choibalsan.py new file mode 100644 index 00000000..406dc4a3 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Choibalsan.py @@ -0,0 +1,236 @@ +'''tzinfo timezone information for Asia/Choibalsan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Choibalsan(DstTzInfo): + '''Asia/Choibalsan timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Choibalsan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,7,31,16,22,0), +d(1977,12,31,17,0,0), +d(1983,3,31,16,0,0), +d(1983,9,30,14,0,0), +d(1984,3,31,15,0,0), +d(1984,9,29,14,0,0), +d(1985,3,30,15,0,0), +d(1985,9,28,14,0,0), +d(1986,3,29,15,0,0), +d(1986,9,27,14,0,0), +d(1987,3,28,15,0,0), +d(1987,9,26,14,0,0), +d(1988,3,26,15,0,0), +d(1988,9,24,14,0,0), +d(1989,3,25,15,0,0), +d(1989,9,23,14,0,0), +d(1990,3,24,15,0,0), +d(1990,9,29,14,0,0), +d(1991,3,30,15,0,0), +d(1991,9,28,14,0,0), +d(1992,3,28,15,0,0), +d(1992,9,26,14,0,0), +d(1993,3,27,15,0,0), +d(1993,9,25,14,0,0), +d(1994,3,26,15,0,0), +d(1994,9,24,14,0,0), +d(1995,3,25,15,0,0), +d(1995,9,23,14,0,0), +d(1996,3,30,15,0,0), +d(1996,9,28,14,0,0), +d(1997,3,29,15,0,0), +d(1997,9,27,14,0,0), +d(1998,3,28,15,0,0), +d(1998,9,26,14,0,0), +d(2001,4,27,17,0,0), +d(2001,9,28,16,0,0), +d(2002,3,29,17,0,0), +d(2002,9,27,16,0,0), +d(2003,3,28,17,0,0), +d(2003,9,26,16,0,0), +d(2004,3,26,17,0,0), +d(2004,9,24,16,0,0), +d(2005,3,25,17,0,0), +d(2005,9,23,16,0,0), +d(2006,3,24,17,0,0), +d(2006,9,29,16,0,0), +d(2007,3,30,17,0,0), +d(2007,9,28,16,0,0), +d(2008,3,28,17,0,0), +d(2008,9,26,16,0,0), +d(2009,3,27,17,0,0), +d(2009,9,25,16,0,0), +d(2010,3,26,17,0,0), +d(2010,9,24,16,0,0), +d(2011,3,25,17,0,0), +d(2011,9,23,16,0,0), +d(2012,3,30,17,0,0), +d(2012,9,28,16,0,0), +d(2013,3,29,17,0,0), +d(2013,9,27,16,0,0), +d(2014,3,28,17,0,0), +d(2014,9,26,16,0,0), +d(2015,3,27,17,0,0), +d(2015,9,25,16,0,0), +d(2016,3,25,17,0,0), +d(2016,9,23,16,0,0), +d(2017,3,24,17,0,0), +d(2017,9,29,16,0,0), +d(2018,3,30,17,0,0), +d(2018,9,28,16,0,0), +d(2019,3,29,17,0,0), +d(2019,9,27,16,0,0), +d(2020,3,27,17,0,0), +d(2020,9,25,16,0,0), +d(2021,3,26,17,0,0), +d(2021,9,24,16,0,0), +d(2022,3,25,17,0,0), +d(2022,9,23,16,0,0), +d(2023,3,24,17,0,0), +d(2023,9,29,16,0,0), +d(2024,3,29,17,0,0), +d(2024,9,27,16,0,0), +d(2025,3,28,17,0,0), +d(2025,9,26,16,0,0), +d(2026,3,27,17,0,0), +d(2026,9,25,16,0,0), +d(2027,3,26,17,0,0), +d(2027,9,24,16,0,0), +d(2028,3,24,17,0,0), +d(2028,9,29,16,0,0), +d(2029,3,30,17,0,0), +d(2029,9,28,16,0,0), +d(2030,3,29,17,0,0), +d(2030,9,27,16,0,0), +d(2031,3,28,17,0,0), +d(2031,9,26,16,0,0), +d(2032,3,26,17,0,0), +d(2032,9,24,16,0,0), +d(2033,3,25,17,0,0), +d(2033,9,23,16,0,0), +d(2034,3,24,17,0,0), +d(2034,9,29,16,0,0), +d(2035,3,30,17,0,0), +d(2035,9,28,16,0,0), +d(2036,3,28,17,0,0), +d(2036,9,26,16,0,0), +d(2037,3,27,17,0,0), +d(2037,9,25,16,0,0), + ] + + _transition_info = [ +i(27480,0,'LMT'), +i(25200,0,'ULAT'), +i(28800,0,'ULAT'), +i(36000,7200,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), +i(36000,3600,'CHOST'), +i(32400,0,'CHOT'), + ] + +Choibalsan = Choibalsan() + diff --git a/vendor/pytz/zoneinfo/Asia/Chongqing.py b/vendor/pytz/zoneinfo/Asia/Chongqing.py new file mode 100644 index 00000000..40f8f629 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Chongqing.py @@ -0,0 +1,48 @@ +'''tzinfo timezone information for Asia/Chongqing.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chongqing(DstTzInfo): + '''Asia/Chongqing timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Chongqing' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,16,53,40), +d(1980,4,30,17,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(25560,0,'LMT'), +i(25200,0,'LONT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Chongqing = Chongqing() + diff --git a/vendor/pytz/zoneinfo/Asia/Chungking.py b/vendor/pytz/zoneinfo/Asia/Chungking.py new file mode 100644 index 00000000..7f118aba --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Chungking.py @@ -0,0 +1,48 @@ +'''tzinfo timezone information for Asia/Chungking.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chungking(DstTzInfo): + '''Asia/Chungking timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Chungking' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,16,53,40), +d(1980,4,30,17,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(25560,0,'LMT'), +i(25200,0,'LONT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Chungking = Chungking() + diff --git a/vendor/pytz/zoneinfo/Asia/Colombo.py b/vendor/pytz/zoneinfo/Asia/Colombo.py new file mode 100644 index 00000000..2ac7c70a --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Colombo.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Asia/Colombo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Colombo(DstTzInfo): + '''Asia/Colombo timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Colombo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,12,31,18,40,28), +d(1942,1,4,18,30,0), +d(1942,8,31,18,0,0), +d(1945,10,15,19,30,0), +d(1996,5,24,18,30,0), +d(1996,10,25,18,0,0), +d(2006,4,14,18,30,0), + ] + + _transition_info = [ +i(19200,0,'MMT'), +i(19800,0,'IST'), +i(21600,1800,'IHST'), +i(23400,3600,'IST'), +i(19800,0,'IST'), +i(23400,0,'LKT'), +i(21600,0,'LKT'), +i(19800,0,'IST'), + ] + +Colombo = Colombo() + diff --git a/vendor/pytz/zoneinfo/Asia/Dacca.py b/vendor/pytz/zoneinfo/Asia/Dacca.py new file mode 100644 index 00000000..3093a3a4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Dacca.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Asia/Dacca.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dacca(DstTzInfo): + '''Asia/Dacca timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Dacca' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,9,30,18,6,40), +d(1942,5,14,17,30,0), +d(1942,8,31,18,30,0), +d(1951,9,29,17,30,0), +d(1971,3,25,18,0,0), + ] + + _transition_info = [ +i(21180,0,'HMT'), +i(23400,0,'BURT'), +i(19800,0,'IST'), +i(23400,0,'BURT'), +i(21600,0,'DACT'), +i(21600,0,'BDT'), + ] + +Dacca = Dacca() + diff --git a/vendor/pytz/zoneinfo/Asia/Damascus.py b/vendor/pytz/zoneinfo/Asia/Damascus.py new file mode 100644 index 00000000..98164e03 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Damascus.py @@ -0,0 +1,322 @@ +'''tzinfo timezone information for Asia/Damascus.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Damascus(DstTzInfo): + '''Asia/Damascus timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Damascus' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,21,34,48), +d(1920,4,18,0,0,0), +d(1920,10,2,23,0,0), +d(1921,4,17,0,0,0), +d(1921,10,1,23,0,0), +d(1922,4,16,0,0,0), +d(1922,9,30,23,0,0), +d(1923,4,15,0,0,0), +d(1923,10,6,23,0,0), +d(1962,4,29,0,0,0), +d(1962,9,30,23,0,0), +d(1963,5,1,0,0,0), +d(1963,9,29,23,0,0), +d(1964,5,1,0,0,0), +d(1964,9,30,23,0,0), +d(1965,5,1,0,0,0), +d(1965,9,29,23,0,0), +d(1966,4,24,0,0,0), +d(1966,9,30,23,0,0), +d(1967,5,1,0,0,0), +d(1967,9,30,23,0,0), +d(1968,5,1,0,0,0), +d(1968,9,30,23,0,0), +d(1969,5,1,0,0,0), +d(1969,9,30,23,0,0), +d(1970,5,1,0,0,0), +d(1970,9,30,23,0,0), +d(1971,5,1,0,0,0), +d(1971,9,30,23,0,0), +d(1972,5,1,0,0,0), +d(1972,9,30,23,0,0), +d(1973,5,1,0,0,0), +d(1973,9,30,23,0,0), +d(1974,5,1,0,0,0), +d(1974,9,30,23,0,0), +d(1975,5,1,0,0,0), +d(1975,9,30,23,0,0), +d(1976,5,1,0,0,0), +d(1976,9,30,23,0,0), +d(1977,5,1,0,0,0), +d(1977,8,31,23,0,0), +d(1978,5,1,0,0,0), +d(1978,8,31,23,0,0), +d(1983,4,9,0,0,0), +d(1983,9,30,23,0,0), +d(1984,4,9,0,0,0), +d(1984,9,30,23,0,0), +d(1986,2,16,0,0,0), +d(1986,10,8,23,0,0), +d(1987,3,1,0,0,0), +d(1987,10,30,23,0,0), +d(1988,3,15,0,0,0), +d(1988,10,30,23,0,0), +d(1989,3,31,0,0,0), +d(1989,9,30,23,0,0), +d(1990,4,1,0,0,0), +d(1990,9,29,23,0,0), +d(1991,3,31,22,0,0), +d(1991,9,30,21,0,0), +d(1992,4,7,22,0,0), +d(1992,9,30,21,0,0), +d(1993,3,25,22,0,0), +d(1993,9,24,21,0,0), +d(1994,3,31,22,0,0), +d(1994,9,30,21,0,0), +d(1995,3,31,22,0,0), +d(1995,9,30,21,0,0), +d(1996,3,31,22,0,0), +d(1996,9,30,21,0,0), +d(1997,3,30,22,0,0), +d(1997,9,30,21,0,0), +d(1998,3,29,22,0,0), +d(1998,9,30,21,0,0), +d(1999,3,31,22,0,0), +d(1999,9,30,21,0,0), +d(2000,3,31,22,0,0), +d(2000,9,30,21,0,0), +d(2001,3,31,22,0,0), +d(2001,9,30,21,0,0), +d(2002,3,31,22,0,0), +d(2002,9,30,21,0,0), +d(2003,3,31,22,0,0), +d(2003,9,30,21,0,0), +d(2004,3,31,22,0,0), +d(2004,9,30,21,0,0), +d(2005,3,31,22,0,0), +d(2005,9,30,21,0,0), +d(2006,3,31,22,0,0), +d(2006,9,21,21,0,0), +d(2007,3,31,22,0,0), +d(2007,9,30,21,0,0), +d(2008,3,31,22,0,0), +d(2008,9,30,21,0,0), +d(2009,3,31,22,0,0), +d(2009,9,30,21,0,0), +d(2010,3,31,22,0,0), +d(2010,9,30,21,0,0), +d(2011,3,31,22,0,0), +d(2011,9,30,21,0,0), +d(2012,3,31,22,0,0), +d(2012,9,30,21,0,0), +d(2013,3,31,22,0,0), +d(2013,9,30,21,0,0), +d(2014,3,31,22,0,0), +d(2014,9,30,21,0,0), +d(2015,3,31,22,0,0), +d(2015,9,30,21,0,0), +d(2016,3,31,22,0,0), +d(2016,9,30,21,0,0), +d(2017,3,31,22,0,0), +d(2017,9,30,21,0,0), +d(2018,3,31,22,0,0), +d(2018,9,30,21,0,0), +d(2019,3,31,22,0,0), +d(2019,9,30,21,0,0), +d(2020,3,31,22,0,0), +d(2020,9,30,21,0,0), +d(2021,3,31,22,0,0), +d(2021,9,30,21,0,0), +d(2022,3,31,22,0,0), +d(2022,9,30,21,0,0), +d(2023,3,31,22,0,0), +d(2023,9,30,21,0,0), +d(2024,3,31,22,0,0), +d(2024,9,30,21,0,0), +d(2025,3,31,22,0,0), +d(2025,9,30,21,0,0), +d(2026,3,31,22,0,0), +d(2026,9,30,21,0,0), +d(2027,3,31,22,0,0), +d(2027,9,30,21,0,0), +d(2028,3,31,22,0,0), +d(2028,9,30,21,0,0), +d(2029,3,31,22,0,0), +d(2029,9,30,21,0,0), +d(2030,3,31,22,0,0), +d(2030,9,30,21,0,0), +d(2031,3,31,22,0,0), +d(2031,9,30,21,0,0), +d(2032,3,31,22,0,0), +d(2032,9,30,21,0,0), +d(2033,3,31,22,0,0), +d(2033,9,30,21,0,0), +d(2034,3,31,22,0,0), +d(2034,9,30,21,0,0), +d(2035,3,31,22,0,0), +d(2035,9,30,21,0,0), +d(2036,3,31,22,0,0), +d(2036,9,30,21,0,0), +d(2037,3,31,22,0,0), +d(2037,9,30,21,0,0), + ] + + _transition_info = [ +i(8700,0,'LMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Damascus = Damascus() + diff --git a/vendor/pytz/zoneinfo/Asia/Dhaka.py b/vendor/pytz/zoneinfo/Asia/Dhaka.py new file mode 100644 index 00000000..7ccd4d55 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Dhaka.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Asia/Dhaka.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dhaka(DstTzInfo): + '''Asia/Dhaka timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Dhaka' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,9,30,18,6,40), +d(1942,5,14,17,30,0), +d(1942,8,31,18,30,0), +d(1951,9,29,17,30,0), +d(1971,3,25,18,0,0), + ] + + _transition_info = [ +i(21180,0,'HMT'), +i(23400,0,'BURT'), +i(19800,0,'IST'), +i(23400,0,'BURT'), +i(21600,0,'DACT'), +i(21600,0,'BDT'), + ] + +Dhaka = Dhaka() + diff --git a/vendor/pytz/zoneinfo/Asia/Dili.py b/vendor/pytz/zoneinfo/Asia/Dili.py new file mode 100644 index 00000000..75b8df61 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Dili.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Asia/Dili.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dili(DstTzInfo): + '''Asia/Dili timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Dili' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,15,37,40), +d(1942,2,21,15,0,0), +d(1945,7,31,15,0,0), +d(1976,5,2,15,0,0), +d(2000,9,16,16,0,0), + ] + + _transition_info = [ +i(30120,0,'LMT'), +i(28800,0,'TLT'), +i(32400,0,'JST'), +i(32400,0,'TLT'), +i(28800,0,'CIT'), +i(32400,0,'TLT'), + ] + +Dili = Dili() + diff --git a/vendor/pytz/zoneinfo/Asia/Dubai.py b/vendor/pytz/zoneinfo/Asia/Dubai.py new file mode 100644 index 00000000..7bb7471c --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Dubai.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Dubai.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dubai(DstTzInfo): + '''Asia/Dubai timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Dubai' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,20,18,48), + ] + + _transition_info = [ +i(13260,0,'LMT'), +i(14400,0,'GST'), + ] + +Dubai = Dubai() + diff --git a/vendor/pytz/zoneinfo/Asia/Dushanbe.py b/vendor/pytz/zoneinfo/Asia/Dushanbe.py new file mode 100644 index 00000000..4c2eb7c8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Dushanbe.py @@ -0,0 +1,68 @@ +'''tzinfo timezone information for Asia/Dushanbe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dushanbe(DstTzInfo): + '''Asia/Dushanbe timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Dushanbe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,19,24,48), +d(1930,6,20,19,0,0), +d(1981,3,31,18,0,0), +d(1981,9,30,17,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,17,0,0), +d(1983,3,31,18,0,0), +d(1983,9,30,17,0,0), +d(1984,3,31,18,0,0), +d(1984,9,29,20,0,0), +d(1985,3,30,20,0,0), +d(1985,9,28,20,0,0), +d(1986,3,29,20,0,0), +d(1986,9,27,20,0,0), +d(1987,3,28,20,0,0), +d(1987,9,26,20,0,0), +d(1988,3,26,20,0,0), +d(1988,9,24,20,0,0), +d(1989,3,25,20,0,0), +d(1989,9,23,20,0,0), +d(1990,3,24,20,0,0), +d(1990,9,29,20,0,0), +d(1991,3,30,20,0,0), +d(1991,9,8,21,0,0), + ] + + _transition_info = [ +i(16500,0,'LMT'), +i(18000,0,'DUST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(25200,3600,'DUSST'), +i(21600,0,'DUST'), +i(21600,0,'DUSST'), +i(18000,0,'TJT'), + ] + +Dushanbe = Dushanbe() + diff --git a/vendor/pytz/zoneinfo/Asia/Gaza.py b/vendor/pytz/zoneinfo/Asia/Gaza.py new file mode 100644 index 00000000..4069e226 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Gaza.py @@ -0,0 +1,308 @@ +'''tzinfo timezone information for Asia/Gaza.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Gaza(DstTzInfo): + '''Asia/Gaza timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Gaza' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,5,31,22,0,0), +d(1942,10,31,21,0,0), +d(1943,4,1,0,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,23,0,0), +d(1946,4,16,0,0,0), +d(1946,10,31,21,0,0), +d(1957,5,9,22,0,0), +d(1957,9,30,21,0,0), +d(1958,4,30,22,0,0), +d(1958,9,30,21,0,0), +d(1959,4,30,23,0,0), +d(1959,9,30,0,0,0), +d(1960,4,30,23,0,0), +d(1960,9,30,0,0,0), +d(1961,4,30,23,0,0), +d(1961,9,30,0,0,0), +d(1962,4,30,23,0,0), +d(1962,9,30,0,0,0), +d(1963,4,30,23,0,0), +d(1963,9,30,0,0,0), +d(1964,4,30,23,0,0), +d(1964,9,30,0,0,0), +d(1965,4,30,23,0,0), +d(1965,9,30,0,0,0), +d(1966,4,30,23,0,0), +d(1966,10,1,0,0,0), +d(1967,4,30,23,0,0), +d(1967,6,4,21,0,0), +d(1974,7,6,22,0,0), +d(1974,10,12,21,0,0), +d(1975,4,19,22,0,0), +d(1975,8,30,21,0,0), +d(1985,4,13,22,0,0), +d(1985,9,14,21,0,0), +d(1986,5,17,22,0,0), +d(1986,9,6,21,0,0), +d(1987,4,14,22,0,0), +d(1987,9,12,21,0,0), +d(1988,4,8,22,0,0), +d(1988,9,2,21,0,0), +d(1989,4,29,22,0,0), +d(1989,9,2,21,0,0), +d(1990,3,24,22,0,0), +d(1990,8,25,21,0,0), +d(1991,3,23,22,0,0), +d(1991,8,31,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,5,21,0,0), +d(1993,4,1,22,0,0), +d(1993,9,4,21,0,0), +d(1994,3,31,22,0,0), +d(1994,8,27,21,0,0), +d(1995,3,30,22,0,0), +d(1995,9,2,21,0,0), +d(1995,12,31,22,0,0), +d(1996,4,4,22,0,0), +d(1996,9,19,22,0,0), +d(1997,4,3,22,0,0), +d(1997,9,18,22,0,0), +d(1998,4,2,22,0,0), +d(1998,9,17,22,0,0), +d(1998,12,31,22,0,0), +d(1999,4,15,22,0,0), +d(1999,10,14,21,0,0), +d(2000,4,20,22,0,0), +d(2000,10,19,21,0,0), +d(2001,4,19,22,0,0), +d(2001,10,18,21,0,0), +d(2002,4,18,22,0,0), +d(2002,10,17,21,0,0), +d(2003,4,17,22,0,0), +d(2003,10,16,21,0,0), +d(2004,4,15,22,0,0), +d(2004,9,30,22,0,0), +d(2005,4,14,22,0,0), +d(2005,10,3,23,0,0), +d(2006,3,31,22,0,0), +d(2006,9,21,21,0,0), +d(2007,3,31,22,0,0), +d(2007,10,18,21,0,0), +d(2008,3,31,22,0,0), +d(2008,10,16,21,0,0), +d(2009,3,31,22,0,0), +d(2009,10,15,21,0,0), +d(2010,3,31,22,0,0), +d(2010,10,14,21,0,0), +d(2011,3,31,22,0,0), +d(2011,10,20,21,0,0), +d(2012,3,31,22,0,0), +d(2012,10,18,21,0,0), +d(2013,3,31,22,0,0), +d(2013,10,17,21,0,0), +d(2014,3,31,22,0,0), +d(2014,10,16,21,0,0), +d(2015,3,31,22,0,0), +d(2015,10,15,21,0,0), +d(2016,3,31,22,0,0), +d(2016,10,20,21,0,0), +d(2017,3,31,22,0,0), +d(2017,10,19,21,0,0), +d(2018,3,31,22,0,0), +d(2018,10,18,21,0,0), +d(2019,3,31,22,0,0), +d(2019,10,17,21,0,0), +d(2020,3,31,22,0,0), +d(2020,10,15,21,0,0), +d(2021,3,31,22,0,0), +d(2021,10,14,21,0,0), +d(2022,3,31,22,0,0), +d(2022,10,20,21,0,0), +d(2023,3,31,22,0,0), +d(2023,10,19,21,0,0), +d(2024,3,31,22,0,0), +d(2024,10,17,21,0,0), +d(2025,3,31,22,0,0), +d(2025,10,16,21,0,0), +d(2026,3,31,22,0,0), +d(2026,10,15,21,0,0), +d(2027,3,31,22,0,0), +d(2027,10,14,21,0,0), +d(2028,3,31,22,0,0), +d(2028,10,19,21,0,0), +d(2029,3,31,22,0,0), +d(2029,10,18,21,0,0), +d(2030,3,31,22,0,0), +d(2030,10,17,21,0,0), +d(2031,3,31,22,0,0), +d(2031,10,16,21,0,0), +d(2032,3,31,22,0,0), +d(2032,10,14,21,0,0), +d(2033,3,31,22,0,0), +d(2033,10,20,21,0,0), +d(2034,3,31,22,0,0), +d(2034,10,19,21,0,0), +d(2035,3,31,22,0,0), +d(2035,10,18,21,0,0), +d(2036,3,31,22,0,0), +d(2036,10,16,21,0,0), +d(2037,3,31,22,0,0), +d(2037,10,15,21,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(10800,3600,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Gaza = Gaza() + diff --git a/vendor/pytz/zoneinfo/Asia/Harbin.py b/vendor/pytz/zoneinfo/Asia/Harbin.py new file mode 100644 index 00000000..86941384 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Harbin.py @@ -0,0 +1,54 @@ +'''tzinfo timezone information for Asia/Harbin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Harbin(DstTzInfo): + '''Asia/Harbin timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Harbin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,15,33,16), +d(1932,2,29,15,30,0), +d(1939,12,31,16,0,0), +d(1966,4,30,15,0,0), +d(1980,4,30,15,30,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(30420,0,'LMT'), +i(30600,0,'CHAT'), +i(28800,0,'CST'), +i(32400,0,'CHAT'), +i(30600,0,'CHAT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Harbin = Harbin() + diff --git a/vendor/pytz/zoneinfo/Asia/Hong_Kong.py b/vendor/pytz/zoneinfo/Asia/Hong_Kong.py new file mode 100644 index 00000000..a17dfbef --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Hong_Kong.py @@ -0,0 +1,158 @@ +'''tzinfo timezone information for Asia/Hong_Kong.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hong_Kong(DstTzInfo): + '''Asia/Hong_Kong timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Hong_Kong' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,10,29,16,23,24), +d(1946,4,19,19,30,0), +d(1946,11,30,18,30,0), +d(1947,4,12,19,30,0), +d(1947,12,29,18,30,0), +d(1948,5,1,19,30,0), +d(1948,10,30,18,30,0), +d(1949,4,2,19,30,0), +d(1949,10,29,18,30,0), +d(1950,4,1,19,30,0), +d(1950,10,28,18,30,0), +d(1951,3,31,19,30,0), +d(1951,10,27,18,30,0), +d(1952,4,5,19,30,0), +d(1952,10,25,18,30,0), +d(1953,4,4,19,30,0), +d(1953,10,31,18,30,0), +d(1954,3,20,19,30,0), +d(1954,10,30,18,30,0), +d(1955,3,19,19,30,0), +d(1955,11,5,18,30,0), +d(1956,3,17,19,30,0), +d(1956,11,3,18,30,0), +d(1957,3,23,19,30,0), +d(1957,11,2,18,30,0), +d(1958,3,22,19,30,0), +d(1958,11,1,18,30,0), +d(1959,3,21,19,30,0), +d(1959,10,31,18,30,0), +d(1960,3,19,19,30,0), +d(1960,11,5,18,30,0), +d(1961,3,18,19,30,0), +d(1961,11,4,18,30,0), +d(1962,3,17,19,30,0), +d(1962,11,3,18,30,0), +d(1963,3,23,19,30,0), +d(1963,11,2,18,30,0), +d(1964,3,21,19,30,0), +d(1964,10,31,18,30,0), +d(1965,4,17,19,30,0), +d(1965,10,16,18,30,0), +d(1966,4,16,19,30,0), +d(1966,10,15,18,30,0), +d(1967,4,15,19,30,0), +d(1967,10,21,18,30,0), +d(1968,4,20,19,30,0), +d(1968,10,19,18,30,0), +d(1969,4,19,19,30,0), +d(1969,10,18,18,30,0), +d(1970,4,18,19,30,0), +d(1970,10,17,18,30,0), +d(1971,4,17,19,30,0), +d(1971,10,16,18,30,0), +d(1972,4,15,19,30,0), +d(1972,10,21,18,30,0), +d(1973,4,21,19,30,0), +d(1973,10,20,18,30,0), +d(1974,4,20,19,30,0), +d(1974,10,19,18,30,0), +d(1975,4,19,19,30,0), +d(1975,10,18,18,30,0), +d(1976,4,17,19,30,0), +d(1976,10,16,18,30,0), +d(1977,4,16,19,30,0), +d(1977,10,15,18,30,0), +d(1979,5,12,19,30,0), +d(1979,10,20,18,30,0), +d(1980,5,10,19,30,0), +d(1980,10,18,18,30,0), + ] + + _transition_info = [ +i(27420,0,'LMT'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), + ] + +Hong_Kong = Hong_Kong() + diff --git a/vendor/pytz/zoneinfo/Asia/Hovd.py b/vendor/pytz/zoneinfo/Asia/Hovd.py new file mode 100644 index 00000000..06d24333 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Hovd.py @@ -0,0 +1,236 @@ +'''tzinfo timezone information for Asia/Hovd.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hovd(DstTzInfo): + '''Asia/Hovd timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Hovd' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,7,31,17,53,24), +d(1977,12,31,18,0,0), +d(1983,3,31,17,0,0), +d(1983,9,30,16,0,0), +d(1984,3,31,17,0,0), +d(1984,9,29,16,0,0), +d(1985,3,30,17,0,0), +d(1985,9,28,16,0,0), +d(1986,3,29,17,0,0), +d(1986,9,27,16,0,0), +d(1987,3,28,17,0,0), +d(1987,9,26,16,0,0), +d(1988,3,26,17,0,0), +d(1988,9,24,16,0,0), +d(1989,3,25,17,0,0), +d(1989,9,23,16,0,0), +d(1990,3,24,17,0,0), +d(1990,9,29,16,0,0), +d(1991,3,30,17,0,0), +d(1991,9,28,16,0,0), +d(1992,3,28,17,0,0), +d(1992,9,26,16,0,0), +d(1993,3,27,17,0,0), +d(1993,9,25,16,0,0), +d(1994,3,26,17,0,0), +d(1994,9,24,16,0,0), +d(1995,3,25,17,0,0), +d(1995,9,23,16,0,0), +d(1996,3,30,17,0,0), +d(1996,9,28,16,0,0), +d(1997,3,29,17,0,0), +d(1997,9,27,16,0,0), +d(1998,3,28,17,0,0), +d(1998,9,26,16,0,0), +d(2001,4,27,19,0,0), +d(2001,9,28,18,0,0), +d(2002,3,29,19,0,0), +d(2002,9,27,18,0,0), +d(2003,3,28,19,0,0), +d(2003,9,26,18,0,0), +d(2004,3,26,19,0,0), +d(2004,9,24,18,0,0), +d(2005,3,25,19,0,0), +d(2005,9,23,18,0,0), +d(2006,3,24,19,0,0), +d(2006,9,29,18,0,0), +d(2007,3,30,19,0,0), +d(2007,9,28,18,0,0), +d(2008,3,28,19,0,0), +d(2008,9,26,18,0,0), +d(2009,3,27,19,0,0), +d(2009,9,25,18,0,0), +d(2010,3,26,19,0,0), +d(2010,9,24,18,0,0), +d(2011,3,25,19,0,0), +d(2011,9,23,18,0,0), +d(2012,3,30,19,0,0), +d(2012,9,28,18,0,0), +d(2013,3,29,19,0,0), +d(2013,9,27,18,0,0), +d(2014,3,28,19,0,0), +d(2014,9,26,18,0,0), +d(2015,3,27,19,0,0), +d(2015,9,25,18,0,0), +d(2016,3,25,19,0,0), +d(2016,9,23,18,0,0), +d(2017,3,24,19,0,0), +d(2017,9,29,18,0,0), +d(2018,3,30,19,0,0), +d(2018,9,28,18,0,0), +d(2019,3,29,19,0,0), +d(2019,9,27,18,0,0), +d(2020,3,27,19,0,0), +d(2020,9,25,18,0,0), +d(2021,3,26,19,0,0), +d(2021,9,24,18,0,0), +d(2022,3,25,19,0,0), +d(2022,9,23,18,0,0), +d(2023,3,24,19,0,0), +d(2023,9,29,18,0,0), +d(2024,3,29,19,0,0), +d(2024,9,27,18,0,0), +d(2025,3,28,19,0,0), +d(2025,9,26,18,0,0), +d(2026,3,27,19,0,0), +d(2026,9,25,18,0,0), +d(2027,3,26,19,0,0), +d(2027,9,24,18,0,0), +d(2028,3,24,19,0,0), +d(2028,9,29,18,0,0), +d(2029,3,30,19,0,0), +d(2029,9,28,18,0,0), +d(2030,3,29,19,0,0), +d(2030,9,27,18,0,0), +d(2031,3,28,19,0,0), +d(2031,9,26,18,0,0), +d(2032,3,26,19,0,0), +d(2032,9,24,18,0,0), +d(2033,3,25,19,0,0), +d(2033,9,23,18,0,0), +d(2034,3,24,19,0,0), +d(2034,9,29,18,0,0), +d(2035,3,30,19,0,0), +d(2035,9,28,18,0,0), +d(2036,3,28,19,0,0), +d(2036,9,26,18,0,0), +d(2037,3,27,19,0,0), +d(2037,9,25,18,0,0), + ] + + _transition_info = [ +i(22020,0,'LMT'), +i(21600,0,'HOVT'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), +i(28800,3600,'HOVST'), +i(25200,0,'HOVT'), + ] + +Hovd = Hovd() + diff --git a/vendor/pytz/zoneinfo/Asia/Irkutsk.py b/vendor/pytz/zoneinfo/Asia/Irkutsk.py new file mode 100644 index 00000000..8836f46d --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Irkutsk.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Irkutsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Irkutsk(DstTzInfo): + '''Asia/Irkutsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Irkutsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,1,24,17,2,40), +d(1930,6,20,17,0,0), +d(1981,3,31,16,0,0), +d(1981,9,30,15,0,0), +d(1982,3,31,16,0,0), +d(1982,9,30,15,0,0), +d(1983,3,31,16,0,0), +d(1983,9,30,15,0,0), +d(1984,3,31,16,0,0), +d(1984,9,29,18,0,0), +d(1985,3,30,18,0,0), +d(1985,9,28,18,0,0), +d(1986,3,29,18,0,0), +d(1986,9,27,18,0,0), +d(1987,3,28,18,0,0), +d(1987,9,26,18,0,0), +d(1988,3,26,18,0,0), +d(1988,9,24,18,0,0), +d(1989,3,25,18,0,0), +d(1989,9,23,18,0,0), +d(1990,3,24,18,0,0), +d(1990,9,29,18,0,0), +d(1991,3,30,18,0,0), +d(1991,9,28,19,0,0), +d(1992,1,18,19,0,0), +d(1992,3,28,15,0,0), +d(1992,9,26,14,0,0), +d(1993,3,27,18,0,0), +d(1993,9,25,18,0,0), +d(1994,3,26,18,0,0), +d(1994,9,24,18,0,0), +d(1995,3,25,18,0,0), +d(1995,9,23,18,0,0), +d(1996,3,30,18,0,0), +d(1996,10,26,18,0,0), +d(1997,3,29,18,0,0), +d(1997,10,25,18,0,0), +d(1998,3,28,18,0,0), +d(1998,10,24,18,0,0), +d(1999,3,27,18,0,0), +d(1999,10,30,18,0,0), +d(2000,3,25,18,0,0), +d(2000,10,28,18,0,0), +d(2001,3,24,18,0,0), +d(2001,10,27,18,0,0), +d(2002,3,30,18,0,0), +d(2002,10,26,18,0,0), +d(2003,3,29,18,0,0), +d(2003,10,25,18,0,0), +d(2004,3,27,18,0,0), +d(2004,10,30,18,0,0), +d(2005,3,26,18,0,0), +d(2005,10,29,18,0,0), +d(2006,3,25,18,0,0), +d(2006,10,28,18,0,0), +d(2007,3,24,18,0,0), +d(2007,10,27,18,0,0), +d(2008,3,29,18,0,0), +d(2008,10,25,18,0,0), +d(2009,3,28,18,0,0), +d(2009,10,24,18,0,0), +d(2010,3,27,18,0,0), +d(2010,10,30,18,0,0), +d(2011,3,26,18,0,0), +d(2011,10,29,18,0,0), +d(2012,3,24,18,0,0), +d(2012,10,27,18,0,0), +d(2013,3,30,18,0,0), +d(2013,10,26,18,0,0), +d(2014,3,29,18,0,0), +d(2014,10,25,18,0,0), +d(2015,3,28,18,0,0), +d(2015,10,24,18,0,0), +d(2016,3,26,18,0,0), +d(2016,10,29,18,0,0), +d(2017,3,25,18,0,0), +d(2017,10,28,18,0,0), +d(2018,3,24,18,0,0), +d(2018,10,27,18,0,0), +d(2019,3,30,18,0,0), +d(2019,10,26,18,0,0), +d(2020,3,28,18,0,0), +d(2020,10,24,18,0,0), +d(2021,3,27,18,0,0), +d(2021,10,30,18,0,0), +d(2022,3,26,18,0,0), +d(2022,10,29,18,0,0), +d(2023,3,25,18,0,0), +d(2023,10,28,18,0,0), +d(2024,3,30,18,0,0), +d(2024,10,26,18,0,0), +d(2025,3,29,18,0,0), +d(2025,10,25,18,0,0), +d(2026,3,28,18,0,0), +d(2026,10,24,18,0,0), +d(2027,3,27,18,0,0), +d(2027,10,30,18,0,0), +d(2028,3,25,18,0,0), +d(2028,10,28,18,0,0), +d(2029,3,24,18,0,0), +d(2029,10,27,18,0,0), +d(2030,3,30,18,0,0), +d(2030,10,26,18,0,0), +d(2031,3,29,18,0,0), +d(2031,10,25,18,0,0), +d(2032,3,27,18,0,0), +d(2032,10,30,18,0,0), +d(2033,3,26,18,0,0), +d(2033,10,29,18,0,0), +d(2034,3,25,18,0,0), +d(2034,10,28,18,0,0), +d(2035,3,24,18,0,0), +d(2035,10,27,18,0,0), +d(2036,3,29,18,0,0), +d(2036,10,25,18,0,0), +d(2037,3,28,18,0,0), +d(2037,10,24,18,0,0), + ] + + _transition_info = [ +i(25020,0,'IMT'), +i(25200,0,'IRKT'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(28800,0,'IRKST'), +i(25200,0,'IRKT'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), +i(32400,3600,'IRKST'), +i(28800,0,'IRKT'), + ] + +Irkutsk = Irkutsk() + diff --git a/vendor/pytz/zoneinfo/Asia/Istanbul.py b/vendor/pytz/zoneinfo/Asia/Istanbul.py new file mode 100644 index 00000000..fb5f8b6d --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Istanbul.py @@ -0,0 +1,362 @@ +'''tzinfo timezone information for Asia/Istanbul.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Istanbul(DstTzInfo): + '''Asia/Istanbul timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Istanbul' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,9,30,22,3,4), +d(1916,4,30,22,0,0), +d(1916,9,30,21,0,0), +d(1920,3,27,22,0,0), +d(1920,10,24,21,0,0), +d(1921,4,2,22,0,0), +d(1921,10,2,21,0,0), +d(1922,3,25,22,0,0), +d(1922,10,7,21,0,0), +d(1924,5,12,22,0,0), +d(1924,9,30,21,0,0), +d(1925,4,30,22,0,0), +d(1925,9,30,21,0,0), +d(1940,6,29,22,0,0), +d(1940,10,4,21,0,0), +d(1940,11,30,22,0,0), +d(1941,9,20,21,0,0), +d(1942,3,31,22,0,0), +d(1942,10,31,21,0,0), +d(1945,4,1,22,0,0), +d(1945,10,7,21,0,0), +d(1946,5,31,22,0,0), +d(1946,9,30,21,0,0), +d(1947,4,19,22,0,0), +d(1947,10,4,21,0,0), +d(1948,4,17,22,0,0), +d(1948,10,2,21,0,0), +d(1949,4,9,22,0,0), +d(1949,10,1,21,0,0), +d(1950,4,18,22,0,0), +d(1950,10,7,21,0,0), +d(1951,4,21,22,0,0), +d(1951,10,7,21,0,0), +d(1962,7,14,22,0,0), +d(1962,10,7,21,0,0), +d(1964,5,14,22,0,0), +d(1964,9,30,21,0,0), +d(1970,5,2,22,0,0), +d(1970,10,3,21,0,0), +d(1971,5,1,22,0,0), +d(1971,10,2,21,0,0), +d(1972,5,6,22,0,0), +d(1972,10,7,21,0,0), +d(1973,6,2,23,0,0), +d(1973,11,4,0,0,0), +d(1974,3,31,0,0,0), +d(1974,11,3,2,0,0), +d(1975,3,29,22,0,0), +d(1975,10,25,21,0,0), +d(1976,5,31,22,0,0), +d(1976,10,30,21,0,0), +d(1977,4,2,22,0,0), +d(1977,10,15,21,0,0), +d(1978,4,1,22,0,0), +d(1978,10,14,21,0,0), +d(1979,10,14,20,0,0), +d(1980,4,6,0,0,0), +d(1980,10,12,20,0,0), +d(1981,3,29,0,0,0), +d(1981,10,11,20,0,0), +d(1982,3,28,0,0,0), +d(1982,10,10,20,0,0), +d(1983,7,30,21,0,0), +d(1983,10,1,20,0,0), +d(1985,4,19,21,0,0), +d(1985,9,27,21,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1988,3,27,0,0,0), +d(1988,9,25,0,0,0), +d(1989,3,26,0,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1990,12,31,22,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7020,0,'IMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(14400,7200,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Istanbul = Istanbul() + diff --git a/vendor/pytz/zoneinfo/Asia/Jakarta.py b/vendor/pytz/zoneinfo/Asia/Jakarta.py new file mode 100644 index 00000000..27a42113 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Jakarta.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Asia/Jakarta.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jakarta(DstTzInfo): + '''Asia/Jakarta timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Jakarta' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1923,12,31,16,40,0), +d(1932,10,31,16,40,0), +d(1942,3,22,16,30,0), +d(1945,7,31,15,0,0), +d(1948,4,30,16,30,0), +d(1950,4,30,16,0,0), +d(1963,12,31,16,30,0), + ] + + _transition_info = [ +i(25620,0,'JMT'), +i(26400,0,'JAVT'), +i(27000,0,'WIT'), +i(32400,0,'JST'), +i(27000,0,'WIT'), +i(28800,0,'WIT'), +i(27000,0,'WIT'), +i(25200,0,'WIT'), + ] + +Jakarta = Jakarta() + diff --git a/vendor/pytz/zoneinfo/Asia/Jayapura.py b/vendor/pytz/zoneinfo/Asia/Jayapura.py new file mode 100644 index 00000000..c8760780 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Jayapura.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Asia/Jayapura.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jayapura(DstTzInfo): + '''Asia/Jayapura timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Jayapura' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1932,10,31,14,37,12), +d(1943,12,31,15,0,0), +d(1963,12,31,14,30,0), + ] + + _transition_info = [ +i(33780,0,'LMT'), +i(32400,0,'EIT'), +i(34200,0,'CST'), +i(32400,0,'EIT'), + ] + +Jayapura = Jayapura() + diff --git a/vendor/pytz/zoneinfo/Asia/Jerusalem.py b/vendor/pytz/zoneinfo/Asia/Jerusalem.py new file mode 100644 index 00000000..cf3af693 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Jerusalem.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for Asia/Jerusalem.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jerusalem(DstTzInfo): + '''Asia/Jerusalem timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Jerusalem' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,12,31,21,39,20), +d(1940,5,31,22,0,0), +d(1942,10,31,21,0,0), +d(1943,4,1,0,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,23,0,0), +d(1946,4,16,0,0,0), +d(1946,10,31,21,0,0), +d(1948,5,22,22,0,0), +d(1948,8,31,20,0,0), +d(1948,10,31,23,0,0), +d(1949,4,30,22,0,0), +d(1949,10,31,23,0,0), +d(1950,4,15,22,0,0), +d(1950,9,15,0,0,0), +d(1951,3,31,22,0,0), +d(1951,11,11,0,0,0), +d(1952,4,20,0,0,0), +d(1952,10,19,0,0,0), +d(1953,4,12,0,0,0), +d(1953,9,13,0,0,0), +d(1954,6,12,22,0,0), +d(1954,9,11,21,0,0), +d(1955,6,11,0,0,0), +d(1955,9,10,21,0,0), +d(1956,6,2,22,0,0), +d(1956,9,30,0,0,0), +d(1957,4,29,0,0,0), +d(1957,9,21,21,0,0), +d(1974,7,6,22,0,0), +d(1974,10,12,21,0,0), +d(1975,4,19,22,0,0), +d(1975,8,30,21,0,0), +d(1985,4,13,22,0,0), +d(1985,9,14,21,0,0), +d(1986,5,17,22,0,0), +d(1986,9,6,21,0,0), +d(1987,4,14,22,0,0), +d(1987,9,12,21,0,0), +d(1988,4,8,22,0,0), +d(1988,9,2,21,0,0), +d(1989,4,29,22,0,0), +d(1989,9,2,21,0,0), +d(1990,3,24,22,0,0), +d(1990,8,25,21,0,0), +d(1991,3,23,22,0,0), +d(1991,8,31,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,5,21,0,0), +d(1993,4,1,22,0,0), +d(1993,9,4,21,0,0), +d(1994,3,31,22,0,0), +d(1994,8,27,21,0,0), +d(1995,3,30,22,0,0), +d(1995,9,2,21,0,0), +d(1996,3,14,22,0,0), +d(1996,9,15,21,0,0), +d(1997,3,20,22,0,0), +d(1997,9,13,21,0,0), +d(1998,3,19,22,0,0), +d(1998,9,5,21,0,0), +d(1999,4,2,0,0,0), +d(1999,9,2,23,0,0), +d(2000,4,14,0,0,0), +d(2000,10,5,22,0,0), +d(2001,4,8,23,0,0), +d(2001,9,23,22,0,0), +d(2002,3,28,23,0,0), +d(2002,10,6,22,0,0), +d(2003,3,27,23,0,0), +d(2003,10,2,22,0,0), +d(2004,4,6,23,0,0), +d(2004,9,21,22,0,0), +d(2005,4,1,0,0,0), +d(2005,10,8,23,0,0), +d(2006,3,31,0,0,0), +d(2006,9,30,23,0,0), +d(2007,3,30,0,0,0), +d(2007,9,15,23,0,0), +d(2008,3,28,0,0,0), +d(2008,10,4,23,0,0), +d(2009,3,27,0,0,0), +d(2009,9,26,23,0,0), +d(2010,3,26,0,0,0), +d(2010,9,11,23,0,0), +d(2011,4,1,0,0,0), +d(2011,10,1,23,0,0), +d(2012,3,30,0,0,0), +d(2012,9,22,23,0,0), +d(2013,3,29,0,0,0), +d(2013,9,7,23,0,0), +d(2014,3,28,0,0,0), +d(2014,9,27,23,0,0), +d(2015,3,27,0,0,0), +d(2015,9,19,23,0,0), +d(2016,4,1,0,0,0), +d(2016,10,8,23,0,0), +d(2017,3,31,0,0,0), +d(2017,9,23,23,0,0), +d(2018,3,30,0,0,0), +d(2018,9,15,23,0,0), +d(2019,3,29,0,0,0), +d(2019,10,5,23,0,0), +d(2020,3,27,0,0,0), +d(2020,9,26,23,0,0), +d(2021,3,26,0,0,0), +d(2021,9,11,23,0,0), +d(2022,4,1,0,0,0), +d(2022,10,1,23,0,0), +d(2023,3,31,0,0,0), +d(2023,9,23,23,0,0), +d(2024,3,29,0,0,0), +d(2024,10,5,23,0,0), +d(2025,3,28,0,0,0), +d(2025,9,27,23,0,0), +d(2026,3,27,0,0,0), +d(2026,9,19,23,0,0), +d(2027,3,26,0,0,0), +d(2027,10,9,23,0,0), +d(2028,3,31,0,0,0), +d(2028,9,23,23,0,0), +d(2029,3,30,0,0,0), +d(2029,9,15,23,0,0), +d(2030,3,29,0,0,0), +d(2030,10,5,23,0,0), +d(2031,3,28,0,0,0), +d(2031,9,20,23,0,0), +d(2032,3,26,0,0,0), +d(2032,9,11,23,0,0), +d(2033,4,1,0,0,0), +d(2033,10,1,23,0,0), +d(2034,3,31,0,0,0), +d(2034,9,16,23,0,0), +d(2035,3,30,0,0,0), +d(2035,10,6,23,0,0), +d(2036,3,28,0,0,0), +d(2036,9,27,23,0,0), +d(2037,3,27,0,0,0), +d(2037,9,12,23,0,0), + ] + + _transition_info = [ +i(8460,0,'JMT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(14400,7200,'IDDT'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), + ] + +Jerusalem = Jerusalem() + diff --git a/vendor/pytz/zoneinfo/Asia/Kabul.py b/vendor/pytz/zoneinfo/Asia/Kabul.py new file mode 100644 index 00000000..c19ff5f5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kabul.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Kabul.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kabul(DstTzInfo): + '''Asia/Kabul timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kabul' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1944,12,31,20,0,0), + ] + + _transition_info = [ +i(14400,0,'AFT'), +i(16200,0,'AFT'), + ] + +Kabul = Kabul() + diff --git a/vendor/pytz/zoneinfo/Asia/Kamchatka.py b/vendor/pytz/zoneinfo/Asia/Kamchatka.py new file mode 100644 index 00000000..7b6b9465 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kamchatka.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Kamchatka.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kamchatka(DstTzInfo): + '''Asia/Kamchatka timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kamchatka' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,11,9,13,25,24), +d(1930,6,20,13,0,0), +d(1981,3,31,12,0,0), +d(1981,9,30,11,0,0), +d(1982,3,31,12,0,0), +d(1982,9,30,11,0,0), +d(1983,3,31,12,0,0), +d(1983,9,30,11,0,0), +d(1984,3,31,12,0,0), +d(1984,9,29,14,0,0), +d(1985,3,30,14,0,0), +d(1985,9,28,14,0,0), +d(1986,3,29,14,0,0), +d(1986,9,27,14,0,0), +d(1987,3,28,14,0,0), +d(1987,9,26,14,0,0), +d(1988,3,26,14,0,0), +d(1988,9,24,14,0,0), +d(1989,3,25,14,0,0), +d(1989,9,23,14,0,0), +d(1990,3,24,14,0,0), +d(1990,9,29,14,0,0), +d(1991,3,30,14,0,0), +d(1991,9,28,15,0,0), +d(1992,1,18,15,0,0), +d(1992,3,28,11,0,0), +d(1992,9,26,10,0,0), +d(1993,3,27,14,0,0), +d(1993,9,25,14,0,0), +d(1994,3,26,14,0,0), +d(1994,9,24,14,0,0), +d(1995,3,25,14,0,0), +d(1995,9,23,14,0,0), +d(1996,3,30,14,0,0), +d(1996,10,26,14,0,0), +d(1997,3,29,14,0,0), +d(1997,10,25,14,0,0), +d(1998,3,28,14,0,0), +d(1998,10,24,14,0,0), +d(1999,3,27,14,0,0), +d(1999,10,30,14,0,0), +d(2000,3,25,14,0,0), +d(2000,10,28,14,0,0), +d(2001,3,24,14,0,0), +d(2001,10,27,14,0,0), +d(2002,3,30,14,0,0), +d(2002,10,26,14,0,0), +d(2003,3,29,14,0,0), +d(2003,10,25,14,0,0), +d(2004,3,27,14,0,0), +d(2004,10,30,14,0,0), +d(2005,3,26,14,0,0), +d(2005,10,29,14,0,0), +d(2006,3,25,14,0,0), +d(2006,10,28,14,0,0), +d(2007,3,24,14,0,0), +d(2007,10,27,14,0,0), +d(2008,3,29,14,0,0), +d(2008,10,25,14,0,0), +d(2009,3,28,14,0,0), +d(2009,10,24,14,0,0), +d(2010,3,27,14,0,0), +d(2010,10,30,14,0,0), +d(2011,3,26,14,0,0), +d(2011,10,29,14,0,0), +d(2012,3,24,14,0,0), +d(2012,10,27,14,0,0), +d(2013,3,30,14,0,0), +d(2013,10,26,14,0,0), +d(2014,3,29,14,0,0), +d(2014,10,25,14,0,0), +d(2015,3,28,14,0,0), +d(2015,10,24,14,0,0), +d(2016,3,26,14,0,0), +d(2016,10,29,14,0,0), +d(2017,3,25,14,0,0), +d(2017,10,28,14,0,0), +d(2018,3,24,14,0,0), +d(2018,10,27,14,0,0), +d(2019,3,30,14,0,0), +d(2019,10,26,14,0,0), +d(2020,3,28,14,0,0), +d(2020,10,24,14,0,0), +d(2021,3,27,14,0,0), +d(2021,10,30,14,0,0), +d(2022,3,26,14,0,0), +d(2022,10,29,14,0,0), +d(2023,3,25,14,0,0), +d(2023,10,28,14,0,0), +d(2024,3,30,14,0,0), +d(2024,10,26,14,0,0), +d(2025,3,29,14,0,0), +d(2025,10,25,14,0,0), +d(2026,3,28,14,0,0), +d(2026,10,24,14,0,0), +d(2027,3,27,14,0,0), +d(2027,10,30,14,0,0), +d(2028,3,25,14,0,0), +d(2028,10,28,14,0,0), +d(2029,3,24,14,0,0), +d(2029,10,27,14,0,0), +d(2030,3,30,14,0,0), +d(2030,10,26,14,0,0), +d(2031,3,29,14,0,0), +d(2031,10,25,14,0,0), +d(2032,3,27,14,0,0), +d(2032,10,30,14,0,0), +d(2033,3,26,14,0,0), +d(2033,10,29,14,0,0), +d(2034,3,25,14,0,0), +d(2034,10,28,14,0,0), +d(2035,3,24,14,0,0), +d(2035,10,27,14,0,0), +d(2036,3,29,14,0,0), +d(2036,10,25,14,0,0), +d(2037,3,28,14,0,0), +d(2037,10,24,14,0,0), + ] + + _transition_info = [ +i(38100,0,'LMT'), +i(39600,0,'PETT'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(43200,0,'PETST'), +i(39600,0,'PETT'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), +i(46800,3600,'PETST'), +i(43200,0,'PETT'), + ] + +Kamchatka = Kamchatka() + diff --git a/vendor/pytz/zoneinfo/Asia/Karachi.py b/vendor/pytz/zoneinfo/Asia/Karachi.py new file mode 100644 index 00000000..838f06b0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Karachi.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Asia/Karachi.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Karachi(DstTzInfo): + '''Asia/Karachi timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Karachi' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,12,31,19,31,48), +d(1942,8,31,18,30,0), +d(1945,10,14,17,30,0), +d(1951,9,29,18,30,0), +d(1971,3,25,19,0,0), +d(2002,4,6,19,1,0), +d(2002,10,5,18,1,0), + ] + + _transition_info = [ +i(16080,0,'LMT'), +i(19800,0,'IST'), +i(23400,3600,'IST'), +i(19800,0,'IST'), +i(18000,0,'KART'), +i(18000,0,'PKT'), +i(21600,3600,'PKST'), +i(18000,0,'PKT'), + ] + +Karachi = Karachi() + diff --git a/vendor/pytz/zoneinfo/Asia/Kashgar.py b/vendor/pytz/zoneinfo/Asia/Kashgar.py new file mode 100644 index 00000000..27616b0e --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kashgar.py @@ -0,0 +1,50 @@ +'''tzinfo timezone information for Asia/Kashgar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kashgar(DstTzInfo): + '''Asia/Kashgar timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kashgar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,18,56,4), +d(1939,12,31,18,30,0), +d(1980,4,30,19,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(18240,0,'LMT'), +i(19800,0,'KAST'), +i(18000,0,'KAST'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Kashgar = Kashgar() + diff --git a/vendor/pytz/zoneinfo/Asia/Katmandu.py b/vendor/pytz/zoneinfo/Asia/Katmandu.py new file mode 100644 index 00000000..2f8d1f1a --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Katmandu.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Katmandu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Katmandu(DstTzInfo): + '''Asia/Katmandu timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Katmandu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,18,18,44), +d(1985,12,31,18,30,0), + ] + + _transition_info = [ +i(20460,0,'LMT'), +i(19800,0,'IST'), +i(20700,0,'NPT'), + ] + +Katmandu = Katmandu() + diff --git a/vendor/pytz/zoneinfo/Asia/Krasnoyarsk.py b/vendor/pytz/zoneinfo/Asia/Krasnoyarsk.py new file mode 100644 index 00000000..5cecf765 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Krasnoyarsk.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Krasnoyarsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Krasnoyarsk(DstTzInfo): + '''Asia/Krasnoyarsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Krasnoyarsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,1,5,17,48,40), +d(1930,6,20,18,0,0), +d(1981,3,31,17,0,0), +d(1981,9,30,16,0,0), +d(1982,3,31,17,0,0), +d(1982,9,30,16,0,0), +d(1983,3,31,17,0,0), +d(1983,9,30,16,0,0), +d(1984,3,31,17,0,0), +d(1984,9,29,19,0,0), +d(1985,3,30,19,0,0), +d(1985,9,28,19,0,0), +d(1986,3,29,19,0,0), +d(1986,9,27,19,0,0), +d(1987,3,28,19,0,0), +d(1987,9,26,19,0,0), +d(1988,3,26,19,0,0), +d(1988,9,24,19,0,0), +d(1989,3,25,19,0,0), +d(1989,9,23,19,0,0), +d(1990,3,24,19,0,0), +d(1990,9,29,19,0,0), +d(1991,3,30,19,0,0), +d(1991,9,28,20,0,0), +d(1992,1,18,20,0,0), +d(1992,3,28,16,0,0), +d(1992,9,26,15,0,0), +d(1993,3,27,19,0,0), +d(1993,9,25,19,0,0), +d(1994,3,26,19,0,0), +d(1994,9,24,19,0,0), +d(1995,3,25,19,0,0), +d(1995,9,23,19,0,0), +d(1996,3,30,19,0,0), +d(1996,10,26,19,0,0), +d(1997,3,29,19,0,0), +d(1997,10,25,19,0,0), +d(1998,3,28,19,0,0), +d(1998,10,24,19,0,0), +d(1999,3,27,19,0,0), +d(1999,10,30,19,0,0), +d(2000,3,25,19,0,0), +d(2000,10,28,19,0,0), +d(2001,3,24,19,0,0), +d(2001,10,27,19,0,0), +d(2002,3,30,19,0,0), +d(2002,10,26,19,0,0), +d(2003,3,29,19,0,0), +d(2003,10,25,19,0,0), +d(2004,3,27,19,0,0), +d(2004,10,30,19,0,0), +d(2005,3,26,19,0,0), +d(2005,10,29,19,0,0), +d(2006,3,25,19,0,0), +d(2006,10,28,19,0,0), +d(2007,3,24,19,0,0), +d(2007,10,27,19,0,0), +d(2008,3,29,19,0,0), +d(2008,10,25,19,0,0), +d(2009,3,28,19,0,0), +d(2009,10,24,19,0,0), +d(2010,3,27,19,0,0), +d(2010,10,30,19,0,0), +d(2011,3,26,19,0,0), +d(2011,10,29,19,0,0), +d(2012,3,24,19,0,0), +d(2012,10,27,19,0,0), +d(2013,3,30,19,0,0), +d(2013,10,26,19,0,0), +d(2014,3,29,19,0,0), +d(2014,10,25,19,0,0), +d(2015,3,28,19,0,0), +d(2015,10,24,19,0,0), +d(2016,3,26,19,0,0), +d(2016,10,29,19,0,0), +d(2017,3,25,19,0,0), +d(2017,10,28,19,0,0), +d(2018,3,24,19,0,0), +d(2018,10,27,19,0,0), +d(2019,3,30,19,0,0), +d(2019,10,26,19,0,0), +d(2020,3,28,19,0,0), +d(2020,10,24,19,0,0), +d(2021,3,27,19,0,0), +d(2021,10,30,19,0,0), +d(2022,3,26,19,0,0), +d(2022,10,29,19,0,0), +d(2023,3,25,19,0,0), +d(2023,10,28,19,0,0), +d(2024,3,30,19,0,0), +d(2024,10,26,19,0,0), +d(2025,3,29,19,0,0), +d(2025,10,25,19,0,0), +d(2026,3,28,19,0,0), +d(2026,10,24,19,0,0), +d(2027,3,27,19,0,0), +d(2027,10,30,19,0,0), +d(2028,3,25,19,0,0), +d(2028,10,28,19,0,0), +d(2029,3,24,19,0,0), +d(2029,10,27,19,0,0), +d(2030,3,30,19,0,0), +d(2030,10,26,19,0,0), +d(2031,3,29,19,0,0), +d(2031,10,25,19,0,0), +d(2032,3,27,19,0,0), +d(2032,10,30,19,0,0), +d(2033,3,26,19,0,0), +d(2033,10,29,19,0,0), +d(2034,3,25,19,0,0), +d(2034,10,28,19,0,0), +d(2035,3,24,19,0,0), +d(2035,10,27,19,0,0), +d(2036,3,29,19,0,0), +d(2036,10,25,19,0,0), +d(2037,3,28,19,0,0), +d(2037,10,24,19,0,0), + ] + + _transition_info = [ +i(22260,0,'LMT'), +i(21600,0,'KRAT'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(25200,0,'KRAST'), +i(21600,0,'KRAT'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), +i(28800,3600,'KRAST'), +i(25200,0,'KRAT'), + ] + +Krasnoyarsk = Krasnoyarsk() + diff --git a/vendor/pytz/zoneinfo/Asia/Kuala_Lumpur.py b/vendor/pytz/zoneinfo/Asia/Kuala_Lumpur.py new file mode 100644 index 00000000..99f1d829 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kuala_Lumpur.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Asia/Kuala_Lumpur.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kuala_Lumpur(DstTzInfo): + '''Asia/Kuala_Lumpur timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kuala_Lumpur' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,5,31,17,4,35), +d(1932,12,31,17,0,0), +d(1935,12,31,16,40,0), +d(1941,8,31,16,40,0), +d(1942,2,15,16,30,0), +d(1945,9,11,15,0,0), +d(1981,12,31,16,30,0), + ] + + _transition_info = [ +i(24900,0,'SMT'), +i(25200,0,'MALT'), +i(26400,1200,'MALST'), +i(26400,0,'MALT'), +i(27000,0,'MALT'), +i(32400,0,'JST'), +i(27000,0,'MALT'), +i(28800,0,'MYT'), + ] + +Kuala_Lumpur = Kuala_Lumpur() + diff --git a/vendor/pytz/zoneinfo/Asia/Kuching.py b/vendor/pytz/zoneinfo/Asia/Kuching.py new file mode 100644 index 00000000..e6e7b99e --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kuching.py @@ -0,0 +1,58 @@ +'''tzinfo timezone information for Asia/Kuching.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kuching(DstTzInfo): + '''Asia/Kuching timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kuching' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1926,2,28,16,38,40), +d(1932,12,31,16,30,0), +d(1935,9,13,16,0,0), +d(1935,12,13,15,40,0), +d(1936,9,13,16,0,0), +d(1936,12,13,15,40,0), +d(1937,9,13,16,0,0), +d(1937,12,13,15,40,0), +d(1938,9,13,16,0,0), +d(1938,12,13,15,40,0), +d(1939,9,13,16,0,0), +d(1939,12,13,15,40,0), +d(1940,9,13,16,0,0), +d(1940,12,13,15,40,0), +d(1941,9,13,16,0,0), +d(1941,12,13,15,40,0), +d(1942,2,15,16,0,0), +d(1945,9,11,15,0,0), +d(1981,12,31,16,0,0), + ] + + _transition_info = [ +i(26460,0,'LMT'), +i(27000,0,'BORT'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(30000,1200,'BORTST'), +i(28800,0,'BORT'), +i(32400,0,'JST'), +i(28800,0,'BORT'), +i(28800,0,'MYT'), + ] + +Kuching = Kuching() + diff --git a/vendor/pytz/zoneinfo/Asia/Kuwait.py b/vendor/pytz/zoneinfo/Asia/Kuwait.py new file mode 100644 index 00000000..011d226d --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Kuwait.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Kuwait.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kuwait(DstTzInfo): + '''Asia/Kuwait timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Kuwait' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1949,12,31,20,48,4), + ] + + _transition_info = [ +i(11520,0,'LMT'), +i(10800,0,'AST'), + ] + +Kuwait = Kuwait() + diff --git a/vendor/pytz/zoneinfo/Asia/Macao.py b/vendor/pytz/zoneinfo/Asia/Macao.py new file mode 100644 index 00000000..858c8497 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Macao.py @@ -0,0 +1,104 @@ +'''tzinfo timezone information for Asia/Macao.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Macao(DstTzInfo): + '''Asia/Macao timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Macao' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,16,25,40), +d(1961,3,18,19,30,0), +d(1961,11,4,18,30,0), +d(1962,3,17,19,30,0), +d(1962,11,3,18,30,0), +d(1963,3,16,16,0,0), +d(1963,11,2,18,30,0), +d(1964,3,21,19,30,0), +d(1964,10,31,18,30,0), +d(1965,3,20,16,0,0), +d(1965,10,30,15,0,0), +d(1966,4,16,19,30,0), +d(1966,10,15,18,30,0), +d(1967,4,15,19,30,0), +d(1967,10,21,18,30,0), +d(1968,4,20,19,30,0), +d(1968,10,19,18,30,0), +d(1969,4,19,19,30,0), +d(1969,10,18,18,30,0), +d(1970,4,18,19,30,0), +d(1970,10,17,18,30,0), +d(1971,4,17,19,30,0), +d(1971,10,16,18,30,0), +d(1972,4,15,16,0,0), +d(1972,10,14,15,0,0), +d(1973,4,14,16,0,0), +d(1973,10,20,15,0,0), +d(1974,4,20,16,0,0), +d(1974,10,19,18,30,0), +d(1975,4,19,19,30,0), +d(1975,10,18,18,30,0), +d(1976,4,17,19,30,0), +d(1976,10,16,18,30,0), +d(1977,4,16,19,30,0), +d(1977,10,15,18,30,0), +d(1978,4,15,16,0,0), +d(1978,10,14,15,0,0), +d(1979,4,14,16,0,0), +d(1979,10,20,15,0,0), +d(1980,4,19,16,0,0), +d(1980,10,18,15,0,0), +d(1999,12,19,16,0,0), + ] + + _transition_info = [ +i(27240,0,'LMT'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(28800,0,'CST'), + ] + +Macao = Macao() + diff --git a/vendor/pytz/zoneinfo/Asia/Macau.py b/vendor/pytz/zoneinfo/Asia/Macau.py new file mode 100644 index 00000000..6865e5ff --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Macau.py @@ -0,0 +1,104 @@ +'''tzinfo timezone information for Asia/Macau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Macau(DstTzInfo): + '''Asia/Macau timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Macau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,12,31,16,25,40), +d(1961,3,18,19,30,0), +d(1961,11,4,18,30,0), +d(1962,3,17,19,30,0), +d(1962,11,3,18,30,0), +d(1963,3,16,16,0,0), +d(1963,11,2,18,30,0), +d(1964,3,21,19,30,0), +d(1964,10,31,18,30,0), +d(1965,3,20,16,0,0), +d(1965,10,30,15,0,0), +d(1966,4,16,19,30,0), +d(1966,10,15,18,30,0), +d(1967,4,15,19,30,0), +d(1967,10,21,18,30,0), +d(1968,4,20,19,30,0), +d(1968,10,19,18,30,0), +d(1969,4,19,19,30,0), +d(1969,10,18,18,30,0), +d(1970,4,18,19,30,0), +d(1970,10,17,18,30,0), +d(1971,4,17,19,30,0), +d(1971,10,16,18,30,0), +d(1972,4,15,16,0,0), +d(1972,10,14,15,0,0), +d(1973,4,14,16,0,0), +d(1973,10,20,15,0,0), +d(1974,4,20,16,0,0), +d(1974,10,19,18,30,0), +d(1975,4,19,19,30,0), +d(1975,10,18,18,30,0), +d(1976,4,17,19,30,0), +d(1976,10,16,18,30,0), +d(1977,4,16,19,30,0), +d(1977,10,15,18,30,0), +d(1978,4,15,16,0,0), +d(1978,10,14,15,0,0), +d(1979,4,14,16,0,0), +d(1979,10,20,15,0,0), +d(1980,4,19,16,0,0), +d(1980,10,18,15,0,0), +d(1999,12,19,16,0,0), + ] + + _transition_info = [ +i(27240,0,'LMT'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(32400,3600,'MOST'), +i(28800,0,'MOT'), +i(28800,0,'CST'), + ] + +Macau = Macau() + diff --git a/vendor/pytz/zoneinfo/Asia/Magadan.py b/vendor/pytz/zoneinfo/Asia/Magadan.py new file mode 100644 index 00000000..673bc1d2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Magadan.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Magadan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Magadan(DstTzInfo): + '''Asia/Magadan timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Magadan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,13,56,48), +d(1930,6,20,14,0,0), +d(1981,3,31,13,0,0), +d(1981,9,30,12,0,0), +d(1982,3,31,13,0,0), +d(1982,9,30,12,0,0), +d(1983,3,31,13,0,0), +d(1983,9,30,12,0,0), +d(1984,3,31,13,0,0), +d(1984,9,29,15,0,0), +d(1985,3,30,15,0,0), +d(1985,9,28,15,0,0), +d(1986,3,29,15,0,0), +d(1986,9,27,15,0,0), +d(1987,3,28,15,0,0), +d(1987,9,26,15,0,0), +d(1988,3,26,15,0,0), +d(1988,9,24,15,0,0), +d(1989,3,25,15,0,0), +d(1989,9,23,15,0,0), +d(1990,3,24,15,0,0), +d(1990,9,29,15,0,0), +d(1991,3,30,15,0,0), +d(1991,9,28,16,0,0), +d(1992,1,18,16,0,0), +d(1992,3,28,12,0,0), +d(1992,9,26,11,0,0), +d(1993,3,27,15,0,0), +d(1993,9,25,15,0,0), +d(1994,3,26,15,0,0), +d(1994,9,24,15,0,0), +d(1995,3,25,15,0,0), +d(1995,9,23,15,0,0), +d(1996,3,30,15,0,0), +d(1996,10,26,15,0,0), +d(1997,3,29,15,0,0), +d(1997,10,25,15,0,0), +d(1998,3,28,15,0,0), +d(1998,10,24,15,0,0), +d(1999,3,27,15,0,0), +d(1999,10,30,15,0,0), +d(2000,3,25,15,0,0), +d(2000,10,28,15,0,0), +d(2001,3,24,15,0,0), +d(2001,10,27,15,0,0), +d(2002,3,30,15,0,0), +d(2002,10,26,15,0,0), +d(2003,3,29,15,0,0), +d(2003,10,25,15,0,0), +d(2004,3,27,15,0,0), +d(2004,10,30,15,0,0), +d(2005,3,26,15,0,0), +d(2005,10,29,15,0,0), +d(2006,3,25,15,0,0), +d(2006,10,28,15,0,0), +d(2007,3,24,15,0,0), +d(2007,10,27,15,0,0), +d(2008,3,29,15,0,0), +d(2008,10,25,15,0,0), +d(2009,3,28,15,0,0), +d(2009,10,24,15,0,0), +d(2010,3,27,15,0,0), +d(2010,10,30,15,0,0), +d(2011,3,26,15,0,0), +d(2011,10,29,15,0,0), +d(2012,3,24,15,0,0), +d(2012,10,27,15,0,0), +d(2013,3,30,15,0,0), +d(2013,10,26,15,0,0), +d(2014,3,29,15,0,0), +d(2014,10,25,15,0,0), +d(2015,3,28,15,0,0), +d(2015,10,24,15,0,0), +d(2016,3,26,15,0,0), +d(2016,10,29,15,0,0), +d(2017,3,25,15,0,0), +d(2017,10,28,15,0,0), +d(2018,3,24,15,0,0), +d(2018,10,27,15,0,0), +d(2019,3,30,15,0,0), +d(2019,10,26,15,0,0), +d(2020,3,28,15,0,0), +d(2020,10,24,15,0,0), +d(2021,3,27,15,0,0), +d(2021,10,30,15,0,0), +d(2022,3,26,15,0,0), +d(2022,10,29,15,0,0), +d(2023,3,25,15,0,0), +d(2023,10,28,15,0,0), +d(2024,3,30,15,0,0), +d(2024,10,26,15,0,0), +d(2025,3,29,15,0,0), +d(2025,10,25,15,0,0), +d(2026,3,28,15,0,0), +d(2026,10,24,15,0,0), +d(2027,3,27,15,0,0), +d(2027,10,30,15,0,0), +d(2028,3,25,15,0,0), +d(2028,10,28,15,0,0), +d(2029,3,24,15,0,0), +d(2029,10,27,15,0,0), +d(2030,3,30,15,0,0), +d(2030,10,26,15,0,0), +d(2031,3,29,15,0,0), +d(2031,10,25,15,0,0), +d(2032,3,27,15,0,0), +d(2032,10,30,15,0,0), +d(2033,3,26,15,0,0), +d(2033,10,29,15,0,0), +d(2034,3,25,15,0,0), +d(2034,10,28,15,0,0), +d(2035,3,24,15,0,0), +d(2035,10,27,15,0,0), +d(2036,3,29,15,0,0), +d(2036,10,25,15,0,0), +d(2037,3,28,15,0,0), +d(2037,10,24,15,0,0), + ] + + _transition_info = [ +i(36180,0,'LMT'), +i(36000,0,'MAGT'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(39600,0,'MAGST'), +i(36000,0,'MAGT'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), +i(43200,3600,'MAGST'), +i(39600,0,'MAGT'), + ] + +Magadan = Magadan() + diff --git a/vendor/pytz/zoneinfo/Asia/Makassar.py b/vendor/pytz/zoneinfo/Asia/Makassar.py new file mode 100644 index 00000000..421845e2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Makassar.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Makassar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Makassar(DstTzInfo): + '''Asia/Makassar timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Makassar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,16,2,24), +d(1932,10,31,16,2,24), +d(1942,2,8,16,0,0), +d(1945,7,31,15,0,0), + ] + + _transition_info = [ +i(28680,0,'LMT'), +i(28680,0,'MMT'), +i(28800,0,'CIT'), +i(32400,0,'JST'), +i(28800,0,'CIT'), + ] + +Makassar = Makassar() + diff --git a/vendor/pytz/zoneinfo/Asia/Manila.py b/vendor/pytz/zoneinfo/Asia/Manila.py new file mode 100644 index 00000000..9d2112b7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Manila.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Asia/Manila.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Manila(DstTzInfo): + '''Asia/Manila timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Manila' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1936,10,31,16,0,0), +d(1937,1,31,15,0,0), +d(1942,4,30,16,0,0), +d(1944,10,31,15,0,0), +d(1954,4,11,16,0,0), +d(1954,6,30,15,0,0), +d(1978,3,21,16,0,0), +d(1978,9,20,15,0,0), + ] + + _transition_info = [ +i(28800,0,'PHT'), +i(32400,3600,'PHST'), +i(28800,0,'PHT'), +i(32400,0,'JST'), +i(28800,0,'PHT'), +i(32400,3600,'PHST'), +i(28800,0,'PHT'), +i(32400,3600,'PHST'), +i(28800,0,'PHT'), + ] + +Manila = Manila() + diff --git a/vendor/pytz/zoneinfo/Asia/Muscat.py b/vendor/pytz/zoneinfo/Asia/Muscat.py new file mode 100644 index 00000000..68bdb138 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Muscat.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Muscat.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Muscat(DstTzInfo): + '''Asia/Muscat timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Muscat' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,20,5,40), + ] + + _transition_info = [ +i(14040,0,'LMT'), +i(14400,0,'GST'), + ] + +Muscat = Muscat() + diff --git a/vendor/pytz/zoneinfo/Asia/Nicosia.py b/vendor/pytz/zoneinfo/Asia/Nicosia.py new file mode 100644 index 00000000..737050f0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Nicosia.py @@ -0,0 +1,274 @@ +'''tzinfo timezone information for Asia/Nicosia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nicosia(DstTzInfo): + '''Asia/Nicosia timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Nicosia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,11,13,21,46,32), +d(1975,4,12,22,0,0), +d(1975,10,11,21,0,0), +d(1976,5,14,22,0,0), +d(1976,10,10,21,0,0), +d(1977,4,2,22,0,0), +d(1977,9,24,21,0,0), +d(1978,4,1,22,0,0), +d(1978,10,1,21,0,0), +d(1979,3,31,22,0,0), +d(1979,9,29,21,0,0), +d(1980,4,5,22,0,0), +d(1980,9,27,21,0,0), +d(1981,3,28,22,0,0), +d(1981,9,26,21,0,0), +d(1982,3,27,22,0,0), +d(1982,9,25,21,0,0), +d(1983,3,26,22,0,0), +d(1983,9,24,21,0,0), +d(1984,3,24,22,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,22,0,0), +d(1991,9,28,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,9,28,21,0,0), +d(1997,3,29,22,0,0), +d(1997,9,27,21,0,0), +d(1998,3,28,22,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7980,0,'LMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Nicosia = Nicosia() + diff --git a/vendor/pytz/zoneinfo/Asia/Novosibirsk.py b/vendor/pytz/zoneinfo/Asia/Novosibirsk.py new file mode 100644 index 00000000..69e9cbe9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Novosibirsk.py @@ -0,0 +1,256 @@ +'''tzinfo timezone information for Asia/Novosibirsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Novosibirsk(DstTzInfo): + '''Asia/Novosibirsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Novosibirsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,14,0,28,20), +d(1930,6,20,18,0,0), +d(1981,3,31,17,0,0), +d(1981,9,30,16,0,0), +d(1982,3,31,17,0,0), +d(1982,9,30,16,0,0), +d(1983,3,31,17,0,0), +d(1983,9,30,16,0,0), +d(1984,3,31,17,0,0), +d(1984,9,29,19,0,0), +d(1985,3,30,19,0,0), +d(1985,9,28,19,0,0), +d(1986,3,29,19,0,0), +d(1986,9,27,19,0,0), +d(1987,3,28,19,0,0), +d(1987,9,26,19,0,0), +d(1988,3,26,19,0,0), +d(1988,9,24,19,0,0), +d(1989,3,25,19,0,0), +d(1989,9,23,19,0,0), +d(1990,3,24,19,0,0), +d(1990,9,29,19,0,0), +d(1991,3,30,19,0,0), +d(1991,9,28,20,0,0), +d(1992,1,18,20,0,0), +d(1992,3,28,16,0,0), +d(1992,9,26,15,0,0), +d(1993,3,27,19,0,0), +d(1993,5,22,16,0,0), +d(1993,9,25,20,0,0), +d(1994,3,26,20,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,20,0,0), +d(1995,9,23,20,0,0), +d(1996,3,30,20,0,0), +d(1996,10,26,20,0,0), +d(1997,3,29,20,0,0), +d(1997,10,25,20,0,0), +d(1998,3,28,20,0,0), +d(1998,10,24,20,0,0), +d(1999,3,27,20,0,0), +d(1999,10,30,20,0,0), +d(2000,3,25,20,0,0), +d(2000,10,28,20,0,0), +d(2001,3,24,20,0,0), +d(2001,10,27,20,0,0), +d(2002,3,30,20,0,0), +d(2002,10,26,20,0,0), +d(2003,3,29,20,0,0), +d(2003,10,25,20,0,0), +d(2004,3,27,20,0,0), +d(2004,10,30,20,0,0), +d(2005,3,26,20,0,0), +d(2005,10,29,20,0,0), +d(2006,3,25,20,0,0), +d(2006,10,28,20,0,0), +d(2007,3,24,20,0,0), +d(2007,10,27,20,0,0), +d(2008,3,29,20,0,0), +d(2008,10,25,20,0,0), +d(2009,3,28,20,0,0), +d(2009,10,24,20,0,0), +d(2010,3,27,20,0,0), +d(2010,10,30,20,0,0), +d(2011,3,26,20,0,0), +d(2011,10,29,20,0,0), +d(2012,3,24,20,0,0), +d(2012,10,27,20,0,0), +d(2013,3,30,20,0,0), +d(2013,10,26,20,0,0), +d(2014,3,29,20,0,0), +d(2014,10,25,20,0,0), +d(2015,3,28,20,0,0), +d(2015,10,24,20,0,0), +d(2016,3,26,20,0,0), +d(2016,10,29,20,0,0), +d(2017,3,25,20,0,0), +d(2017,10,28,20,0,0), +d(2018,3,24,20,0,0), +d(2018,10,27,20,0,0), +d(2019,3,30,20,0,0), +d(2019,10,26,20,0,0), +d(2020,3,28,20,0,0), +d(2020,10,24,20,0,0), +d(2021,3,27,20,0,0), +d(2021,10,30,20,0,0), +d(2022,3,26,20,0,0), +d(2022,10,29,20,0,0), +d(2023,3,25,20,0,0), +d(2023,10,28,20,0,0), +d(2024,3,30,20,0,0), +d(2024,10,26,20,0,0), +d(2025,3,29,20,0,0), +d(2025,10,25,20,0,0), +d(2026,3,28,20,0,0), +d(2026,10,24,20,0,0), +d(2027,3,27,20,0,0), +d(2027,10,30,20,0,0), +d(2028,3,25,20,0,0), +d(2028,10,28,20,0,0), +d(2029,3,24,20,0,0), +d(2029,10,27,20,0,0), +d(2030,3,30,20,0,0), +d(2030,10,26,20,0,0), +d(2031,3,29,20,0,0), +d(2031,10,25,20,0,0), +d(2032,3,27,20,0,0), +d(2032,10,30,20,0,0), +d(2033,3,26,20,0,0), +d(2033,10,29,20,0,0), +d(2034,3,25,20,0,0), +d(2034,10,28,20,0,0), +d(2035,3,24,20,0,0), +d(2035,10,27,20,0,0), +d(2036,3,29,20,0,0), +d(2036,10,25,20,0,0), +d(2037,3,28,20,0,0), +d(2037,10,24,20,0,0), + ] + + _transition_info = [ +i(19920,0,'LMT'), +i(21600,0,'NOVT'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(25200,0,'NOVST'), +i(21600,0,'NOVT'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVT'), +i(28800,3600,'NOVST'), +i(25200,0,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), +i(25200,3600,'NOVST'), +i(21600,0,'NOVT'), + ] + +Novosibirsk = Novosibirsk() + diff --git a/vendor/pytz/zoneinfo/Asia/Omsk.py b/vendor/pytz/zoneinfo/Asia/Omsk.py new file mode 100644 index 00000000..3c74a39f --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Omsk.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Omsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Omsk(DstTzInfo): + '''Asia/Omsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Omsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,11,13,19,6,24), +d(1930,6,20,19,0,0), +d(1981,3,31,18,0,0), +d(1981,9,30,17,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,17,0,0), +d(1983,3,31,18,0,0), +d(1983,9,30,17,0,0), +d(1984,3,31,18,0,0), +d(1984,9,29,20,0,0), +d(1985,3,30,20,0,0), +d(1985,9,28,20,0,0), +d(1986,3,29,20,0,0), +d(1986,9,27,20,0,0), +d(1987,3,28,20,0,0), +d(1987,9,26,20,0,0), +d(1988,3,26,20,0,0), +d(1988,9,24,20,0,0), +d(1989,3,25,20,0,0), +d(1989,9,23,20,0,0), +d(1990,3,24,20,0,0), +d(1990,9,29,20,0,0), +d(1991,3,30,20,0,0), +d(1991,9,28,21,0,0), +d(1992,1,18,21,0,0), +d(1992,3,28,17,0,0), +d(1992,9,26,16,0,0), +d(1993,3,27,20,0,0), +d(1993,9,25,20,0,0), +d(1994,3,26,20,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,20,0,0), +d(1995,9,23,20,0,0), +d(1996,3,30,20,0,0), +d(1996,10,26,20,0,0), +d(1997,3,29,20,0,0), +d(1997,10,25,20,0,0), +d(1998,3,28,20,0,0), +d(1998,10,24,20,0,0), +d(1999,3,27,20,0,0), +d(1999,10,30,20,0,0), +d(2000,3,25,20,0,0), +d(2000,10,28,20,0,0), +d(2001,3,24,20,0,0), +d(2001,10,27,20,0,0), +d(2002,3,30,20,0,0), +d(2002,10,26,20,0,0), +d(2003,3,29,20,0,0), +d(2003,10,25,20,0,0), +d(2004,3,27,20,0,0), +d(2004,10,30,20,0,0), +d(2005,3,26,20,0,0), +d(2005,10,29,20,0,0), +d(2006,3,25,20,0,0), +d(2006,10,28,20,0,0), +d(2007,3,24,20,0,0), +d(2007,10,27,20,0,0), +d(2008,3,29,20,0,0), +d(2008,10,25,20,0,0), +d(2009,3,28,20,0,0), +d(2009,10,24,20,0,0), +d(2010,3,27,20,0,0), +d(2010,10,30,20,0,0), +d(2011,3,26,20,0,0), +d(2011,10,29,20,0,0), +d(2012,3,24,20,0,0), +d(2012,10,27,20,0,0), +d(2013,3,30,20,0,0), +d(2013,10,26,20,0,0), +d(2014,3,29,20,0,0), +d(2014,10,25,20,0,0), +d(2015,3,28,20,0,0), +d(2015,10,24,20,0,0), +d(2016,3,26,20,0,0), +d(2016,10,29,20,0,0), +d(2017,3,25,20,0,0), +d(2017,10,28,20,0,0), +d(2018,3,24,20,0,0), +d(2018,10,27,20,0,0), +d(2019,3,30,20,0,0), +d(2019,10,26,20,0,0), +d(2020,3,28,20,0,0), +d(2020,10,24,20,0,0), +d(2021,3,27,20,0,0), +d(2021,10,30,20,0,0), +d(2022,3,26,20,0,0), +d(2022,10,29,20,0,0), +d(2023,3,25,20,0,0), +d(2023,10,28,20,0,0), +d(2024,3,30,20,0,0), +d(2024,10,26,20,0,0), +d(2025,3,29,20,0,0), +d(2025,10,25,20,0,0), +d(2026,3,28,20,0,0), +d(2026,10,24,20,0,0), +d(2027,3,27,20,0,0), +d(2027,10,30,20,0,0), +d(2028,3,25,20,0,0), +d(2028,10,28,20,0,0), +d(2029,3,24,20,0,0), +d(2029,10,27,20,0,0), +d(2030,3,30,20,0,0), +d(2030,10,26,20,0,0), +d(2031,3,29,20,0,0), +d(2031,10,25,20,0,0), +d(2032,3,27,20,0,0), +d(2032,10,30,20,0,0), +d(2033,3,26,20,0,0), +d(2033,10,29,20,0,0), +d(2034,3,25,20,0,0), +d(2034,10,28,20,0,0), +d(2035,3,24,20,0,0), +d(2035,10,27,20,0,0), +d(2036,3,29,20,0,0), +d(2036,10,25,20,0,0), +d(2037,3,28,20,0,0), +d(2037,10,24,20,0,0), + ] + + _transition_info = [ +i(17640,0,'LMT'), +i(18000,0,'OMST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(21600,0,'OMSST'), +i(18000,0,'OMST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), +i(25200,3600,'OMSST'), +i(21600,0,'OMST'), + ] + +Omsk = Omsk() + diff --git a/vendor/pytz/zoneinfo/Asia/Oral.py b/vendor/pytz/zoneinfo/Asia/Oral.py new file mode 100644 index 00000000..92010fff --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Oral.py @@ -0,0 +1,122 @@ +'''tzinfo timezone information for Asia/Oral.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Oral(DstTzInfo): + '''Asia/Oral timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Oral' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,20,34,36), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,22,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,22,0,0), +d(1990,12,31,20,0,0), +d(1991,12,15,20,0,0), +d(1992,3,28,19,0,0), +d(1992,9,26,18,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,22,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,22,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,22,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,22,0,0), +d(1997,3,29,22,0,0), +d(1997,10,25,22,0,0), +d(1998,3,28,22,0,0), +d(1998,10,24,22,0,0), +d(1999,3,27,22,0,0), +d(1999,10,30,22,0,0), +d(2000,3,25,22,0,0), +d(2000,10,28,22,0,0), +d(2001,3,24,22,0,0), +d(2001,10,27,22,0,0), +d(2002,3,30,22,0,0), +d(2002,10,26,22,0,0), +d(2003,3,29,22,0,0), +d(2003,10,25,22,0,0), +d(2004,3,27,22,0,0), +d(2004,10,30,22,0,0), +d(2005,3,14,20,0,0), + ] + + _transition_info = [ +i(12300,0,'LMT'), +i(14400,0,'URAT'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(21600,0,'URAT'), +i(21600,0,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(21600,3600,'URAST'), +i(18000,0,'URAT'), +i(18000,0,'URAST'), +i(14400,0,'URAT'), +i(18000,3600,'URAST'), +i(14400,0,'URAT'), +i(14400,0,'URAT'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,3600,'ORAST'), +i(14400,0,'ORAT'), +i(18000,0,'ORAT'), + ] + +Oral = Oral() + diff --git a/vendor/pytz/zoneinfo/Asia/Phnom_Penh.py b/vendor/pytz/zoneinfo/Asia/Phnom_Penh.py new file mode 100644 index 00000000..e7377c5c --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Phnom_Penh.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Phnom_Penh.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Phnom_Penh(DstTzInfo): + '''Asia/Phnom_Penh timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Phnom_Penh' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,6,8,17,0,20), +d(1911,3,10,16,54,40), +d(1912,4,30,17,0,0), +d(1931,4,30,16,0,0), + ] + + _transition_info = [ +i(25200,0,'LMT'), +i(25560,0,'SMT'), +i(25200,0,'ICT'), +i(28800,0,'ICT'), +i(25200,0,'ICT'), + ] + +Phnom_Penh = Phnom_Penh() + diff --git a/vendor/pytz/zoneinfo/Asia/Pontianak.py b/vendor/pytz/zoneinfo/Asia/Pontianak.py new file mode 100644 index 00000000..0611e9eb --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Pontianak.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Asia/Pontianak.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pontianak(DstTzInfo): + '''Asia/Pontianak timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Pontianak' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,4,30,16,42,40), +d(1932,10,31,16,42,40), +d(1942,1,28,16,30,0), +d(1945,7,31,15,0,0), +d(1948,4,30,16,30,0), +d(1950,4,30,16,0,0), +d(1963,12,31,16,30,0), +d(1987,12,31,16,0,0), + ] + + _transition_info = [ +i(26220,0,'LMT'), +i(26220,0,'PMT'), +i(27000,0,'WIT'), +i(32400,0,'JST'), +i(27000,0,'WIT'), +i(28800,0,'WIT'), +i(27000,0,'WIT'), +i(28800,0,'CIT'), +i(25200,0,'WIT'), + ] + +Pontianak = Pontianak() + diff --git a/vendor/pytz/zoneinfo/Asia/Pyongyang.py b/vendor/pytz/zoneinfo/Asia/Pyongyang.py new file mode 100644 index 00000000..bf203c3d --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Pyongyang.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Asia/Pyongyang.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pyongyang(DstTzInfo): + '''Asia/Pyongyang timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Pyongyang' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,11,30,15,30,0), +d(1927,12,31,15,0,0), +d(1931,12,31,15,30,0), +d(1954,3,20,15,0,0), +d(1961,8,9,16,0,0), + ] + + _transition_info = [ +i(30600,0,'KST'), +i(32400,0,'KST'), +i(30600,0,'KST'), +i(32400,0,'KST'), +i(28800,0,'KST'), +i(32400,0,'KST'), + ] + +Pyongyang = Pyongyang() + diff --git a/vendor/pytz/zoneinfo/Asia/Qatar.py b/vendor/pytz/zoneinfo/Asia/Qatar.py new file mode 100644 index 00000000..746aa5ae --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Qatar.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Qatar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Qatar(DstTzInfo): + '''Asia/Qatar timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Qatar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,20,33,52), +d(1972,5,31,20,0,0), + ] + + _transition_info = [ +i(12360,0,'LMT'), +i(14400,0,'GST'), +i(10800,0,'AST'), + ] + +Qatar = Qatar() + diff --git a/vendor/pytz/zoneinfo/Asia/Qyzylorda.py b/vendor/pytz/zoneinfo/Asia/Qyzylorda.py new file mode 100644 index 00000000..3dd7460a --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Qyzylorda.py @@ -0,0 +1,124 @@ +'''tzinfo timezone information for Asia/Qyzylorda.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Qyzylorda(DstTzInfo): + '''Asia/Qyzylorda timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Qyzylorda' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,19,38,8), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1990,12,31,19,0,0), +d(1991,12,15,19,0,0), +d(1992,1,18,21,0,0), +d(1992,3,28,17,0,0), +d(1992,9,26,16,0,0), +d(1993,3,27,20,0,0), +d(1993,9,25,20,0,0), +d(1994,3,26,20,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,20,0,0), +d(1995,9,23,20,0,0), +d(1996,3,30,20,0,0), +d(1996,10,26,20,0,0), +d(1997,3,29,20,0,0), +d(1997,10,25,20,0,0), +d(1998,3,28,20,0,0), +d(1998,10,24,20,0,0), +d(1999,3,27,20,0,0), +d(1999,10,30,20,0,0), +d(2000,3,25,20,0,0), +d(2000,10,28,20,0,0), +d(2001,3,24,20,0,0), +d(2001,10,27,20,0,0), +d(2002,3,30,20,0,0), +d(2002,10,26,20,0,0), +d(2003,3,29,20,0,0), +d(2003,10,25,20,0,0), +d(2004,3,27,20,0,0), +d(2004,10,30,20,0,0), +d(2005,3,14,18,0,0), + ] + + _transition_info = [ +i(15720,0,'LMT'), +i(14400,0,'KIZT'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(21600,0,'KIZT'), +i(21600,0,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(21600,3600,'KIZST'), +i(18000,0,'KIZT'), +i(18000,0,'KIZT'), +i(18000,0,'QYZT'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(25200,3600,'QYZST'), +i(21600,0,'QYZT'), +i(21600,0,'QYZT'), + ] + +Qyzylorda = Qyzylorda() + diff --git a/vendor/pytz/zoneinfo/Asia/Rangoon.py b/vendor/pytz/zoneinfo/Asia/Rangoon.py new file mode 100644 index 00000000..d8120d80 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Rangoon.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Asia/Rangoon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rangoon(DstTzInfo): + '''Asia/Rangoon timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Rangoon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,17,35,24), +d(1942,4,30,17,30,0), +d(1945,5,2,15,0,0), + ] + + _transition_info = [ +i(23100,0,'RMT'), +i(23400,0,'BURT'), +i(32400,0,'JST'), +i(23400,0,'MMT'), + ] + +Rangoon = Rangoon() + diff --git a/vendor/pytz/zoneinfo/Asia/Riyadh.py b/vendor/pytz/zoneinfo/Asia/Riyadh.py new file mode 100644 index 00000000..fb09cdb1 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Riyadh.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Asia/Riyadh.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Riyadh(DstTzInfo): + '''Asia/Riyadh timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Riyadh' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1949,12,31,20,53,8), + ] + + _transition_info = [ +i(11220,0,'LMT'), +i(10800,0,'AST'), + ] + +Riyadh = Riyadh() + diff --git a/vendor/pytz/zoneinfo/Asia/Saigon.py b/vendor/pytz/zoneinfo/Asia/Saigon.py new file mode 100644 index 00000000..a0cfcc72 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Saigon.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Saigon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Saigon(DstTzInfo): + '''Asia/Saigon timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Saigon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,6,8,16,53,20), +d(1911,3,10,16,54,40), +d(1912,4,30,17,0,0), +d(1931,4,30,16,0,0), + ] + + _transition_info = [ +i(25620,0,'LMT'), +i(25560,0,'SMT'), +i(25200,0,'ICT'), +i(28800,0,'ICT'), +i(25200,0,'ICT'), + ] + +Saigon = Saigon() + diff --git a/vendor/pytz/zoneinfo/Asia/Sakhalin.py b/vendor/pytz/zoneinfo/Asia/Sakhalin.py new file mode 100644 index 00000000..45a36720 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Sakhalin.py @@ -0,0 +1,256 @@ +'''tzinfo timezone information for Asia/Sakhalin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sakhalin(DstTzInfo): + '''Asia/Sakhalin timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Sakhalin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,8,22,14,29,12), +d(1937,12,31,15,0,0), +d(1945,8,24,15,0,0), +d(1981,3,31,13,0,0), +d(1981,9,30,12,0,0), +d(1982,3,31,13,0,0), +d(1982,9,30,12,0,0), +d(1983,3,31,13,0,0), +d(1983,9,30,12,0,0), +d(1984,3,31,13,0,0), +d(1984,9,29,15,0,0), +d(1985,3,30,15,0,0), +d(1985,9,28,15,0,0), +d(1986,3,29,15,0,0), +d(1986,9,27,15,0,0), +d(1987,3,28,15,0,0), +d(1987,9,26,15,0,0), +d(1988,3,26,15,0,0), +d(1988,9,24,15,0,0), +d(1989,3,25,15,0,0), +d(1989,9,23,15,0,0), +d(1990,3,24,15,0,0), +d(1990,9,29,15,0,0), +d(1991,3,30,15,0,0), +d(1991,9,28,16,0,0), +d(1992,1,18,16,0,0), +d(1992,3,28,12,0,0), +d(1992,9,26,11,0,0), +d(1993,3,27,15,0,0), +d(1993,9,25,15,0,0), +d(1994,3,26,15,0,0), +d(1994,9,24,15,0,0), +d(1995,3,25,15,0,0), +d(1995,9,23,15,0,0), +d(1996,3,30,15,0,0), +d(1996,10,26,15,0,0), +d(1997,3,29,15,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,10,28,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,3,25,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(34260,0,'LMT'), +i(32400,0,'CJT'), +i(32400,0,'JST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(39600,0,'SAKST'), +i(36000,0,'SAKT'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(43200,3600,'SAKST'), +i(39600,0,'SAKT'), +i(39600,0,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), +i(39600,3600,'SAKST'), +i(36000,0,'SAKT'), + ] + +Sakhalin = Sakhalin() + diff --git a/vendor/pytz/zoneinfo/Asia/Samarkand.py b/vendor/pytz/zoneinfo/Asia/Samarkand.py new file mode 100644 index 00000000..1a039f74 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Samarkand.py @@ -0,0 +1,72 @@ +'''tzinfo timezone information for Asia/Samarkand.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Samarkand(DstTzInfo): + '''Asia/Samarkand timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Samarkand' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,19,32,48), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,21,0,0), +d(1991,8,31,18,0,0), +d(1991,9,28,21,0,0), +d(1991,12,31,19,0,0), + ] + + _transition_info = [ +i(16020,0,'LMT'), +i(14400,0,'SAMT'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(21600,0,'TAST'), +i(21600,0,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(18000,0,'SAMT'), +i(21600,3600,'SAMST'), +i(21600,3600,'UZST'), +i(18000,0,'UZT'), +i(18000,0,'UZT'), + ] + +Samarkand = Samarkand() + diff --git a/vendor/pytz/zoneinfo/Asia/Seoul.py b/vendor/pytz/zoneinfo/Asia/Seoul.py new file mode 100644 index 00000000..07b9c92b --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Seoul.py @@ -0,0 +1,44 @@ +'''tzinfo timezone information for Asia/Seoul.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Seoul(DstTzInfo): + '''Asia/Seoul timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Seoul' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,11,30,15,30,0), +d(1927,12,31,15,0,0), +d(1931,12,31,15,30,0), +d(1954,3,20,15,0,0), +d(1960,5,14,16,0,0), +d(1960,9,12,15,0,0), +d(1961,8,9,16,0,0), +d(1968,9,30,15,30,0), +d(1987,5,9,15,0,0), +d(1987,10,10,14,0,0), +d(1988,5,7,15,0,0), +d(1988,10,8,14,0,0), + ] + + _transition_info = [ +i(30600,0,'KST'), +i(32400,0,'KST'), +i(30600,0,'KST'), +i(32400,0,'KST'), +i(28800,0,'KST'), +i(32400,3600,'KDT'), +i(28800,0,'KST'), +i(30600,0,'KST'), +i(32400,0,'KST'), +i(36000,3600,'KDT'), +i(32400,0,'KST'), +i(36000,3600,'KDT'), +i(32400,0,'KST'), + ] + +Seoul = Seoul() + diff --git a/vendor/pytz/zoneinfo/Asia/Shanghai.py b/vendor/pytz/zoneinfo/Asia/Shanghai.py new file mode 100644 index 00000000..51f123b8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Shanghai.py @@ -0,0 +1,54 @@ +'''tzinfo timezone information for Asia/Shanghai.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Shanghai(DstTzInfo): + '''Asia/Shanghai timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Shanghai' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,15,54,8), +d(1940,6,2,16,0,0), +d(1940,9,30,15,0,0), +d(1941,3,15,16,0,0), +d(1941,9,30,15,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(29160,0,'LMT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Shanghai = Shanghai() + diff --git a/vendor/pytz/zoneinfo/Asia/Singapore.py b/vendor/pytz/zoneinfo/Asia/Singapore.py new file mode 100644 index 00000000..952f4c9e --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Singapore.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Asia/Singapore.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Singapore(DstTzInfo): + '''Asia/Singapore timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Singapore' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,5,31,17,4,35), +d(1932,12,31,17,0,0), +d(1935,12,31,16,40,0), +d(1941,8,31,16,40,0), +d(1942,2,15,16,30,0), +d(1945,9,11,15,0,0), +d(1965,8,8,16,30,0), +d(1981,12,31,16,30,0), + ] + + _transition_info = [ +i(24900,0,'SMT'), +i(25200,0,'MALT'), +i(26400,1200,'MALST'), +i(26400,0,'MALT'), +i(27000,0,'MALT'), +i(32400,0,'JST'), +i(27000,0,'MALT'), +i(27000,0,'SGT'), +i(28800,0,'SGT'), + ] + +Singapore = Singapore() + diff --git a/vendor/pytz/zoneinfo/Asia/Taipei.py b/vendor/pytz/zoneinfo/Asia/Taipei.py new file mode 100644 index 00000000..ae23e777 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Taipei.py @@ -0,0 +1,100 @@ +'''tzinfo timezone information for Asia/Taipei.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Taipei(DstTzInfo): + '''Asia/Taipei timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Taipei' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1945,4,30,16,0,0), +d(1945,9,30,15,0,0), +d(1946,4,30,16,0,0), +d(1946,9,30,15,0,0), +d(1947,4,30,16,0,0), +d(1947,9,30,15,0,0), +d(1948,4,30,16,0,0), +d(1948,9,30,15,0,0), +d(1949,4,30,16,0,0), +d(1949,9,30,15,0,0), +d(1950,4,30,16,0,0), +d(1950,9,30,15,0,0), +d(1951,4,30,16,0,0), +d(1951,9,30,15,0,0), +d(1952,2,29,16,0,0), +d(1952,10,31,15,0,0), +d(1953,3,31,16,0,0), +d(1953,10,31,15,0,0), +d(1954,3,31,16,0,0), +d(1954,10,31,15,0,0), +d(1955,3,31,16,0,0), +d(1955,9,30,15,0,0), +d(1956,3,31,16,0,0), +d(1956,9,30,15,0,0), +d(1957,3,31,16,0,0), +d(1957,9,30,15,0,0), +d(1958,3,31,16,0,0), +d(1958,9,30,15,0,0), +d(1959,3,31,16,0,0), +d(1959,9,30,15,0,0), +d(1960,5,31,16,0,0), +d(1960,9,30,15,0,0), +d(1961,5,31,16,0,0), +d(1961,9,30,15,0,0), +d(1974,3,31,16,0,0), +d(1974,9,30,15,0,0), +d(1975,3,31,16,0,0), +d(1975,9,30,15,0,0), +d(1980,6,29,16,0,0), +d(1980,9,29,15,0,0), + ] + + _transition_info = [ +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Taipei = Taipei() + diff --git a/vendor/pytz/zoneinfo/Asia/Tashkent.py b/vendor/pytz/zoneinfo/Asia/Tashkent.py new file mode 100644 index 00000000..23ff12e4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Tashkent.py @@ -0,0 +1,72 @@ +'''tzinfo timezone information for Asia/Tashkent.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tashkent(DstTzInfo): + '''Asia/Tashkent timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Tashkent' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,19,22,48), +d(1930,6,20,19,0,0), +d(1981,3,31,18,0,0), +d(1981,9,30,17,0,0), +d(1982,3,31,18,0,0), +d(1982,9,30,17,0,0), +d(1983,3,31,18,0,0), +d(1983,9,30,17,0,0), +d(1984,3,31,18,0,0), +d(1984,9,29,20,0,0), +d(1985,3,30,20,0,0), +d(1985,9,28,20,0,0), +d(1986,3,29,20,0,0), +d(1986,9,27,20,0,0), +d(1987,3,28,20,0,0), +d(1987,9,26,20,0,0), +d(1988,3,26,20,0,0), +d(1988,9,24,20,0,0), +d(1989,3,25,20,0,0), +d(1989,9,23,20,0,0), +d(1990,3,24,20,0,0), +d(1990,9,29,20,0,0), +d(1991,3,30,20,0,0), +d(1991,8,31,18,0,0), +d(1991,9,28,21,0,0), +d(1991,12,31,19,0,0), + ] + + _transition_info = [ +i(16620,0,'LMT'), +i(18000,0,'TAST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(25200,3600,'TASST'), +i(21600,0,'TAST'), +i(21600,0,'TASST'), +i(21600,0,'UZST'), +i(18000,0,'UZT'), +i(18000,0,'UZT'), + ] + +Tashkent = Tashkent() + diff --git a/vendor/pytz/zoneinfo/Asia/Tbilisi.py b/vendor/pytz/zoneinfo/Asia/Tbilisi.py new file mode 100644 index 00000000..739a7513 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Tbilisi.py @@ -0,0 +1,126 @@ +'''tzinfo timezone information for Asia/Tbilisi.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tbilisi(DstTzInfo): + '''Asia/Tbilisi timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Tbilisi' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,21,0,44), +d(1957,2,28,21,0,0), +d(1981,3,31,20,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,20,0,0), +d(1982,9,30,19,0,0), +d(1983,3,31,20,0,0), +d(1983,9,30,19,0,0), +d(1984,3,31,20,0,0), +d(1984,9,29,22,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,22,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,22,0,0), +d(1991,3,30,22,0,0), +d(1991,4,8,20,0,0), +d(1991,9,28,23,0,0), +d(1991,12,31,21,0,0), +d(1992,3,28,21,0,0), +d(1992,9,26,20,0,0), +d(1993,3,27,21,0,0), +d(1993,9,25,20,0,0), +d(1994,3,26,21,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,20,0,0), +d(1995,9,23,19,0,0), +d(1996,3,30,20,0,0), +d(1997,3,29,19,0,0), +d(1997,10,25,19,0,0), +d(1998,3,28,20,0,0), +d(1998,10,24,19,0,0), +d(1999,3,27,20,0,0), +d(1999,10,30,19,0,0), +d(2000,3,25,20,0,0), +d(2000,10,28,19,0,0), +d(2001,3,24,20,0,0), +d(2001,10,27,19,0,0), +d(2002,3,30,20,0,0), +d(2002,10,26,19,0,0), +d(2003,3,29,20,0,0), +d(2003,10,25,19,0,0), +d(2004,3,27,20,0,0), +d(2004,6,26,19,0,0), +d(2004,10,30,23,0,0), +d(2005,3,26,23,0,0), + ] + + _transition_info = [ +i(10740,0,'TBMT'), +i(10800,0,'TBIT'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(18000,3600,'TBIST'), +i(14400,0,'TBIT'), +i(14400,0,'TBIST'), +i(14400,0,'GEST'), +i(10800,0,'GET'), +i(10800,0,'GET'), +i(14400,3600,'GEST'), +i(10800,0,'GET'), +i(14400,3600,'GEST'), +i(10800,0,'GET'), +i(14400,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GET'), +i(18000,3600,'GEST'), +i(14400,0,'GEST'), +i(10800,0,'GET'), +i(14400,0,'GET'), + ] + +Tbilisi = Tbilisi() + diff --git a/vendor/pytz/zoneinfo/Asia/Tehran.py b/vendor/pytz/zoneinfo/Asia/Tehran.py new file mode 100644 index 00000000..4da64aef --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Tehran.py @@ -0,0 +1,100 @@ +'''tzinfo timezone information for Asia/Tehran.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tehran(DstTzInfo): + '''Asia/Tehran timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Tehran' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,12,31,20,34,16), +d(1945,12,31,20,34,16), +d(1977,10,31,20,30,0), +d(1978,3,20,20,0,0), +d(1978,10,20,19,0,0), +d(1978,12,31,20,0,0), +d(1979,3,20,20,30,0), +d(1979,9,18,19,30,0), +d(1980,3,20,20,30,0), +d(1980,9,22,19,30,0), +d(1991,5,2,20,30,0), +d(1991,9,21,19,30,0), +d(1992,3,21,20,30,0), +d(1992,9,21,19,30,0), +d(1993,3,21,20,30,0), +d(1993,9,21,19,30,0), +d(1994,3,21,20,30,0), +d(1994,9,21,19,30,0), +d(1995,3,21,20,30,0), +d(1995,9,21,19,30,0), +d(1996,3,20,20,30,0), +d(1996,9,20,19,30,0), +d(1997,3,21,20,30,0), +d(1997,9,21,19,30,0), +d(1998,3,21,20,30,0), +d(1998,9,21,19,30,0), +d(1999,3,21,20,30,0), +d(1999,9,21,19,30,0), +d(2000,3,20,20,30,0), +d(2000,9,20,19,30,0), +d(2001,3,21,20,30,0), +d(2001,9,21,19,30,0), +d(2002,3,21,20,30,0), +d(2002,9,21,19,30,0), +d(2003,3,21,20,30,0), +d(2003,9,21,19,30,0), +d(2004,3,20,20,30,0), +d(2004,9,20,19,30,0), +d(2005,3,21,20,30,0), +d(2005,9,21,19,30,0), + ] + + _transition_info = [ +i(12360,0,'LMT'), +i(12360,0,'TMT'), +i(12600,0,'IRST'), +i(14400,0,'IRST'), +i(18000,3600,'IRDT'), +i(14400,0,'IRST'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), + ] + +Tehran = Tehran() + diff --git a/vendor/pytz/zoneinfo/Asia/Tel_Aviv.py b/vendor/pytz/zoneinfo/Asia/Tel_Aviv.py new file mode 100644 index 00000000..c02fb2da --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Tel_Aviv.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for Asia/Tel_Aviv.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tel_Aviv(DstTzInfo): + '''Asia/Tel_Aviv timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Tel_Aviv' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,12,31,21,39,20), +d(1940,5,31,22,0,0), +d(1942,10,31,21,0,0), +d(1943,4,1,0,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,23,0,0), +d(1946,4,16,0,0,0), +d(1946,10,31,21,0,0), +d(1948,5,22,22,0,0), +d(1948,8,31,20,0,0), +d(1948,10,31,23,0,0), +d(1949,4,30,22,0,0), +d(1949,10,31,23,0,0), +d(1950,4,15,22,0,0), +d(1950,9,15,0,0,0), +d(1951,3,31,22,0,0), +d(1951,11,11,0,0,0), +d(1952,4,20,0,0,0), +d(1952,10,19,0,0,0), +d(1953,4,12,0,0,0), +d(1953,9,13,0,0,0), +d(1954,6,12,22,0,0), +d(1954,9,11,21,0,0), +d(1955,6,11,0,0,0), +d(1955,9,10,21,0,0), +d(1956,6,2,22,0,0), +d(1956,9,30,0,0,0), +d(1957,4,29,0,0,0), +d(1957,9,21,21,0,0), +d(1974,7,6,22,0,0), +d(1974,10,12,21,0,0), +d(1975,4,19,22,0,0), +d(1975,8,30,21,0,0), +d(1985,4,13,22,0,0), +d(1985,9,14,21,0,0), +d(1986,5,17,22,0,0), +d(1986,9,6,21,0,0), +d(1987,4,14,22,0,0), +d(1987,9,12,21,0,0), +d(1988,4,8,22,0,0), +d(1988,9,2,21,0,0), +d(1989,4,29,22,0,0), +d(1989,9,2,21,0,0), +d(1990,3,24,22,0,0), +d(1990,8,25,21,0,0), +d(1991,3,23,22,0,0), +d(1991,8,31,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,5,21,0,0), +d(1993,4,1,22,0,0), +d(1993,9,4,21,0,0), +d(1994,3,31,22,0,0), +d(1994,8,27,21,0,0), +d(1995,3,30,22,0,0), +d(1995,9,2,21,0,0), +d(1996,3,14,22,0,0), +d(1996,9,15,21,0,0), +d(1997,3,20,22,0,0), +d(1997,9,13,21,0,0), +d(1998,3,19,22,0,0), +d(1998,9,5,21,0,0), +d(1999,4,2,0,0,0), +d(1999,9,2,23,0,0), +d(2000,4,14,0,0,0), +d(2000,10,5,22,0,0), +d(2001,4,8,23,0,0), +d(2001,9,23,22,0,0), +d(2002,3,28,23,0,0), +d(2002,10,6,22,0,0), +d(2003,3,27,23,0,0), +d(2003,10,2,22,0,0), +d(2004,4,6,23,0,0), +d(2004,9,21,22,0,0), +d(2005,4,1,0,0,0), +d(2005,10,8,23,0,0), +d(2006,3,31,0,0,0), +d(2006,9,30,23,0,0), +d(2007,3,30,0,0,0), +d(2007,9,15,23,0,0), +d(2008,3,28,0,0,0), +d(2008,10,4,23,0,0), +d(2009,3,27,0,0,0), +d(2009,9,26,23,0,0), +d(2010,3,26,0,0,0), +d(2010,9,11,23,0,0), +d(2011,4,1,0,0,0), +d(2011,10,1,23,0,0), +d(2012,3,30,0,0,0), +d(2012,9,22,23,0,0), +d(2013,3,29,0,0,0), +d(2013,9,7,23,0,0), +d(2014,3,28,0,0,0), +d(2014,9,27,23,0,0), +d(2015,3,27,0,0,0), +d(2015,9,19,23,0,0), +d(2016,4,1,0,0,0), +d(2016,10,8,23,0,0), +d(2017,3,31,0,0,0), +d(2017,9,23,23,0,0), +d(2018,3,30,0,0,0), +d(2018,9,15,23,0,0), +d(2019,3,29,0,0,0), +d(2019,10,5,23,0,0), +d(2020,3,27,0,0,0), +d(2020,9,26,23,0,0), +d(2021,3,26,0,0,0), +d(2021,9,11,23,0,0), +d(2022,4,1,0,0,0), +d(2022,10,1,23,0,0), +d(2023,3,31,0,0,0), +d(2023,9,23,23,0,0), +d(2024,3,29,0,0,0), +d(2024,10,5,23,0,0), +d(2025,3,28,0,0,0), +d(2025,9,27,23,0,0), +d(2026,3,27,0,0,0), +d(2026,9,19,23,0,0), +d(2027,3,26,0,0,0), +d(2027,10,9,23,0,0), +d(2028,3,31,0,0,0), +d(2028,9,23,23,0,0), +d(2029,3,30,0,0,0), +d(2029,9,15,23,0,0), +d(2030,3,29,0,0,0), +d(2030,10,5,23,0,0), +d(2031,3,28,0,0,0), +d(2031,9,20,23,0,0), +d(2032,3,26,0,0,0), +d(2032,9,11,23,0,0), +d(2033,4,1,0,0,0), +d(2033,10,1,23,0,0), +d(2034,3,31,0,0,0), +d(2034,9,16,23,0,0), +d(2035,3,30,0,0,0), +d(2035,10,6,23,0,0), +d(2036,3,28,0,0,0), +d(2036,9,27,23,0,0), +d(2037,3,27,0,0,0), +d(2037,9,12,23,0,0), + ] + + _transition_info = [ +i(8460,0,'JMT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(14400,7200,'IDDT'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), + ] + +Tel_Aviv = Tel_Aviv() + diff --git a/vendor/pytz/zoneinfo/Asia/Thimbu.py b/vendor/pytz/zoneinfo/Asia/Thimbu.py new file mode 100644 index 00000000..adbcb013 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Thimbu.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Thimbu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Thimbu(DstTzInfo): + '''Asia/Thimbu timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Thimbu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1947,8,14,18,1,24), +d(1987,9,30,18,30,0), + ] + + _transition_info = [ +i(21540,0,'LMT'), +i(19800,0,'IST'), +i(21600,0,'BTT'), + ] + +Thimbu = Thimbu() + diff --git a/vendor/pytz/zoneinfo/Asia/Thimphu.py b/vendor/pytz/zoneinfo/Asia/Thimphu.py new file mode 100644 index 00000000..95da5a48 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Thimphu.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Asia/Thimphu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Thimphu(DstTzInfo): + '''Asia/Thimphu timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Thimphu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1947,8,14,18,1,24), +d(1987,9,30,18,30,0), + ] + + _transition_info = [ +i(21540,0,'LMT'), +i(19800,0,'IST'), +i(21600,0,'BTT'), + ] + +Thimphu = Thimphu() + diff --git a/vendor/pytz/zoneinfo/Asia/Tokyo.py b/vendor/pytz/zoneinfo/Asia/Tokyo.py new file mode 100644 index 00000000..887d1307 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Tokyo.py @@ -0,0 +1,38 @@ +'''tzinfo timezone information for Asia/Tokyo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tokyo(DstTzInfo): + '''Asia/Tokyo timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Tokyo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1937,12,31,15,0,0), +d(1948,5,1,17,0,0), +d(1948,9,10,16,0,0), +d(1949,4,2,17,0,0), +d(1949,9,9,16,0,0), +d(1950,5,6,17,0,0), +d(1950,9,8,16,0,0), +d(1951,5,5,17,0,0), +d(1951,9,7,16,0,0), + ] + + _transition_info = [ +i(32400,0,'CJT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), + ] + +Tokyo = Tokyo() + diff --git a/vendor/pytz/zoneinfo/Asia/Ujung_Pandang.py b/vendor/pytz/zoneinfo/Asia/Ujung_Pandang.py new file mode 100644 index 00000000..d4b8ba26 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Ujung_Pandang.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Ujung_Pandang.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ujung_Pandang(DstTzInfo): + '''Asia/Ujung_Pandang timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Ujung_Pandang' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,16,2,24), +d(1932,10,31,16,2,24), +d(1942,2,8,16,0,0), +d(1945,7,31,15,0,0), + ] + + _transition_info = [ +i(28680,0,'LMT'), +i(28680,0,'MMT'), +i(28800,0,'CIT'), +i(32400,0,'JST'), +i(28800,0,'CIT'), + ] + +Ujung_Pandang = Ujung_Pandang() + diff --git a/vendor/pytz/zoneinfo/Asia/Ulaanbaatar.py b/vendor/pytz/zoneinfo/Asia/Ulaanbaatar.py new file mode 100644 index 00000000..44837d89 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Ulaanbaatar.py @@ -0,0 +1,236 @@ +'''tzinfo timezone information for Asia/Ulaanbaatar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ulaanbaatar(DstTzInfo): + '''Asia/Ulaanbaatar timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Ulaanbaatar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,7,31,16,52,28), +d(1977,12,31,17,0,0), +d(1983,3,31,16,0,0), +d(1983,9,30,15,0,0), +d(1984,3,31,16,0,0), +d(1984,9,29,15,0,0), +d(1985,3,30,16,0,0), +d(1985,9,28,15,0,0), +d(1986,3,29,16,0,0), +d(1986,9,27,15,0,0), +d(1987,3,28,16,0,0), +d(1987,9,26,15,0,0), +d(1988,3,26,16,0,0), +d(1988,9,24,15,0,0), +d(1989,3,25,16,0,0), +d(1989,9,23,15,0,0), +d(1990,3,24,16,0,0), +d(1990,9,29,15,0,0), +d(1991,3,30,16,0,0), +d(1991,9,28,15,0,0), +d(1992,3,28,16,0,0), +d(1992,9,26,15,0,0), +d(1993,3,27,16,0,0), +d(1993,9,25,15,0,0), +d(1994,3,26,16,0,0), +d(1994,9,24,15,0,0), +d(1995,3,25,16,0,0), +d(1995,9,23,15,0,0), +d(1996,3,30,16,0,0), +d(1996,9,28,15,0,0), +d(1997,3,29,16,0,0), +d(1997,9,27,15,0,0), +d(1998,3,28,16,0,0), +d(1998,9,26,15,0,0), +d(2001,4,27,18,0,0), +d(2001,9,28,17,0,0), +d(2002,3,29,18,0,0), +d(2002,9,27,17,0,0), +d(2003,3,28,18,0,0), +d(2003,9,26,17,0,0), +d(2004,3,26,18,0,0), +d(2004,9,24,17,0,0), +d(2005,3,25,18,0,0), +d(2005,9,23,17,0,0), +d(2006,3,24,18,0,0), +d(2006,9,29,17,0,0), +d(2007,3,30,18,0,0), +d(2007,9,28,17,0,0), +d(2008,3,28,18,0,0), +d(2008,9,26,17,0,0), +d(2009,3,27,18,0,0), +d(2009,9,25,17,0,0), +d(2010,3,26,18,0,0), +d(2010,9,24,17,0,0), +d(2011,3,25,18,0,0), +d(2011,9,23,17,0,0), +d(2012,3,30,18,0,0), +d(2012,9,28,17,0,0), +d(2013,3,29,18,0,0), +d(2013,9,27,17,0,0), +d(2014,3,28,18,0,0), +d(2014,9,26,17,0,0), +d(2015,3,27,18,0,0), +d(2015,9,25,17,0,0), +d(2016,3,25,18,0,0), +d(2016,9,23,17,0,0), +d(2017,3,24,18,0,0), +d(2017,9,29,17,0,0), +d(2018,3,30,18,0,0), +d(2018,9,28,17,0,0), +d(2019,3,29,18,0,0), +d(2019,9,27,17,0,0), +d(2020,3,27,18,0,0), +d(2020,9,25,17,0,0), +d(2021,3,26,18,0,0), +d(2021,9,24,17,0,0), +d(2022,3,25,18,0,0), +d(2022,9,23,17,0,0), +d(2023,3,24,18,0,0), +d(2023,9,29,17,0,0), +d(2024,3,29,18,0,0), +d(2024,9,27,17,0,0), +d(2025,3,28,18,0,0), +d(2025,9,26,17,0,0), +d(2026,3,27,18,0,0), +d(2026,9,25,17,0,0), +d(2027,3,26,18,0,0), +d(2027,9,24,17,0,0), +d(2028,3,24,18,0,0), +d(2028,9,29,17,0,0), +d(2029,3,30,18,0,0), +d(2029,9,28,17,0,0), +d(2030,3,29,18,0,0), +d(2030,9,27,17,0,0), +d(2031,3,28,18,0,0), +d(2031,9,26,17,0,0), +d(2032,3,26,18,0,0), +d(2032,9,24,17,0,0), +d(2033,3,25,18,0,0), +d(2033,9,23,17,0,0), +d(2034,3,24,18,0,0), +d(2034,9,29,17,0,0), +d(2035,3,30,18,0,0), +d(2035,9,28,17,0,0), +d(2036,3,28,18,0,0), +d(2036,9,26,17,0,0), +d(2037,3,27,18,0,0), +d(2037,9,25,17,0,0), + ] + + _transition_info = [ +i(25680,0,'LMT'), +i(25200,0,'ULAT'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), + ] + +Ulaanbaatar = Ulaanbaatar() + diff --git a/vendor/pytz/zoneinfo/Asia/Ulan_Bator.py b/vendor/pytz/zoneinfo/Asia/Ulan_Bator.py new file mode 100644 index 00000000..9770b55f --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Ulan_Bator.py @@ -0,0 +1,236 @@ +'''tzinfo timezone information for Asia/Ulan_Bator.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ulan_Bator(DstTzInfo): + '''Asia/Ulan_Bator timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Ulan_Bator' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,7,31,16,52,28), +d(1977,12,31,17,0,0), +d(1983,3,31,16,0,0), +d(1983,9,30,15,0,0), +d(1984,3,31,16,0,0), +d(1984,9,29,15,0,0), +d(1985,3,30,16,0,0), +d(1985,9,28,15,0,0), +d(1986,3,29,16,0,0), +d(1986,9,27,15,0,0), +d(1987,3,28,16,0,0), +d(1987,9,26,15,0,0), +d(1988,3,26,16,0,0), +d(1988,9,24,15,0,0), +d(1989,3,25,16,0,0), +d(1989,9,23,15,0,0), +d(1990,3,24,16,0,0), +d(1990,9,29,15,0,0), +d(1991,3,30,16,0,0), +d(1991,9,28,15,0,0), +d(1992,3,28,16,0,0), +d(1992,9,26,15,0,0), +d(1993,3,27,16,0,0), +d(1993,9,25,15,0,0), +d(1994,3,26,16,0,0), +d(1994,9,24,15,0,0), +d(1995,3,25,16,0,0), +d(1995,9,23,15,0,0), +d(1996,3,30,16,0,0), +d(1996,9,28,15,0,0), +d(1997,3,29,16,0,0), +d(1997,9,27,15,0,0), +d(1998,3,28,16,0,0), +d(1998,9,26,15,0,0), +d(2001,4,27,18,0,0), +d(2001,9,28,17,0,0), +d(2002,3,29,18,0,0), +d(2002,9,27,17,0,0), +d(2003,3,28,18,0,0), +d(2003,9,26,17,0,0), +d(2004,3,26,18,0,0), +d(2004,9,24,17,0,0), +d(2005,3,25,18,0,0), +d(2005,9,23,17,0,0), +d(2006,3,24,18,0,0), +d(2006,9,29,17,0,0), +d(2007,3,30,18,0,0), +d(2007,9,28,17,0,0), +d(2008,3,28,18,0,0), +d(2008,9,26,17,0,0), +d(2009,3,27,18,0,0), +d(2009,9,25,17,0,0), +d(2010,3,26,18,0,0), +d(2010,9,24,17,0,0), +d(2011,3,25,18,0,0), +d(2011,9,23,17,0,0), +d(2012,3,30,18,0,0), +d(2012,9,28,17,0,0), +d(2013,3,29,18,0,0), +d(2013,9,27,17,0,0), +d(2014,3,28,18,0,0), +d(2014,9,26,17,0,0), +d(2015,3,27,18,0,0), +d(2015,9,25,17,0,0), +d(2016,3,25,18,0,0), +d(2016,9,23,17,0,0), +d(2017,3,24,18,0,0), +d(2017,9,29,17,0,0), +d(2018,3,30,18,0,0), +d(2018,9,28,17,0,0), +d(2019,3,29,18,0,0), +d(2019,9,27,17,0,0), +d(2020,3,27,18,0,0), +d(2020,9,25,17,0,0), +d(2021,3,26,18,0,0), +d(2021,9,24,17,0,0), +d(2022,3,25,18,0,0), +d(2022,9,23,17,0,0), +d(2023,3,24,18,0,0), +d(2023,9,29,17,0,0), +d(2024,3,29,18,0,0), +d(2024,9,27,17,0,0), +d(2025,3,28,18,0,0), +d(2025,9,26,17,0,0), +d(2026,3,27,18,0,0), +d(2026,9,25,17,0,0), +d(2027,3,26,18,0,0), +d(2027,9,24,17,0,0), +d(2028,3,24,18,0,0), +d(2028,9,29,17,0,0), +d(2029,3,30,18,0,0), +d(2029,9,28,17,0,0), +d(2030,3,29,18,0,0), +d(2030,9,27,17,0,0), +d(2031,3,28,18,0,0), +d(2031,9,26,17,0,0), +d(2032,3,26,18,0,0), +d(2032,9,24,17,0,0), +d(2033,3,25,18,0,0), +d(2033,9,23,17,0,0), +d(2034,3,24,18,0,0), +d(2034,9,29,17,0,0), +d(2035,3,30,18,0,0), +d(2035,9,28,17,0,0), +d(2036,3,28,18,0,0), +d(2036,9,26,17,0,0), +d(2037,3,27,18,0,0), +d(2037,9,25,17,0,0), + ] + + _transition_info = [ +i(25680,0,'LMT'), +i(25200,0,'ULAT'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), +i(32400,3600,'ULAST'), +i(28800,0,'ULAT'), + ] + +Ulan_Bator = Ulan_Bator() + diff --git a/vendor/pytz/zoneinfo/Asia/Urumqi.py b/vendor/pytz/zoneinfo/Asia/Urumqi.py new file mode 100644 index 00000000..8d0d686f --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Urumqi.py @@ -0,0 +1,48 @@ +'''tzinfo timezone information for Asia/Urumqi.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Urumqi(DstTzInfo): + '''Asia/Urumqi timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Urumqi' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,18,9,40), +d(1980,4,30,18,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(21000,0,'LMT'), +i(21600,0,'URUT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +Urumqi = Urumqi() + diff --git a/vendor/pytz/zoneinfo/Asia/Vientiane.py b/vendor/pytz/zoneinfo/Asia/Vientiane.py new file mode 100644 index 00000000..60f57c66 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Vientiane.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Asia/Vientiane.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vientiane(DstTzInfo): + '''Asia/Vientiane timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Vientiane' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,6,8,17,9,36), +d(1911,3,10,16,54,40), +d(1912,4,30,17,0,0), +d(1931,4,30,16,0,0), + ] + + _transition_info = [ +i(24600,0,'LMT'), +i(25560,0,'SMT'), +i(25200,0,'ICT'), +i(28800,0,'ICT'), +i(25200,0,'ICT'), + ] + +Vientiane = Vientiane() + diff --git a/vendor/pytz/zoneinfo/Asia/Vladivostok.py b/vendor/pytz/zoneinfo/Asia/Vladivostok.py new file mode 100644 index 00000000..95a112ce --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Vladivostok.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Vladivostok.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vladivostok(DstTzInfo): + '''Asia/Vladivostok timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Vladivostok' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,11,14,15,12,16), +d(1930,6,20,15,0,0), +d(1981,3,31,14,0,0), +d(1981,9,30,13,0,0), +d(1982,3,31,14,0,0), +d(1982,9,30,13,0,0), +d(1983,3,31,14,0,0), +d(1983,9,30,13,0,0), +d(1984,3,31,14,0,0), +d(1984,9,29,16,0,0), +d(1985,3,30,16,0,0), +d(1985,9,28,16,0,0), +d(1986,3,29,16,0,0), +d(1986,9,27,16,0,0), +d(1987,3,28,16,0,0), +d(1987,9,26,16,0,0), +d(1988,3,26,16,0,0), +d(1988,9,24,16,0,0), +d(1989,3,25,16,0,0), +d(1989,9,23,16,0,0), +d(1990,3,24,16,0,0), +d(1990,9,29,16,0,0), +d(1991,3,30,16,0,0), +d(1991,9,28,17,0,0), +d(1992,1,18,17,0,0), +d(1992,3,28,13,0,0), +d(1992,9,26,12,0,0), +d(1993,3,27,16,0,0), +d(1993,9,25,16,0,0), +d(1994,3,26,16,0,0), +d(1994,9,24,16,0,0), +d(1995,3,25,16,0,0), +d(1995,9,23,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,10,28,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,3,25,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(31680,0,'LMT'), +i(32400,0,'VLAT'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(36000,0,'VLASST'), +i(32400,0,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), +i(39600,3600,'VLAST'), +i(36000,0,'VLAT'), + ] + +Vladivostok = Vladivostok() + diff --git a/vendor/pytz/zoneinfo/Asia/Yakutsk.py b/vendor/pytz/zoneinfo/Asia/Yakutsk.py new file mode 100644 index 00000000..5283f1fc --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Yakutsk.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Yakutsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yakutsk(DstTzInfo): + '''Asia/Yakutsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Yakutsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,14,15,21,20), +d(1930,6,20,16,0,0), +d(1981,3,31,15,0,0), +d(1981,9,30,14,0,0), +d(1982,3,31,15,0,0), +d(1982,9,30,14,0,0), +d(1983,3,31,15,0,0), +d(1983,9,30,14,0,0), +d(1984,3,31,15,0,0), +d(1984,9,29,17,0,0), +d(1985,3,30,17,0,0), +d(1985,9,28,17,0,0), +d(1986,3,29,17,0,0), +d(1986,9,27,17,0,0), +d(1987,3,28,17,0,0), +d(1987,9,26,17,0,0), +d(1988,3,26,17,0,0), +d(1988,9,24,17,0,0), +d(1989,3,25,17,0,0), +d(1989,9,23,17,0,0), +d(1990,3,24,17,0,0), +d(1990,9,29,17,0,0), +d(1991,3,30,17,0,0), +d(1991,9,28,18,0,0), +d(1992,1,18,18,0,0), +d(1992,3,28,14,0,0), +d(1992,9,26,13,0,0), +d(1993,3,27,17,0,0), +d(1993,9,25,17,0,0), +d(1994,3,26,17,0,0), +d(1994,9,24,17,0,0), +d(1995,3,25,17,0,0), +d(1995,9,23,17,0,0), +d(1996,3,30,17,0,0), +d(1996,10,26,17,0,0), +d(1997,3,29,17,0,0), +d(1997,10,25,17,0,0), +d(1998,3,28,17,0,0), +d(1998,10,24,17,0,0), +d(1999,3,27,17,0,0), +d(1999,10,30,17,0,0), +d(2000,3,25,17,0,0), +d(2000,10,28,17,0,0), +d(2001,3,24,17,0,0), +d(2001,10,27,17,0,0), +d(2002,3,30,17,0,0), +d(2002,10,26,17,0,0), +d(2003,3,29,17,0,0), +d(2003,10,25,17,0,0), +d(2004,3,27,17,0,0), +d(2004,10,30,17,0,0), +d(2005,3,26,17,0,0), +d(2005,10,29,17,0,0), +d(2006,3,25,17,0,0), +d(2006,10,28,17,0,0), +d(2007,3,24,17,0,0), +d(2007,10,27,17,0,0), +d(2008,3,29,17,0,0), +d(2008,10,25,17,0,0), +d(2009,3,28,17,0,0), +d(2009,10,24,17,0,0), +d(2010,3,27,17,0,0), +d(2010,10,30,17,0,0), +d(2011,3,26,17,0,0), +d(2011,10,29,17,0,0), +d(2012,3,24,17,0,0), +d(2012,10,27,17,0,0), +d(2013,3,30,17,0,0), +d(2013,10,26,17,0,0), +d(2014,3,29,17,0,0), +d(2014,10,25,17,0,0), +d(2015,3,28,17,0,0), +d(2015,10,24,17,0,0), +d(2016,3,26,17,0,0), +d(2016,10,29,17,0,0), +d(2017,3,25,17,0,0), +d(2017,10,28,17,0,0), +d(2018,3,24,17,0,0), +d(2018,10,27,17,0,0), +d(2019,3,30,17,0,0), +d(2019,10,26,17,0,0), +d(2020,3,28,17,0,0), +d(2020,10,24,17,0,0), +d(2021,3,27,17,0,0), +d(2021,10,30,17,0,0), +d(2022,3,26,17,0,0), +d(2022,10,29,17,0,0), +d(2023,3,25,17,0,0), +d(2023,10,28,17,0,0), +d(2024,3,30,17,0,0), +d(2024,10,26,17,0,0), +d(2025,3,29,17,0,0), +d(2025,10,25,17,0,0), +d(2026,3,28,17,0,0), +d(2026,10,24,17,0,0), +d(2027,3,27,17,0,0), +d(2027,10,30,17,0,0), +d(2028,3,25,17,0,0), +d(2028,10,28,17,0,0), +d(2029,3,24,17,0,0), +d(2029,10,27,17,0,0), +d(2030,3,30,17,0,0), +d(2030,10,26,17,0,0), +d(2031,3,29,17,0,0), +d(2031,10,25,17,0,0), +d(2032,3,27,17,0,0), +d(2032,10,30,17,0,0), +d(2033,3,26,17,0,0), +d(2033,10,29,17,0,0), +d(2034,3,25,17,0,0), +d(2034,10,28,17,0,0), +d(2035,3,24,17,0,0), +d(2035,10,27,17,0,0), +d(2036,3,29,17,0,0), +d(2036,10,25,17,0,0), +d(2037,3,28,17,0,0), +d(2037,10,24,17,0,0), + ] + + _transition_info = [ +i(31140,0,'LMT'), +i(28800,0,'YAKT'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(32400,0,'YAKST'), +i(28800,0,'YAKT'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), +i(36000,3600,'YAKST'), +i(32400,0,'YAKT'), + ] + +Yakutsk = Yakutsk() + diff --git a/vendor/pytz/zoneinfo/Asia/Yekaterinburg.py b/vendor/pytz/zoneinfo/Asia/Yekaterinburg.py new file mode 100644 index 00000000..bc01842c --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Yekaterinburg.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Asia/Yekaterinburg.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yekaterinburg(DstTzInfo): + '''Asia/Yekaterinburg timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Yekaterinburg' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,7,14,23,57,36), +d(1930,6,20,20,0,0), +d(1981,3,31,19,0,0), +d(1981,9,30,18,0,0), +d(1982,3,31,19,0,0), +d(1982,9,30,18,0,0), +d(1983,3,31,19,0,0), +d(1983,9,30,18,0,0), +d(1984,3,31,19,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,21,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,21,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,21,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,21,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,21,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,21,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,21,0,0), +d(1991,9,28,22,0,0), +d(1992,1,18,22,0,0), +d(1992,3,28,18,0,0), +d(1992,9,26,17,0,0), +d(1993,3,27,21,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,21,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,21,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,21,0,0), +d(1996,10,26,21,0,0), +d(1997,3,29,21,0,0), +d(1997,10,25,21,0,0), +d(1998,3,28,21,0,0), +d(1998,10,24,21,0,0), +d(1999,3,27,21,0,0), +d(1999,10,30,21,0,0), +d(2000,3,25,21,0,0), +d(2000,10,28,21,0,0), +d(2001,3,24,21,0,0), +d(2001,10,27,21,0,0), +d(2002,3,30,21,0,0), +d(2002,10,26,21,0,0), +d(2003,3,29,21,0,0), +d(2003,10,25,21,0,0), +d(2004,3,27,21,0,0), +d(2004,10,30,21,0,0), +d(2005,3,26,21,0,0), +d(2005,10,29,21,0,0), +d(2006,3,25,21,0,0), +d(2006,10,28,21,0,0), +d(2007,3,24,21,0,0), +d(2007,10,27,21,0,0), +d(2008,3,29,21,0,0), +d(2008,10,25,21,0,0), +d(2009,3,28,21,0,0), +d(2009,10,24,21,0,0), +d(2010,3,27,21,0,0), +d(2010,10,30,21,0,0), +d(2011,3,26,21,0,0), +d(2011,10,29,21,0,0), +d(2012,3,24,21,0,0), +d(2012,10,27,21,0,0), +d(2013,3,30,21,0,0), +d(2013,10,26,21,0,0), +d(2014,3,29,21,0,0), +d(2014,10,25,21,0,0), +d(2015,3,28,21,0,0), +d(2015,10,24,21,0,0), +d(2016,3,26,21,0,0), +d(2016,10,29,21,0,0), +d(2017,3,25,21,0,0), +d(2017,10,28,21,0,0), +d(2018,3,24,21,0,0), +d(2018,10,27,21,0,0), +d(2019,3,30,21,0,0), +d(2019,10,26,21,0,0), +d(2020,3,28,21,0,0), +d(2020,10,24,21,0,0), +d(2021,3,27,21,0,0), +d(2021,10,30,21,0,0), +d(2022,3,26,21,0,0), +d(2022,10,29,21,0,0), +d(2023,3,25,21,0,0), +d(2023,10,28,21,0,0), +d(2024,3,30,21,0,0), +d(2024,10,26,21,0,0), +d(2025,3,29,21,0,0), +d(2025,10,25,21,0,0), +d(2026,3,28,21,0,0), +d(2026,10,24,21,0,0), +d(2027,3,27,21,0,0), +d(2027,10,30,21,0,0), +d(2028,3,25,21,0,0), +d(2028,10,28,21,0,0), +d(2029,3,24,21,0,0), +d(2029,10,27,21,0,0), +d(2030,3,30,21,0,0), +d(2030,10,26,21,0,0), +d(2031,3,29,21,0,0), +d(2031,10,25,21,0,0), +d(2032,3,27,21,0,0), +d(2032,10,30,21,0,0), +d(2033,3,26,21,0,0), +d(2033,10,29,21,0,0), +d(2034,3,25,21,0,0), +d(2034,10,28,21,0,0), +d(2035,3,24,21,0,0), +d(2035,10,27,21,0,0), +d(2036,3,29,21,0,0), +d(2036,10,25,21,0,0), +d(2037,3,28,21,0,0), +d(2037,10,24,21,0,0), + ] + + _transition_info = [ +i(14520,0,'LMT'), +i(14400,0,'SVET'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(21600,3600,'SVEST'), +i(18000,0,'SVET'), +i(18000,0,'SVEST'), +i(14400,0,'SVET'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), +i(21600,3600,'YEKST'), +i(18000,0,'YEKT'), + ] + +Yekaterinburg = Yekaterinburg() + diff --git a/vendor/pytz/zoneinfo/Asia/Yerevan.py b/vendor/pytz/zoneinfo/Asia/Yerevan.py new file mode 100644 index 00000000..edfd0485 --- /dev/null +++ b/vendor/pytz/zoneinfo/Asia/Yerevan.py @@ -0,0 +1,252 @@ +'''tzinfo timezone information for Asia/Yerevan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yerevan(DstTzInfo): + '''Asia/Yerevan timezone definition. See datetime.tzinfo for details''' + + zone = 'Asia/Yerevan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,21,2,0), +d(1957,2,28,21,0,0), +d(1981,3,31,20,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,20,0,0), +d(1982,9,30,19,0,0), +d(1983,3,31,20,0,0), +d(1983,9,30,19,0,0), +d(1984,3,31,20,0,0), +d(1984,9,29,22,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,22,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,22,0,0), +d(1991,3,30,22,0,0), +d(1991,9,22,20,0,0), +d(1991,9,28,23,0,0), +d(1992,3,28,20,0,0), +d(1992,9,26,19,0,0), +d(1993,3,27,23,0,0), +d(1993,9,25,23,0,0), +d(1994,3,26,23,0,0), +d(1994,9,24,23,0,0), +d(1995,3,25,23,0,0), +d(1995,9,23,23,0,0), +d(1996,12,31,20,0,0), +d(1997,3,29,22,0,0), +d(1997,10,25,22,0,0), +d(1998,3,28,22,0,0), +d(1998,10,24,22,0,0), +d(1999,3,27,22,0,0), +d(1999,10,30,22,0,0), +d(2000,3,25,22,0,0), +d(2000,10,28,22,0,0), +d(2001,3,24,22,0,0), +d(2001,10,27,22,0,0), +d(2002,3,30,22,0,0), +d(2002,10,26,22,0,0), +d(2003,3,29,22,0,0), +d(2003,10,25,22,0,0), +d(2004,3,27,22,0,0), +d(2004,10,30,22,0,0), +d(2005,3,26,22,0,0), +d(2005,10,29,22,0,0), +d(2006,3,25,22,0,0), +d(2006,10,28,22,0,0), +d(2007,3,24,22,0,0), +d(2007,10,27,22,0,0), +d(2008,3,29,22,0,0), +d(2008,10,25,22,0,0), +d(2009,3,28,22,0,0), +d(2009,10,24,22,0,0), +d(2010,3,27,22,0,0), +d(2010,10,30,22,0,0), +d(2011,3,26,22,0,0), +d(2011,10,29,22,0,0), +d(2012,3,24,22,0,0), +d(2012,10,27,22,0,0), +d(2013,3,30,22,0,0), +d(2013,10,26,22,0,0), +d(2014,3,29,22,0,0), +d(2014,10,25,22,0,0), +d(2015,3,28,22,0,0), +d(2015,10,24,22,0,0), +d(2016,3,26,22,0,0), +d(2016,10,29,22,0,0), +d(2017,3,25,22,0,0), +d(2017,10,28,22,0,0), +d(2018,3,24,22,0,0), +d(2018,10,27,22,0,0), +d(2019,3,30,22,0,0), +d(2019,10,26,22,0,0), +d(2020,3,28,22,0,0), +d(2020,10,24,22,0,0), +d(2021,3,27,22,0,0), +d(2021,10,30,22,0,0), +d(2022,3,26,22,0,0), +d(2022,10,29,22,0,0), +d(2023,3,25,22,0,0), +d(2023,10,28,22,0,0), +d(2024,3,30,22,0,0), +d(2024,10,26,22,0,0), +d(2025,3,29,22,0,0), +d(2025,10,25,22,0,0), +d(2026,3,28,22,0,0), +d(2026,10,24,22,0,0), +d(2027,3,27,22,0,0), +d(2027,10,30,22,0,0), +d(2028,3,25,22,0,0), +d(2028,10,28,22,0,0), +d(2029,3,24,22,0,0), +d(2029,10,27,22,0,0), +d(2030,3,30,22,0,0), +d(2030,10,26,22,0,0), +d(2031,3,29,22,0,0), +d(2031,10,25,22,0,0), +d(2032,3,27,22,0,0), +d(2032,10,30,22,0,0), +d(2033,3,26,22,0,0), +d(2033,10,29,22,0,0), +d(2034,3,25,22,0,0), +d(2034,10,28,22,0,0), +d(2035,3,24,22,0,0), +d(2035,10,27,22,0,0), +d(2036,3,29,22,0,0), +d(2036,10,25,22,0,0), +d(2037,3,28,22,0,0), +d(2037,10,24,22,0,0), + ] + + _transition_info = [ +i(10680,0,'LMT'), +i(10800,0,'YERT'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(18000,3600,'YERST'), +i(14400,0,'YERT'), +i(14400,0,'YERST'), +i(14400,0,'AMST'), +i(10800,0,'AMT'), +i(14400,3600,'AMST'), +i(10800,0,'AMT'), +i(14400,3600,'AMST'), +i(10800,0,'AMT'), +i(14400,3600,'AMST'), +i(10800,0,'AMT'), +i(14400,3600,'AMST'), +i(14400,0,'AMT'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), +i(18000,3600,'AMST'), +i(14400,0,'AMT'), + ] + +Yerevan = Yerevan() + diff --git a/vendor/pytz/zoneinfo/Asia/__init__.py b/vendor/pytz/zoneinfo/Asia/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Atlantic/Azores.py b/vendor/pytz/zoneinfo/Atlantic/Azores.py new file mode 100644 index 00000000..b2864aa0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Azores.py @@ -0,0 +1,460 @@ +'''tzinfo timezone information for Atlantic/Azores.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Azores(DstTzInfo): + '''Atlantic/Azores timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Azores' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,24,1,54,32), +d(1916,6,18,1,0,0), +d(1916,11,1,2,0,0), +d(1917,3,1,1,0,0), +d(1917,10,15,1,0,0), +d(1918,3,2,1,0,0), +d(1918,10,15,1,0,0), +d(1919,3,1,1,0,0), +d(1919,10,15,1,0,0), +d(1920,3,1,1,0,0), +d(1920,10,15,1,0,0), +d(1921,3,1,1,0,0), +d(1921,10,15,1,0,0), +d(1924,4,17,1,0,0), +d(1924,10,15,1,0,0), +d(1926,4,18,1,0,0), +d(1926,10,3,1,0,0), +d(1927,4,10,1,0,0), +d(1927,10,2,1,0,0), +d(1928,4,15,1,0,0), +d(1928,10,7,1,0,0), +d(1929,4,21,1,0,0), +d(1929,10,6,1,0,0), +d(1931,4,19,1,0,0), +d(1931,10,4,1,0,0), +d(1932,4,3,1,0,0), +d(1932,10,2,1,0,0), +d(1934,4,8,1,0,0), +d(1934,10,7,1,0,0), +d(1935,3,31,1,0,0), +d(1935,10,6,1,0,0), +d(1936,4,19,1,0,0), +d(1936,10,4,1,0,0), +d(1937,4,4,1,0,0), +d(1937,10,3,1,0,0), +d(1938,3,27,1,0,0), +d(1938,10,2,1,0,0), +d(1939,4,16,1,0,0), +d(1939,11,19,1,0,0), +d(1940,2,25,1,0,0), +d(1940,10,6,1,0,0), +d(1941,4,6,1,0,0), +d(1941,10,6,1,0,0), +d(1942,3,15,1,0,0), +d(1942,4,26,0,0,0), +d(1942,8,16,0,0,0), +d(1942,10,25,1,0,0), +d(1943,3,14,1,0,0), +d(1943,4,18,0,0,0), +d(1943,8,29,0,0,0), +d(1943,10,31,1,0,0), +d(1944,3,12,1,0,0), +d(1944,4,23,0,0,0), +d(1944,8,27,0,0,0), +d(1944,10,29,1,0,0), +d(1945,3,11,1,0,0), +d(1945,4,22,0,0,0), +d(1945,8,26,0,0,0), +d(1945,10,28,1,0,0), +d(1946,4,7,1,0,0), +d(1946,10,6,1,0,0), +d(1947,4,6,4,0,0), +d(1947,10,5,4,0,0), +d(1948,4,4,4,0,0), +d(1948,10,3,4,0,0), +d(1949,4,3,4,0,0), +d(1949,10,2,4,0,0), +d(1951,4,1,4,0,0), +d(1951,10,7,4,0,0), +d(1952,4,6,4,0,0), +d(1952,10,5,4,0,0), +d(1953,4,5,4,0,0), +d(1953,10,4,4,0,0), +d(1954,4,4,4,0,0), +d(1954,10,3,4,0,0), +d(1955,4,3,4,0,0), +d(1955,10,2,4,0,0), +d(1956,4,1,4,0,0), +d(1956,10,7,4,0,0), +d(1957,4,7,4,0,0), +d(1957,10,6,4,0,0), +d(1958,4,6,4,0,0), +d(1958,10,5,4,0,0), +d(1959,4,5,4,0,0), +d(1959,10,4,4,0,0), +d(1960,4,3,4,0,0), +d(1960,10,2,4,0,0), +d(1961,4,2,4,0,0), +d(1961,10,1,4,0,0), +d(1962,4,1,4,0,0), +d(1962,10,7,4,0,0), +d(1963,4,7,4,0,0), +d(1963,10,6,4,0,0), +d(1964,4,5,4,0,0), +d(1964,10,4,4,0,0), +d(1965,4,4,4,0,0), +d(1965,10,3,4,0,0), +d(1966,4,3,4,0,0), +d(1977,3,27,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,2,0,0), +d(1980,3,30,1,0,0), +d(1980,9,28,2,0,0), +d(1981,3,29,2,0,0), +d(1981,9,27,2,0,0), +d(1982,3,28,2,0,0), +d(1982,9,26,2,0,0), +d(1983,3,27,3,0,0), +d(1983,9,25,2,0,0), +d(1984,3,25,2,0,0), +d(1984,9,30,2,0,0), +d(1985,3,31,2,0,0), +d(1985,9,29,2,0,0), +d(1986,3,30,2,0,0), +d(1986,9,28,2,0,0), +d(1987,3,29,2,0,0), +d(1987,9,27,2,0,0), +d(1988,3,27,2,0,0), +d(1988,9,25,2,0,0), +d(1989,3,26,2,0,0), +d(1989,9,24,2,0,0), +d(1990,3,25,2,0,0), +d(1990,9,30,2,0,0), +d(1991,3,31,2,0,0), +d(1991,9,29,2,0,0), +d(1992,3,29,2,0,0), +d(1992,9,27,2,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-6900,0,'HMT'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(0,7200,'AZOMT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(0,7200,'AZOMT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(0,7200,'AZOMT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(0,7200,'AZOMT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,3600,'AZOST'), +i(-7200,0,'AZOT'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(0,0,'WET'), +i(0,0,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), +i(0,3600,'AZOST'), +i(-3600,0,'AZOT'), + ] + +Azores = Azores() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Bermuda.py b/vendor/pytz/zoneinfo/Atlantic/Bermuda.py new file mode 100644 index 00000000..7ef08fd3 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Bermuda.py @@ -0,0 +1,278 @@ +'''tzinfo timezone information for Atlantic/Bermuda.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bermuda(DstTzInfo): + '''Atlantic/Bermuda timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Bermuda' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1930,1,1,6,19,4), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,5,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,5,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,5,0,0), +d(1998,4,5,6,0,0), +d(1998,10,25,5,0,0), +d(1999,4,4,6,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,6,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,6,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,6,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,6,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,6,0,0), +d(2004,10,31,5,0,0), +d(2005,4,3,6,0,0), +d(2005,10,30,5,0,0), +d(2006,4,2,6,0,0), +d(2006,10,29,5,0,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-15540,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Bermuda = Bermuda() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Canary.py b/vendor/pytz/zoneinfo/Atlantic/Canary.py new file mode 100644 index 00000000..e605028e --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Canary.py @@ -0,0 +1,256 @@ +'''tzinfo timezone information for Atlantic/Canary.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Canary(DstTzInfo): + '''Atlantic/Canary timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Canary' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,3,1,1,1,36), +d(1946,9,30,2,0,0), +d(1980,4,6,0,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-3720,0,'LMT'), +i(-3600,0,'CANT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +Canary = Canary() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Cape_Verde.py b/vendor/pytz/zoneinfo/Atlantic/Cape_Verde.py new file mode 100644 index 00000000..8cb51e71 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Cape_Verde.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Atlantic/Cape_Verde.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cape_Verde(DstTzInfo): + '''Atlantic/Cape_Verde timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Cape_Verde' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1907,1,1,1,34,4), +d(1942,9,1,2,0,0), +d(1945,10,15,1,0,0), +d(1975,11,25,4,0,0), + ] + + _transition_info = [ +i(-5640,0,'LMT'), +i(-7200,0,'CVT'), +i(-3600,3600,'CVST'), +i(-7200,0,'CVT'), +i(-3600,0,'CVT'), + ] + +Cape_Verde = Cape_Verde() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Faeroe.py b/vendor/pytz/zoneinfo/Atlantic/Faeroe.py new file mode 100644 index 00000000..4eb16fa3 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Faeroe.py @@ -0,0 +1,250 @@ +'''tzinfo timezone information for Atlantic/Faeroe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Faeroe(DstTzInfo): + '''Atlantic/Faeroe timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Faeroe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,1,11,0,27,4), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-1620,0,'LMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +Faeroe = Faeroe() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Jan_Mayen.py b/vendor/pytz/zoneinfo/Atlantic/Jan_Mayen.py new file mode 100644 index 00000000..6ba69901 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Jan_Mayen.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Atlantic/Jan_Mayen.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jan_Mayen(DstTzInfo): + '''Atlantic/Jan_Mayen timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Jan_Mayen' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,22,0,0,0), +d(1916,9,29,22,0,0), +d(1940,8,10,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,10,1,1,0,0), +d(1959,3,15,1,0,0), +d(1959,9,20,1,0,0), +d(1960,3,20,1,0,0), +d(1960,9,18,1,0,0), +d(1961,3,19,1,0,0), +d(1961,9,17,1,0,0), +d(1962,3,18,1,0,0), +d(1962,9,16,1,0,0), +d(1963,3,17,1,0,0), +d(1963,9,15,1,0,0), +d(1964,3,15,1,0,0), +d(1964,9,20,1,0,0), +d(1965,4,25,1,0,0), +d(1965,9,19,1,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Jan_Mayen = Jan_Mayen() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Madeira.py b/vendor/pytz/zoneinfo/Atlantic/Madeira.py new file mode 100644 index 00000000..ace6fc01 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Madeira.py @@ -0,0 +1,460 @@ +'''tzinfo timezone information for Atlantic/Madeira.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Madeira(DstTzInfo): + '''Atlantic/Madeira timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Madeira' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,24,1,7,36), +d(1916,6,18,0,0,0), +d(1916,11,1,1,0,0), +d(1917,3,1,0,0,0), +d(1917,10,15,0,0,0), +d(1918,3,2,0,0,0), +d(1918,10,15,0,0,0), +d(1919,3,1,0,0,0), +d(1919,10,15,0,0,0), +d(1920,3,1,0,0,0), +d(1920,10,15,0,0,0), +d(1921,3,1,0,0,0), +d(1921,10,15,0,0,0), +d(1924,4,17,0,0,0), +d(1924,10,15,0,0,0), +d(1926,4,18,0,0,0), +d(1926,10,3,0,0,0), +d(1927,4,10,0,0,0), +d(1927,10,2,0,0,0), +d(1928,4,15,0,0,0), +d(1928,10,7,0,0,0), +d(1929,4,21,0,0,0), +d(1929,10,6,0,0,0), +d(1931,4,19,0,0,0), +d(1931,10,4,0,0,0), +d(1932,4,3,0,0,0), +d(1932,10,2,0,0,0), +d(1934,4,8,0,0,0), +d(1934,10,7,0,0,0), +d(1935,3,31,0,0,0), +d(1935,10,6,0,0,0), +d(1936,4,19,0,0,0), +d(1936,10,4,0,0,0), +d(1937,4,4,0,0,0), +d(1937,10,3,0,0,0), +d(1938,3,27,0,0,0), +d(1938,10,2,0,0,0), +d(1939,4,16,0,0,0), +d(1939,11,19,0,0,0), +d(1940,2,25,0,0,0), +d(1940,10,6,0,0,0), +d(1941,4,6,0,0,0), +d(1941,10,6,0,0,0), +d(1942,3,15,0,0,0), +d(1942,4,25,23,0,0), +d(1942,8,15,23,0,0), +d(1942,10,25,0,0,0), +d(1943,3,14,0,0,0), +d(1943,4,17,23,0,0), +d(1943,8,28,23,0,0), +d(1943,10,31,0,0,0), +d(1944,3,12,0,0,0), +d(1944,4,22,23,0,0), +d(1944,8,26,23,0,0), +d(1944,10,29,0,0,0), +d(1945,3,11,0,0,0), +d(1945,4,21,23,0,0), +d(1945,8,25,23,0,0), +d(1945,10,28,0,0,0), +d(1946,4,7,0,0,0), +d(1946,10,6,0,0,0), +d(1947,4,6,3,0,0), +d(1947,10,5,3,0,0), +d(1948,4,4,3,0,0), +d(1948,10,3,3,0,0), +d(1949,4,3,3,0,0), +d(1949,10,2,3,0,0), +d(1951,4,1,3,0,0), +d(1951,10,7,3,0,0), +d(1952,4,6,3,0,0), +d(1952,10,5,3,0,0), +d(1953,4,5,3,0,0), +d(1953,10,4,3,0,0), +d(1954,4,4,3,0,0), +d(1954,10,3,3,0,0), +d(1955,4,3,3,0,0), +d(1955,10,2,3,0,0), +d(1956,4,1,3,0,0), +d(1956,10,7,3,0,0), +d(1957,4,7,3,0,0), +d(1957,10,6,3,0,0), +d(1958,4,6,3,0,0), +d(1958,10,5,3,0,0), +d(1959,4,5,3,0,0), +d(1959,10,4,3,0,0), +d(1960,4,3,3,0,0), +d(1960,10,2,3,0,0), +d(1961,4,2,3,0,0), +d(1961,10,1,3,0,0), +d(1962,4,1,3,0,0), +d(1962,10,7,3,0,0), +d(1963,4,7,3,0,0), +d(1963,10,6,3,0,0), +d(1964,4,5,3,0,0), +d(1964,10,4,3,0,0), +d(1965,4,4,3,0,0), +d(1965,10,3,3,0,0), +d(1966,4,3,3,0,0), +d(1977,3,27,0,0,0), +d(1977,9,25,0,0,0), +d(1978,4,2,0,0,0), +d(1978,10,1,0,0,0), +d(1979,4,1,0,0,0), +d(1979,9,30,1,0,0), +d(1980,3,30,0,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,2,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-4080,0,'FMT'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(3600,7200,'MADMT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(3600,7200,'MADMT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(3600,7200,'MADMT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(3600,7200,'MADMT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,3600,'MADST'), +i(-3600,0,'MADT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +Madeira = Madeira() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Reykjavik.py b/vendor/pytz/zoneinfo/Atlantic/Reykjavik.py new file mode 100644 index 00000000..0d9922b4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Reykjavik.py @@ -0,0 +1,148 @@ +'''tzinfo timezone information for Atlantic/Reykjavik.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Reykjavik(DstTzInfo): + '''Atlantic/Reykjavik timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Reykjavik' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,1,1,1,27,48), +d(1917,2,20,0,0,0), +d(1917,10,21,1,0,0), +d(1918,2,20,0,0,0), +d(1918,11,16,1,0,0), +d(1939,4,30,0,0,0), +d(1939,11,29,2,0,0), +d(1940,2,25,3,0,0), +d(1940,11,3,2,0,0), +d(1941,3,2,2,0,0), +d(1941,11,2,2,0,0), +d(1942,3,8,2,0,0), +d(1942,10,25,2,0,0), +d(1943,3,7,2,0,0), +d(1943,10,24,2,0,0), +d(1944,3,5,2,0,0), +d(1944,10,22,2,0,0), +d(1945,3,4,2,0,0), +d(1945,10,28,2,0,0), +d(1946,3,3,2,0,0), +d(1946,10,27,2,0,0), +d(1947,4,6,2,0,0), +d(1947,10,26,2,0,0), +d(1948,4,4,2,0,0), +d(1948,10,24,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,2,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,1,2,0,0), +d(1951,10,28,2,0,0), +d(1952,4,6,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,5,2,0,0), +d(1953,10,25,2,0,0), +d(1954,4,4,2,0,0), +d(1954,10,24,2,0,0), +d(1955,4,3,2,0,0), +d(1955,10,23,2,0,0), +d(1956,4,1,2,0,0), +d(1956,10,28,2,0,0), +d(1957,4,7,2,0,0), +d(1957,10,27,2,0,0), +d(1958,4,6,2,0,0), +d(1958,10,26,2,0,0), +d(1959,4,5,2,0,0), +d(1959,10,25,2,0,0), +d(1960,4,3,2,0,0), +d(1960,10,23,2,0,0), +d(1961,4,2,2,0,0), +d(1961,10,22,2,0,0), +d(1962,4,1,2,0,0), +d(1962,10,28,2,0,0), +d(1963,4,7,2,0,0), +d(1963,10,27,2,0,0), +d(1964,4,5,2,0,0), +d(1964,10,25,2,0,0), +d(1965,4,4,2,0,0), +d(1965,10,24,2,0,0), +d(1966,4,3,2,0,0), +d(1966,10,23,2,0,0), +d(1967,4,2,2,0,0), +d(1967,10,29,2,0,0), +d(1968,4,7,2,0,0), + ] + + _transition_info = [ +i(-5280,0,'RMT'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,0,'GMT'), + ] + +Reykjavik = Reykjavik() + diff --git a/vendor/pytz/zoneinfo/Atlantic/South_Georgia.py b/vendor/pytz/zoneinfo/Atlantic/South_Georgia.py new file mode 100644 index 00000000..73e393cb --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/South_Georgia.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Atlantic/South_Georgia.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class South_Georgia(StaticTzInfo): + '''Atlantic/South_Georgia timezone definition. See datetime.tzinfo for details''' + zone = 'Atlantic/South_Georgia' + _utcoffset = timedelta(seconds=-7200) + _tzname = 'GST' + +South_Georgia = South_Georgia() + diff --git a/vendor/pytz/zoneinfo/Atlantic/St_Helena.py b/vendor/pytz/zoneinfo/Atlantic/St_Helena.py new file mode 100644 index 00000000..3d372836 --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/St_Helena.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Atlantic/St_Helena.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class St_Helena(DstTzInfo): + '''Atlantic/St_Helena timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/St_Helena' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1951,1,1,0,22,48), + ] + + _transition_info = [ +i(-1380,0,'JMT'), +i(0,0,'GMT'), + ] + +St_Helena = St_Helena() + diff --git a/vendor/pytz/zoneinfo/Atlantic/Stanley.py b/vendor/pytz/zoneinfo/Atlantic/Stanley.py new file mode 100644 index 00000000..3e1ccfcd --- /dev/null +++ b/vendor/pytz/zoneinfo/Atlantic/Stanley.py @@ -0,0 +1,266 @@ +'''tzinfo timezone information for Atlantic/Stanley.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Stanley(DstTzInfo): + '''Atlantic/Stanley timezone definition. See datetime.tzinfo for details''' + + zone = 'Atlantic/Stanley' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,3,12,3,51,24), +d(1937,9,26,4,0,0), +d(1938,3,20,3,0,0), +d(1938,9,25,4,0,0), +d(1939,3,19,3,0,0), +d(1939,10,1,4,0,0), +d(1940,3,24,3,0,0), +d(1940,9,29,4,0,0), +d(1941,3,23,3,0,0), +d(1941,9,28,4,0,0), +d(1942,3,22,3,0,0), +d(1942,9,27,4,0,0), +d(1943,1,1,3,0,0), +d(1983,5,1,4,0,0), +d(1983,9,25,3,0,0), +d(1984,4,29,2,0,0), +d(1984,9,16,3,0,0), +d(1985,4,28,2,0,0), +d(1985,9,15,3,0,0), +d(1986,4,20,3,0,0), +d(1986,9,14,4,0,0), +d(1987,4,19,3,0,0), +d(1987,9,13,4,0,0), +d(1988,4,17,3,0,0), +d(1988,9,11,4,0,0), +d(1989,4,16,3,0,0), +d(1989,9,10,4,0,0), +d(1990,4,22,3,0,0), +d(1990,9,9,4,0,0), +d(1991,4,21,3,0,0), +d(1991,9,15,4,0,0), +d(1992,4,19,3,0,0), +d(1992,9,13,4,0,0), +d(1993,4,18,3,0,0), +d(1993,9,12,4,0,0), +d(1994,4,17,3,0,0), +d(1994,9,11,4,0,0), +d(1995,4,16,3,0,0), +d(1995,9,10,4,0,0), +d(1996,4,21,3,0,0), +d(1996,9,15,4,0,0), +d(1997,4,20,3,0,0), +d(1997,9,14,4,0,0), +d(1998,4,19,3,0,0), +d(1998,9,13,4,0,0), +d(1999,4,18,3,0,0), +d(1999,9,12,4,0,0), +d(2000,4,16,3,0,0), +d(2000,9,10,4,0,0), +d(2001,4,15,5,0,0), +d(2001,9,2,6,0,0), +d(2002,4,21,5,0,0), +d(2002,9,1,6,0,0), +d(2003,4,20,5,0,0), +d(2003,9,7,6,0,0), +d(2004,4,18,5,0,0), +d(2004,9,5,6,0,0), +d(2005,4,17,5,0,0), +d(2005,9,4,6,0,0), +d(2006,4,16,5,0,0), +d(2006,9,3,6,0,0), +d(2007,4,15,5,0,0), +d(2007,9,2,6,0,0), +d(2008,4,20,5,0,0), +d(2008,9,7,6,0,0), +d(2009,4,19,5,0,0), +d(2009,9,6,6,0,0), +d(2010,4,18,5,0,0), +d(2010,9,5,6,0,0), +d(2011,4,17,5,0,0), +d(2011,9,4,6,0,0), +d(2012,4,15,5,0,0), +d(2012,9,2,6,0,0), +d(2013,4,21,5,0,0), +d(2013,9,1,6,0,0), +d(2014,4,20,5,0,0), +d(2014,9,7,6,0,0), +d(2015,4,19,5,0,0), +d(2015,9,6,6,0,0), +d(2016,4,17,5,0,0), +d(2016,9,4,6,0,0), +d(2017,4,16,5,0,0), +d(2017,9,3,6,0,0), +d(2018,4,15,5,0,0), +d(2018,9,2,6,0,0), +d(2019,4,21,5,0,0), +d(2019,9,1,6,0,0), +d(2020,4,19,5,0,0), +d(2020,9,6,6,0,0), +d(2021,4,18,5,0,0), +d(2021,9,5,6,0,0), +d(2022,4,17,5,0,0), +d(2022,9,4,6,0,0), +d(2023,4,16,5,0,0), +d(2023,9,3,6,0,0), +d(2024,4,21,5,0,0), +d(2024,9,1,6,0,0), +d(2025,4,20,5,0,0), +d(2025,9,7,6,0,0), +d(2026,4,19,5,0,0), +d(2026,9,6,6,0,0), +d(2027,4,18,5,0,0), +d(2027,9,5,6,0,0), +d(2028,4,16,5,0,0), +d(2028,9,3,6,0,0), +d(2029,4,15,5,0,0), +d(2029,9,2,6,0,0), +d(2030,4,21,5,0,0), +d(2030,9,1,6,0,0), +d(2031,4,20,5,0,0), +d(2031,9,7,6,0,0), +d(2032,4,18,5,0,0), +d(2032,9,5,6,0,0), +d(2033,4,17,5,0,0), +d(2033,9,4,6,0,0), +d(2034,4,16,5,0,0), +d(2034,9,3,6,0,0), +d(2035,4,15,5,0,0), +d(2035,9,2,6,0,0), +d(2036,4,20,5,0,0), +d(2036,9,7,6,0,0), +d(2037,4,19,5,0,0), +d(2037,9,6,6,0,0), + ] + + _transition_info = [ +i(-13860,0,'SMT'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,0,'FKT'), +i(-7200,3600,'FKST'), +i(-10800,0,'FKT'), +i(-7200,3600,'FKST'), +i(-10800,0,'FKT'), +i(-10800,0,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), +i(-14400,0,'FKT'), +i(-10800,3600,'FKST'), + ] + +Stanley = Stanley() + diff --git a/vendor/pytz/zoneinfo/Atlantic/__init__.py b/vendor/pytz/zoneinfo/Atlantic/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Australia/ACT.py b/vendor/pytz/zoneinfo/Australia/ACT.py new file mode 100644 index 00000000..26b80526 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/ACT.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/ACT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class ACT(DstTzInfo): + '''Australia/ACT timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/ACT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,4,3,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,4,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +ACT = ACT() + diff --git a/vendor/pytz/zoneinfo/Australia/Adelaide.py b/vendor/pytz/zoneinfo/Australia/Adelaide.py new file mode 100644 index 00000000..3b4056f5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Adelaide.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Adelaide.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Adelaide(DstTzInfo): + '''Australia/Adelaide timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Adelaide' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), +d(1971,10,30,16,30,0), +d(1972,2,26,16,30,0), +d(1972,10,28,16,30,0), +d(1973,3,3,16,30,0), +d(1973,10,27,16,30,0), +d(1974,3,2,16,30,0), +d(1974,10,26,16,30,0), +d(1975,3,1,16,30,0), +d(1975,10,25,16,30,0), +d(1976,3,6,16,30,0), +d(1976,10,30,16,30,0), +d(1977,3,5,16,30,0), +d(1977,10,29,16,30,0), +d(1978,3,4,16,30,0), +d(1978,10,28,16,30,0), +d(1979,3,3,16,30,0), +d(1979,10,27,16,30,0), +d(1980,3,1,16,30,0), +d(1980,10,25,16,30,0), +d(1981,2,28,16,30,0), +d(1981,10,24,16,30,0), +d(1982,3,6,16,30,0), +d(1982,10,30,16,30,0), +d(1983,3,5,16,30,0), +d(1983,10,29,16,30,0), +d(1984,3,3,16,30,0), +d(1984,10,27,16,30,0), +d(1985,3,2,16,30,0), +d(1985,10,26,16,30,0), +d(1986,3,15,16,30,0), +d(1986,10,18,16,30,0), +d(1987,3,14,16,30,0), +d(1987,10,24,16,30,0), +d(1988,3,19,16,30,0), +d(1988,10,29,16,30,0), +d(1989,3,18,16,30,0), +d(1989,10,28,16,30,0), +d(1990,3,17,16,30,0), +d(1990,10,27,16,30,0), +d(1991,3,2,16,30,0), +d(1991,10,26,16,30,0), +d(1992,3,21,16,30,0), +d(1992,10,24,16,30,0), +d(1993,3,6,16,30,0), +d(1993,10,30,16,30,0), +d(1994,3,19,16,30,0), +d(1994,10,29,16,30,0), +d(1995,3,25,16,30,0), +d(1995,10,28,16,30,0), +d(1996,3,30,16,30,0), +d(1996,10,26,16,30,0), +d(1997,3,29,16,30,0), +d(1997,10,25,16,30,0), +d(1998,3,28,16,30,0), +d(1998,10,24,16,30,0), +d(1999,3,27,16,30,0), +d(1999,10,30,16,30,0), +d(2000,3,25,16,30,0), +d(2000,10,28,16,30,0), +d(2001,3,24,16,30,0), +d(2001,10,27,16,30,0), +d(2002,3,30,16,30,0), +d(2002,10,26,16,30,0), +d(2003,3,29,16,30,0), +d(2003,10,25,16,30,0), +d(2004,3,27,16,30,0), +d(2004,10,30,16,30,0), +d(2005,3,26,16,30,0), +d(2005,10,29,16,30,0), +d(2006,4,1,16,30,0), +d(2006,10,28,16,30,0), +d(2007,3,24,16,30,0), +d(2007,10,27,16,30,0), +d(2008,3,29,16,30,0), +d(2008,10,25,16,30,0), +d(2009,3,28,16,30,0), +d(2009,10,24,16,30,0), +d(2010,3,27,16,30,0), +d(2010,10,30,16,30,0), +d(2011,3,26,16,30,0), +d(2011,10,29,16,30,0), +d(2012,3,24,16,30,0), +d(2012,10,27,16,30,0), +d(2013,3,30,16,30,0), +d(2013,10,26,16,30,0), +d(2014,3,29,16,30,0), +d(2014,10,25,16,30,0), +d(2015,3,28,16,30,0), +d(2015,10,24,16,30,0), +d(2016,3,26,16,30,0), +d(2016,10,29,16,30,0), +d(2017,3,25,16,30,0), +d(2017,10,28,16,30,0), +d(2018,3,24,16,30,0), +d(2018,10,27,16,30,0), +d(2019,3,30,16,30,0), +d(2019,10,26,16,30,0), +d(2020,3,28,16,30,0), +d(2020,10,24,16,30,0), +d(2021,3,27,16,30,0), +d(2021,10,30,16,30,0), +d(2022,3,26,16,30,0), +d(2022,10,29,16,30,0), +d(2023,3,25,16,30,0), +d(2023,10,28,16,30,0), +d(2024,3,30,16,30,0), +d(2024,10,26,16,30,0), +d(2025,3,29,16,30,0), +d(2025,10,25,16,30,0), +d(2026,3,28,16,30,0), +d(2026,10,24,16,30,0), +d(2027,3,27,16,30,0), +d(2027,10,30,16,30,0), +d(2028,3,25,16,30,0), +d(2028,10,28,16,30,0), +d(2029,3,24,16,30,0), +d(2029,10,27,16,30,0), +d(2030,3,30,16,30,0), +d(2030,10,26,16,30,0), +d(2031,3,29,16,30,0), +d(2031,10,25,16,30,0), +d(2032,3,27,16,30,0), +d(2032,10,30,16,30,0), +d(2033,3,26,16,30,0), +d(2033,10,29,16,30,0), +d(2034,3,25,16,30,0), +d(2034,10,28,16,30,0), +d(2035,3,24,16,30,0), +d(2035,10,27,16,30,0), +d(2036,3,29,16,30,0), +d(2036,10,25,16,30,0), +d(2037,3,28,16,30,0), +d(2037,10,24,16,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), + ] + +Adelaide = Adelaide() + diff --git a/vendor/pytz/zoneinfo/Australia/Brisbane.py b/vendor/pytz/zoneinfo/Australia/Brisbane.py new file mode 100644 index 00000000..31303d9b --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Brisbane.py @@ -0,0 +1,52 @@ +'''tzinfo timezone information for Australia/Brisbane.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Brisbane(DstTzInfo): + '''Australia/Brisbane timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Brisbane' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), + ] + +Brisbane = Brisbane() + diff --git a/vendor/pytz/zoneinfo/Australia/Broken_Hill.py b/vendor/pytz/zoneinfo/Australia/Broken_Hill.py new file mode 100644 index 00000000..dfd7164f --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Broken_Hill.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for Australia/Broken_Hill.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Broken_Hill(DstTzInfo): + '''Australia/Broken_Hill timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Broken_Hill' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), +d(1971,10,30,16,30,0), +d(1972,2,26,16,30,0), +d(1972,10,28,16,30,0), +d(1973,3,3,16,30,0), +d(1973,10,27,16,30,0), +d(1974,3,2,16,30,0), +d(1974,10,26,16,30,0), +d(1975,3,1,16,30,0), +d(1975,10,25,16,30,0), +d(1976,3,6,16,30,0), +d(1976,10,30,16,30,0), +d(1977,3,5,16,30,0), +d(1977,10,29,16,30,0), +d(1978,3,4,16,30,0), +d(1978,10,28,16,30,0), +d(1979,3,3,16,30,0), +d(1979,10,27,16,30,0), +d(1980,3,1,16,30,0), +d(1980,10,25,16,30,0), +d(1981,2,28,16,30,0), +d(1981,10,24,16,30,0), +d(1982,4,3,16,30,0), +d(1982,10,30,16,30,0), +d(1983,3,5,16,30,0), +d(1983,10,29,16,30,0), +d(1984,3,3,16,30,0), +d(1984,10,27,16,30,0), +d(1985,3,2,16,30,0), +d(1985,10,26,16,30,0), +d(1986,3,15,16,30,0), +d(1986,10,18,16,30,0), +d(1987,3,14,16,30,0), +d(1987,10,24,16,30,0), +d(1988,3,19,16,30,0), +d(1988,10,29,16,30,0), +d(1989,3,18,16,30,0), +d(1989,10,28,16,30,0), +d(1990,3,3,16,30,0), +d(1990,10,27,16,30,0), +d(1991,3,2,16,30,0), +d(1991,10,26,16,30,0), +d(1992,2,29,16,30,0), +d(1992,10,24,16,30,0), +d(1993,3,6,16,30,0), +d(1993,10,30,16,30,0), +d(1994,3,5,16,30,0), +d(1994,10,29,16,30,0), +d(1995,3,4,16,30,0), +d(1995,10,28,16,30,0), +d(1996,3,30,16,30,0), +d(1996,10,26,16,30,0), +d(1997,3,29,16,30,0), +d(1997,10,25,16,30,0), +d(1998,3,28,16,30,0), +d(1998,10,24,16,30,0), +d(1999,3,27,16,30,0), +d(1999,10,30,16,30,0), +d(1999,12,31,13,30,0), +d(2000,3,25,16,30,0), +d(2000,10,28,16,30,0), +d(2001,3,24,16,30,0), +d(2001,10,27,16,30,0), +d(2002,3,30,16,30,0), +d(2002,10,26,16,30,0), +d(2003,3,29,16,30,0), +d(2003,10,25,16,30,0), +d(2004,3,27,16,30,0), +d(2004,10,30,16,30,0), +d(2005,3,26,16,30,0), +d(2005,10,29,16,30,0), +d(2006,4,1,16,30,0), +d(2006,10,28,16,30,0), +d(2007,3,24,16,30,0), +d(2007,10,27,16,30,0), +d(2008,3,29,16,30,0), +d(2008,10,25,16,30,0), +d(2009,3,28,16,30,0), +d(2009,10,24,16,30,0), +d(2010,3,27,16,30,0), +d(2010,10,30,16,30,0), +d(2011,3,26,16,30,0), +d(2011,10,29,16,30,0), +d(2012,3,24,16,30,0), +d(2012,10,27,16,30,0), +d(2013,3,30,16,30,0), +d(2013,10,26,16,30,0), +d(2014,3,29,16,30,0), +d(2014,10,25,16,30,0), +d(2015,3,28,16,30,0), +d(2015,10,24,16,30,0), +d(2016,3,26,16,30,0), +d(2016,10,29,16,30,0), +d(2017,3,25,16,30,0), +d(2017,10,28,16,30,0), +d(2018,3,24,16,30,0), +d(2018,10,27,16,30,0), +d(2019,3,30,16,30,0), +d(2019,10,26,16,30,0), +d(2020,3,28,16,30,0), +d(2020,10,24,16,30,0), +d(2021,3,27,16,30,0), +d(2021,10,30,16,30,0), +d(2022,3,26,16,30,0), +d(2022,10,29,16,30,0), +d(2023,3,25,16,30,0), +d(2023,10,28,16,30,0), +d(2024,3,30,16,30,0), +d(2024,10,26,16,30,0), +d(2025,3,29,16,30,0), +d(2025,10,25,16,30,0), +d(2026,3,28,16,30,0), +d(2026,10,24,16,30,0), +d(2027,3,27,16,30,0), +d(2027,10,30,16,30,0), +d(2028,3,25,16,30,0), +d(2028,10,28,16,30,0), +d(2029,3,24,16,30,0), +d(2029,10,27,16,30,0), +d(2030,3,30,16,30,0), +d(2030,10,26,16,30,0), +d(2031,3,29,16,30,0), +d(2031,10,25,16,30,0), +d(2032,3,27,16,30,0), +d(2032,10,30,16,30,0), +d(2033,3,26,16,30,0), +d(2033,10,29,16,30,0), +d(2034,3,25,16,30,0), +d(2034,10,28,16,30,0), +d(2035,3,24,16,30,0), +d(2035,10,27,16,30,0), +d(2036,3,29,16,30,0), +d(2036,10,25,16,30,0), +d(2037,3,28,16,30,0), +d(2037,10,24,16,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), + ] + +Broken_Hill = Broken_Hill() + diff --git a/vendor/pytz/zoneinfo/Australia/Canberra.py b/vendor/pytz/zoneinfo/Australia/Canberra.py new file mode 100644 index 00000000..492137fa --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Canberra.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Canberra.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Canberra(DstTzInfo): + '''Australia/Canberra timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Canberra' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,4,3,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,4,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Canberra = Canberra() + diff --git a/vendor/pytz/zoneinfo/Australia/Currie.py b/vendor/pytz/zoneinfo/Australia/Currie.py new file mode 100644 index 00000000..604b2f75 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Currie.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Currie.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Currie(DstTzInfo): + '''Australia/Currie timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Currie' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,9,30,16,0,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,3,27,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,26,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,1,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,17,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,30,16,0,0), +d(1991,10,5,16,0,0), +d(1992,3,28,16,0,0), +d(1992,10,3,16,0,0), +d(1993,3,27,16,0,0), +d(1993,10,2,16,0,0), +d(1994,3,26,16,0,0), +d(1994,10,1,16,0,0), +d(1995,3,25,16,0,0), +d(1995,9,30,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,5,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,4,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,3,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,2,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,6,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,5,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,4,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,2,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,1,16,0,0), +d(2006,4,1,16,0,0), +d(2006,9,30,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,6,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,4,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,3,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,2,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,1,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,6,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,5,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,4,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,3,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,1,16,0,0), +d(2017,3,25,16,0,0), +d(2017,9,30,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,6,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,5,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,3,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,2,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,1,16,0,0), +d(2023,3,25,16,0,0), +d(2023,9,30,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,5,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,4,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,3,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,2,16,0,0), +d(2028,3,25,16,0,0), +d(2028,9,30,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,6,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,5,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,4,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,2,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,1,16,0,0), +d(2034,3,25,16,0,0), +d(2034,9,30,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,6,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,4,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,3,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Currie = Currie() + diff --git a/vendor/pytz/zoneinfo/Australia/Darwin.py b/vendor/pytz/zoneinfo/Australia/Darwin.py new file mode 100644 index 00000000..d5113c80 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Darwin.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Australia/Darwin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Darwin(DstTzInfo): + '''Australia/Darwin timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Darwin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), + ] + +Darwin = Darwin() + diff --git a/vendor/pytz/zoneinfo/Australia/Hobart.py b/vendor/pytz/zoneinfo/Australia/Hobart.py new file mode 100644 index 00000000..63637312 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Hobart.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for Australia/Hobart.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hobart(DstTzInfo): + '''Australia/Hobart timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Hobart' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,9,30,16,0,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1967,9,30,16,0,0), +d(1968,3,30,16,0,0), +d(1968,10,26,16,0,0), +d(1969,3,8,16,0,0), +d(1969,10,25,16,0,0), +d(1970,3,7,16,0,0), +d(1970,10,24,16,0,0), +d(1971,3,13,16,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,3,27,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,26,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,1,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,17,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,30,16,0,0), +d(1991,10,5,16,0,0), +d(1992,3,28,16,0,0), +d(1992,10,3,16,0,0), +d(1993,3,27,16,0,0), +d(1993,10,2,16,0,0), +d(1994,3,26,16,0,0), +d(1994,10,1,16,0,0), +d(1995,3,25,16,0,0), +d(1995,9,30,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,5,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,4,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,3,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,2,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,6,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,5,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,4,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,2,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,1,16,0,0), +d(2006,4,1,16,0,0), +d(2006,9,30,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,6,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,4,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,3,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,2,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,1,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,6,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,5,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,4,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,3,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,1,16,0,0), +d(2017,3,25,16,0,0), +d(2017,9,30,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,6,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,5,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,3,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,2,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,1,16,0,0), +d(2023,3,25,16,0,0), +d(2023,9,30,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,5,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,4,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,3,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,2,16,0,0), +d(2028,3,25,16,0,0), +d(2028,9,30,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,6,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,5,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,4,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,2,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,1,16,0,0), +d(2034,3,25,16,0,0), +d(2034,9,30,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,6,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,4,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,3,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Hobart = Hobart() + diff --git a/vendor/pytz/zoneinfo/Australia/LHI.py b/vendor/pytz/zoneinfo/Australia/LHI.py new file mode 100644 index 00000000..9eabe245 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/LHI.py @@ -0,0 +1,248 @@ +'''tzinfo timezone information for Australia/LHI.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class LHI(DstTzInfo): + '''Australia/LHI timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/LHI' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,15,30,0), +d(1982,3,6,14,30,0), +d(1982,10,30,15,30,0), +d(1983,3,5,14,30,0), +d(1983,10,29,15,30,0), +d(1984,3,3,14,30,0), +d(1984,10,27,15,30,0), +d(1985,3,2,14,30,0), +d(1985,10,26,15,30,0), +d(1986,3,15,15,0,0), +d(1986,10,18,15,30,0), +d(1987,3,14,15,0,0), +d(1987,10,24,15,30,0), +d(1988,3,19,15,0,0), +d(1988,10,29,15,30,0), +d(1989,3,18,15,0,0), +d(1989,10,28,15,30,0), +d(1990,3,3,15,0,0), +d(1990,10,27,15,30,0), +d(1991,3,2,15,0,0), +d(1991,10,26,15,30,0), +d(1992,2,29,15,0,0), +d(1992,10,24,15,30,0), +d(1993,3,6,15,0,0), +d(1993,10,30,15,30,0), +d(1994,3,5,15,0,0), +d(1994,10,29,15,30,0), +d(1995,3,4,15,0,0), +d(1995,10,28,15,30,0), +d(1996,3,30,15,0,0), +d(1996,10,26,15,30,0), +d(1997,3,29,15,0,0), +d(1997,10,25,15,30,0), +d(1998,3,28,15,0,0), +d(1998,10,24,15,30,0), +d(1999,3,27,15,0,0), +d(1999,10,30,15,30,0), +d(2000,3,25,15,0,0), +d(2000,8,26,15,30,0), +d(2001,3,24,15,0,0), +d(2001,10,27,15,30,0), +d(2002,3,30,15,0,0), +d(2002,10,26,15,30,0), +d(2003,3,29,15,0,0), +d(2003,10,25,15,30,0), +d(2004,3,27,15,0,0), +d(2004,10,30,15,30,0), +d(2005,3,26,15,0,0), +d(2005,10,29,15,30,0), +d(2006,4,1,15,0,0), +d(2006,10,28,15,30,0), +d(2007,3,24,15,0,0), +d(2007,10,27,15,30,0), +d(2008,3,29,15,0,0), +d(2008,10,25,15,30,0), +d(2009,3,28,15,0,0), +d(2009,10,24,15,30,0), +d(2010,3,27,15,0,0), +d(2010,10,30,15,30,0), +d(2011,3,26,15,0,0), +d(2011,10,29,15,30,0), +d(2012,3,24,15,0,0), +d(2012,10,27,15,30,0), +d(2013,3,30,15,0,0), +d(2013,10,26,15,30,0), +d(2014,3,29,15,0,0), +d(2014,10,25,15,30,0), +d(2015,3,28,15,0,0), +d(2015,10,24,15,30,0), +d(2016,3,26,15,0,0), +d(2016,10,29,15,30,0), +d(2017,3,25,15,0,0), +d(2017,10,28,15,30,0), +d(2018,3,24,15,0,0), +d(2018,10,27,15,30,0), +d(2019,3,30,15,0,0), +d(2019,10,26,15,30,0), +d(2020,3,28,15,0,0), +d(2020,10,24,15,30,0), +d(2021,3,27,15,0,0), +d(2021,10,30,15,30,0), +d(2022,3,26,15,0,0), +d(2022,10,29,15,30,0), +d(2023,3,25,15,0,0), +d(2023,10,28,15,30,0), +d(2024,3,30,15,0,0), +d(2024,10,26,15,30,0), +d(2025,3,29,15,0,0), +d(2025,10,25,15,30,0), +d(2026,3,28,15,0,0), +d(2026,10,24,15,30,0), +d(2027,3,27,15,0,0), +d(2027,10,30,15,30,0), +d(2028,3,25,15,0,0), +d(2028,10,28,15,30,0), +d(2029,3,24,15,0,0), +d(2029,10,27,15,30,0), +d(2030,3,30,15,0,0), +d(2030,10,26,15,30,0), +d(2031,3,29,15,0,0), +d(2031,10,25,15,30,0), +d(2032,3,27,15,0,0), +d(2032,10,30,15,30,0), +d(2033,3,26,15,0,0), +d(2033,10,29,15,30,0), +d(2034,3,25,15,0,0), +d(2034,10,28,15,30,0), +d(2035,3,24,15,0,0), +d(2035,10,27,15,30,0), +d(2036,3,29,15,0,0), +d(2036,10,25,15,30,0), +d(2037,3,28,15,0,0), +d(2037,10,24,15,30,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), + ] + +LHI = LHI() + diff --git a/vendor/pytz/zoneinfo/Australia/Lindeman.py b/vendor/pytz/zoneinfo/Australia/Lindeman.py new file mode 100644 index 00000000..8b43a9e4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Lindeman.py @@ -0,0 +1,62 @@ +'''tzinfo timezone information for Australia/Lindeman.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lindeman(DstTzInfo): + '''Australia/Lindeman timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Lindeman' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,6,30,14,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), + ] + +Lindeman = Lindeman() + diff --git a/vendor/pytz/zoneinfo/Australia/Lord_Howe.py b/vendor/pytz/zoneinfo/Australia/Lord_Howe.py new file mode 100644 index 00000000..95acf6bc --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Lord_Howe.py @@ -0,0 +1,248 @@ +'''tzinfo timezone information for Australia/Lord_Howe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lord_Howe(DstTzInfo): + '''Australia/Lord_Howe timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Lord_Howe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,15,30,0), +d(1982,3,6,14,30,0), +d(1982,10,30,15,30,0), +d(1983,3,5,14,30,0), +d(1983,10,29,15,30,0), +d(1984,3,3,14,30,0), +d(1984,10,27,15,30,0), +d(1985,3,2,14,30,0), +d(1985,10,26,15,30,0), +d(1986,3,15,15,0,0), +d(1986,10,18,15,30,0), +d(1987,3,14,15,0,0), +d(1987,10,24,15,30,0), +d(1988,3,19,15,0,0), +d(1988,10,29,15,30,0), +d(1989,3,18,15,0,0), +d(1989,10,28,15,30,0), +d(1990,3,3,15,0,0), +d(1990,10,27,15,30,0), +d(1991,3,2,15,0,0), +d(1991,10,26,15,30,0), +d(1992,2,29,15,0,0), +d(1992,10,24,15,30,0), +d(1993,3,6,15,0,0), +d(1993,10,30,15,30,0), +d(1994,3,5,15,0,0), +d(1994,10,29,15,30,0), +d(1995,3,4,15,0,0), +d(1995,10,28,15,30,0), +d(1996,3,30,15,0,0), +d(1996,10,26,15,30,0), +d(1997,3,29,15,0,0), +d(1997,10,25,15,30,0), +d(1998,3,28,15,0,0), +d(1998,10,24,15,30,0), +d(1999,3,27,15,0,0), +d(1999,10,30,15,30,0), +d(2000,3,25,15,0,0), +d(2000,8,26,15,30,0), +d(2001,3,24,15,0,0), +d(2001,10,27,15,30,0), +d(2002,3,30,15,0,0), +d(2002,10,26,15,30,0), +d(2003,3,29,15,0,0), +d(2003,10,25,15,30,0), +d(2004,3,27,15,0,0), +d(2004,10,30,15,30,0), +d(2005,3,26,15,0,0), +d(2005,10,29,15,30,0), +d(2006,4,1,15,0,0), +d(2006,10,28,15,30,0), +d(2007,3,24,15,0,0), +d(2007,10,27,15,30,0), +d(2008,3,29,15,0,0), +d(2008,10,25,15,30,0), +d(2009,3,28,15,0,0), +d(2009,10,24,15,30,0), +d(2010,3,27,15,0,0), +d(2010,10,30,15,30,0), +d(2011,3,26,15,0,0), +d(2011,10,29,15,30,0), +d(2012,3,24,15,0,0), +d(2012,10,27,15,30,0), +d(2013,3,30,15,0,0), +d(2013,10,26,15,30,0), +d(2014,3,29,15,0,0), +d(2014,10,25,15,30,0), +d(2015,3,28,15,0,0), +d(2015,10,24,15,30,0), +d(2016,3,26,15,0,0), +d(2016,10,29,15,30,0), +d(2017,3,25,15,0,0), +d(2017,10,28,15,30,0), +d(2018,3,24,15,0,0), +d(2018,10,27,15,30,0), +d(2019,3,30,15,0,0), +d(2019,10,26,15,30,0), +d(2020,3,28,15,0,0), +d(2020,10,24,15,30,0), +d(2021,3,27,15,0,0), +d(2021,10,30,15,30,0), +d(2022,3,26,15,0,0), +d(2022,10,29,15,30,0), +d(2023,3,25,15,0,0), +d(2023,10,28,15,30,0), +d(2024,3,30,15,0,0), +d(2024,10,26,15,30,0), +d(2025,3,29,15,0,0), +d(2025,10,25,15,30,0), +d(2026,3,28,15,0,0), +d(2026,10,24,15,30,0), +d(2027,3,27,15,0,0), +d(2027,10,30,15,30,0), +d(2028,3,25,15,0,0), +d(2028,10,28,15,30,0), +d(2029,3,24,15,0,0), +d(2029,10,27,15,30,0), +d(2030,3,30,15,0,0), +d(2030,10,26,15,30,0), +d(2031,3,29,15,0,0), +d(2031,10,25,15,30,0), +d(2032,3,27,15,0,0), +d(2032,10,30,15,30,0), +d(2033,3,26,15,0,0), +d(2033,10,29,15,30,0), +d(2034,3,25,15,0,0), +d(2034,10,28,15,30,0), +d(2035,3,24,15,0,0), +d(2035,10,27,15,30,0), +d(2036,3,29,15,0,0), +d(2036,10,25,15,30,0), +d(2037,3,28,15,0,0), +d(2037,10,24,15,30,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(41400,3600,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), +i(37800,0,'LHST'), +i(39600,1800,'LHST'), + ] + +Lord_Howe = Lord_Howe() + diff --git a/vendor/pytz/zoneinfo/Australia/Melbourne.py b/vendor/pytz/zoneinfo/Australia/Melbourne.py new file mode 100644 index 00000000..a6cde240 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Melbourne.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Melbourne.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Melbourne(DstTzInfo): + '''Australia/Melbourne timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Melbourne' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,3,6,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,17,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,17,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,25,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Melbourne = Melbourne() + diff --git a/vendor/pytz/zoneinfo/Australia/NSW.py b/vendor/pytz/zoneinfo/Australia/NSW.py new file mode 100644 index 00000000..6a821dfb --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/NSW.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/NSW.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class NSW(DstTzInfo): + '''Australia/NSW timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/NSW' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,4,3,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,4,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +NSW = NSW() + diff --git a/vendor/pytz/zoneinfo/Australia/North.py b/vendor/pytz/zoneinfo/Australia/North.py new file mode 100644 index 00000000..5ce0f278 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/North.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Australia/North.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class North(DstTzInfo): + '''Australia/North timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/North' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), + ] + +North = North() + diff --git a/vendor/pytz/zoneinfo/Australia/Perth.py b/vendor/pytz/zoneinfo/Australia/Perth.py new file mode 100644 index 00000000..6da6f97f --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Perth.py @@ -0,0 +1,56 @@ +'''tzinfo timezone information for Australia/Perth.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Perth(DstTzInfo): + '''Australia/Perth timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Perth' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,16,1,0), +d(1917,3,24,17,0,0), +d(1941,12,31,18,0,0), +d(1942,3,28,17,0,0), +d(1942,9,26,18,0,0), +d(1943,3,27,17,0,0), +d(1974,10,26,18,0,0), +d(1975,3,1,18,0,0), +d(1983,10,29,18,0,0), +d(1984,3,3,18,0,0), +d(1991,11,16,18,0,0), +d(1992,2,29,18,0,0), +d(2006,12,2,18,0,0), +d(2007,3,24,18,0,0), +d(2007,10,27,18,0,0), +d(2008,3,29,18,0,0), +d(2008,10,25,18,0,0), +d(2009,3,28,18,0,0), + ] + + _transition_info = [ +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), + ] + +Perth = Perth() + diff --git a/vendor/pytz/zoneinfo/Australia/Queensland.py b/vendor/pytz/zoneinfo/Australia/Queensland.py new file mode 100644 index 00000000..248d5f54 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Queensland.py @@ -0,0 +1,52 @@ +'''tzinfo timezone information for Australia/Queensland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Queensland(DstTzInfo): + '''Australia/Queensland timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Queensland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), + ] + +Queensland = Queensland() + diff --git a/vendor/pytz/zoneinfo/Australia/South.py b/vendor/pytz/zoneinfo/Australia/South.py new file mode 100644 index 00000000..040489b2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/South.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/South.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class South(DstTzInfo): + '''Australia/South timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/South' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), +d(1971,10,30,16,30,0), +d(1972,2,26,16,30,0), +d(1972,10,28,16,30,0), +d(1973,3,3,16,30,0), +d(1973,10,27,16,30,0), +d(1974,3,2,16,30,0), +d(1974,10,26,16,30,0), +d(1975,3,1,16,30,0), +d(1975,10,25,16,30,0), +d(1976,3,6,16,30,0), +d(1976,10,30,16,30,0), +d(1977,3,5,16,30,0), +d(1977,10,29,16,30,0), +d(1978,3,4,16,30,0), +d(1978,10,28,16,30,0), +d(1979,3,3,16,30,0), +d(1979,10,27,16,30,0), +d(1980,3,1,16,30,0), +d(1980,10,25,16,30,0), +d(1981,2,28,16,30,0), +d(1981,10,24,16,30,0), +d(1982,3,6,16,30,0), +d(1982,10,30,16,30,0), +d(1983,3,5,16,30,0), +d(1983,10,29,16,30,0), +d(1984,3,3,16,30,0), +d(1984,10,27,16,30,0), +d(1985,3,2,16,30,0), +d(1985,10,26,16,30,0), +d(1986,3,15,16,30,0), +d(1986,10,18,16,30,0), +d(1987,3,14,16,30,0), +d(1987,10,24,16,30,0), +d(1988,3,19,16,30,0), +d(1988,10,29,16,30,0), +d(1989,3,18,16,30,0), +d(1989,10,28,16,30,0), +d(1990,3,17,16,30,0), +d(1990,10,27,16,30,0), +d(1991,3,2,16,30,0), +d(1991,10,26,16,30,0), +d(1992,3,21,16,30,0), +d(1992,10,24,16,30,0), +d(1993,3,6,16,30,0), +d(1993,10,30,16,30,0), +d(1994,3,19,16,30,0), +d(1994,10,29,16,30,0), +d(1995,3,25,16,30,0), +d(1995,10,28,16,30,0), +d(1996,3,30,16,30,0), +d(1996,10,26,16,30,0), +d(1997,3,29,16,30,0), +d(1997,10,25,16,30,0), +d(1998,3,28,16,30,0), +d(1998,10,24,16,30,0), +d(1999,3,27,16,30,0), +d(1999,10,30,16,30,0), +d(2000,3,25,16,30,0), +d(2000,10,28,16,30,0), +d(2001,3,24,16,30,0), +d(2001,10,27,16,30,0), +d(2002,3,30,16,30,0), +d(2002,10,26,16,30,0), +d(2003,3,29,16,30,0), +d(2003,10,25,16,30,0), +d(2004,3,27,16,30,0), +d(2004,10,30,16,30,0), +d(2005,3,26,16,30,0), +d(2005,10,29,16,30,0), +d(2006,4,1,16,30,0), +d(2006,10,28,16,30,0), +d(2007,3,24,16,30,0), +d(2007,10,27,16,30,0), +d(2008,3,29,16,30,0), +d(2008,10,25,16,30,0), +d(2009,3,28,16,30,0), +d(2009,10,24,16,30,0), +d(2010,3,27,16,30,0), +d(2010,10,30,16,30,0), +d(2011,3,26,16,30,0), +d(2011,10,29,16,30,0), +d(2012,3,24,16,30,0), +d(2012,10,27,16,30,0), +d(2013,3,30,16,30,0), +d(2013,10,26,16,30,0), +d(2014,3,29,16,30,0), +d(2014,10,25,16,30,0), +d(2015,3,28,16,30,0), +d(2015,10,24,16,30,0), +d(2016,3,26,16,30,0), +d(2016,10,29,16,30,0), +d(2017,3,25,16,30,0), +d(2017,10,28,16,30,0), +d(2018,3,24,16,30,0), +d(2018,10,27,16,30,0), +d(2019,3,30,16,30,0), +d(2019,10,26,16,30,0), +d(2020,3,28,16,30,0), +d(2020,10,24,16,30,0), +d(2021,3,27,16,30,0), +d(2021,10,30,16,30,0), +d(2022,3,26,16,30,0), +d(2022,10,29,16,30,0), +d(2023,3,25,16,30,0), +d(2023,10,28,16,30,0), +d(2024,3,30,16,30,0), +d(2024,10,26,16,30,0), +d(2025,3,29,16,30,0), +d(2025,10,25,16,30,0), +d(2026,3,28,16,30,0), +d(2026,10,24,16,30,0), +d(2027,3,27,16,30,0), +d(2027,10,30,16,30,0), +d(2028,3,25,16,30,0), +d(2028,10,28,16,30,0), +d(2029,3,24,16,30,0), +d(2029,10,27,16,30,0), +d(2030,3,30,16,30,0), +d(2030,10,26,16,30,0), +d(2031,3,29,16,30,0), +d(2031,10,25,16,30,0), +d(2032,3,27,16,30,0), +d(2032,10,30,16,30,0), +d(2033,3,26,16,30,0), +d(2033,10,29,16,30,0), +d(2034,3,25,16,30,0), +d(2034,10,28,16,30,0), +d(2035,3,24,16,30,0), +d(2035,10,27,16,30,0), +d(2036,3,29,16,30,0), +d(2036,10,25,16,30,0), +d(2037,3,28,16,30,0), +d(2037,10,24,16,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), + ] + +South = South() + diff --git a/vendor/pytz/zoneinfo/Australia/Sydney.py b/vendor/pytz/zoneinfo/Australia/Sydney.py new file mode 100644 index 00000000..0aba0178 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Sydney.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Sydney.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sydney(DstTzInfo): + '''Australia/Sydney timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Sydney' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,4,3,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,3,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,4,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Sydney = Sydney() + diff --git a/vendor/pytz/zoneinfo/Australia/Tasmania.py b/vendor/pytz/zoneinfo/Australia/Tasmania.py new file mode 100644 index 00000000..a16d293d --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Tasmania.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for Australia/Tasmania.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tasmania(DstTzInfo): + '''Australia/Tasmania timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Tasmania' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,9,30,16,0,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1967,9,30,16,0,0), +d(1968,3,30,16,0,0), +d(1968,10,26,16,0,0), +d(1969,3,8,16,0,0), +d(1969,10,25,16,0,0), +d(1970,3,7,16,0,0), +d(1970,10,24,16,0,0), +d(1971,3,13,16,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,3,27,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,26,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,1,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,24,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,17,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,30,16,0,0), +d(1991,10,5,16,0,0), +d(1992,3,28,16,0,0), +d(1992,10,3,16,0,0), +d(1993,3,27,16,0,0), +d(1993,10,2,16,0,0), +d(1994,3,26,16,0,0), +d(1994,10,1,16,0,0), +d(1995,3,25,16,0,0), +d(1995,9,30,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,5,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,4,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,3,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,2,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,6,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,5,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,4,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,2,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,1,16,0,0), +d(2006,4,1,16,0,0), +d(2006,9,30,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,6,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,4,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,3,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,2,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,1,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,6,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,5,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,4,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,3,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,1,16,0,0), +d(2017,3,25,16,0,0), +d(2017,9,30,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,6,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,5,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,3,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,2,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,1,16,0,0), +d(2023,3,25,16,0,0), +d(2023,9,30,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,5,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,4,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,3,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,2,16,0,0), +d(2028,3,25,16,0,0), +d(2028,9,30,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,6,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,5,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,4,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,2,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,1,16,0,0), +d(2034,3,25,16,0,0), +d(2034,9,30,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,6,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,4,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,3,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Tasmania = Tasmania() + diff --git a/vendor/pytz/zoneinfo/Australia/Victoria.py b/vendor/pytz/zoneinfo/Australia/Victoria.py new file mode 100644 index 00000000..7ce55b5d --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Victoria.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Australia/Victoria.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Victoria(DstTzInfo): + '''Australia/Victoria timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Victoria' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,1,0), +d(1917,3,24,15,0,0), +d(1941,12,31,16,0,0), +d(1942,3,28,15,0,0), +d(1942,9,26,16,0,0), +d(1943,3,27,15,0,0), +d(1943,10,2,16,0,0), +d(1944,3,25,15,0,0), +d(1971,10,30,16,0,0), +d(1972,2,26,16,0,0), +d(1972,10,28,16,0,0), +d(1973,3,3,16,0,0), +d(1973,10,27,16,0,0), +d(1974,3,2,16,0,0), +d(1974,10,26,16,0,0), +d(1975,3,1,16,0,0), +d(1975,10,25,16,0,0), +d(1976,3,6,16,0,0), +d(1976,10,30,16,0,0), +d(1977,3,5,16,0,0), +d(1977,10,29,16,0,0), +d(1978,3,4,16,0,0), +d(1978,10,28,16,0,0), +d(1979,3,3,16,0,0), +d(1979,10,27,16,0,0), +d(1980,3,1,16,0,0), +d(1980,10,25,16,0,0), +d(1981,2,28,16,0,0), +d(1981,10,24,16,0,0), +d(1982,3,6,16,0,0), +d(1982,10,30,16,0,0), +d(1983,3,5,16,0,0), +d(1983,10,29,16,0,0), +d(1984,3,3,16,0,0), +d(1984,10,27,16,0,0), +d(1985,3,2,16,0,0), +d(1985,10,26,16,0,0), +d(1986,3,15,16,0,0), +d(1986,10,18,16,0,0), +d(1987,3,14,16,0,0), +d(1987,10,17,16,0,0), +d(1988,3,19,16,0,0), +d(1988,10,29,16,0,0), +d(1989,3,18,16,0,0), +d(1989,10,28,16,0,0), +d(1990,3,17,16,0,0), +d(1990,10,27,16,0,0), +d(1991,3,2,16,0,0), +d(1991,10,26,16,0,0), +d(1992,2,29,16,0,0), +d(1992,10,24,16,0,0), +d(1993,3,6,16,0,0), +d(1993,10,30,16,0,0), +d(1994,3,5,16,0,0), +d(1994,10,29,16,0,0), +d(1995,3,25,16,0,0), +d(1995,10,28,16,0,0), +d(1996,3,30,16,0,0), +d(1996,10,26,16,0,0), +d(1997,3,29,16,0,0), +d(1997,10,25,16,0,0), +d(1998,3,28,16,0,0), +d(1998,10,24,16,0,0), +d(1999,3,27,16,0,0), +d(1999,10,30,16,0,0), +d(2000,3,25,16,0,0), +d(2000,8,26,16,0,0), +d(2001,3,24,16,0,0), +d(2001,10,27,16,0,0), +d(2002,3,30,16,0,0), +d(2002,10,26,16,0,0), +d(2003,3,29,16,0,0), +d(2003,10,25,16,0,0), +d(2004,3,27,16,0,0), +d(2004,10,30,16,0,0), +d(2005,3,26,16,0,0), +d(2005,10,29,16,0,0), +d(2006,4,1,16,0,0), +d(2006,10,28,16,0,0), +d(2007,3,24,16,0,0), +d(2007,10,27,16,0,0), +d(2008,3,29,16,0,0), +d(2008,10,25,16,0,0), +d(2009,3,28,16,0,0), +d(2009,10,24,16,0,0), +d(2010,3,27,16,0,0), +d(2010,10,30,16,0,0), +d(2011,3,26,16,0,0), +d(2011,10,29,16,0,0), +d(2012,3,24,16,0,0), +d(2012,10,27,16,0,0), +d(2013,3,30,16,0,0), +d(2013,10,26,16,0,0), +d(2014,3,29,16,0,0), +d(2014,10,25,16,0,0), +d(2015,3,28,16,0,0), +d(2015,10,24,16,0,0), +d(2016,3,26,16,0,0), +d(2016,10,29,16,0,0), +d(2017,3,25,16,0,0), +d(2017,10,28,16,0,0), +d(2018,3,24,16,0,0), +d(2018,10,27,16,0,0), +d(2019,3,30,16,0,0), +d(2019,10,26,16,0,0), +d(2020,3,28,16,0,0), +d(2020,10,24,16,0,0), +d(2021,3,27,16,0,0), +d(2021,10,30,16,0,0), +d(2022,3,26,16,0,0), +d(2022,10,29,16,0,0), +d(2023,3,25,16,0,0), +d(2023,10,28,16,0,0), +d(2024,3,30,16,0,0), +d(2024,10,26,16,0,0), +d(2025,3,29,16,0,0), +d(2025,10,25,16,0,0), +d(2026,3,28,16,0,0), +d(2026,10,24,16,0,0), +d(2027,3,27,16,0,0), +d(2027,10,30,16,0,0), +d(2028,3,25,16,0,0), +d(2028,10,28,16,0,0), +d(2029,3,24,16,0,0), +d(2029,10,27,16,0,0), +d(2030,3,30,16,0,0), +d(2030,10,26,16,0,0), +d(2031,3,29,16,0,0), +d(2031,10,25,16,0,0), +d(2032,3,27,16,0,0), +d(2032,10,30,16,0,0), +d(2033,3,26,16,0,0), +d(2033,10,29,16,0,0), +d(2034,3,25,16,0,0), +d(2034,10,28,16,0,0), +d(2035,3,24,16,0,0), +d(2035,10,27,16,0,0), +d(2036,3,29,16,0,0), +d(2036,10,25,16,0,0), +d(2037,3,28,16,0,0), +d(2037,10,24,16,0,0), + ] + + _transition_info = [ +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), +i(36000,0,'EST'), +i(39600,3600,'EST'), + ] + +Victoria = Victoria() + diff --git a/vendor/pytz/zoneinfo/Australia/West.py b/vendor/pytz/zoneinfo/Australia/West.py new file mode 100644 index 00000000..90dc4d7a --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/West.py @@ -0,0 +1,56 @@ +'''tzinfo timezone information for Australia/West.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class West(DstTzInfo): + '''Australia/West timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/West' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,16,1,0), +d(1917,3,24,17,0,0), +d(1941,12,31,18,0,0), +d(1942,3,28,17,0,0), +d(1942,9,26,18,0,0), +d(1943,3,27,17,0,0), +d(1974,10,26,18,0,0), +d(1975,3,1,18,0,0), +d(1983,10,29,18,0,0), +d(1984,3,3,18,0,0), +d(1991,11,16,18,0,0), +d(1992,2,29,18,0,0), +d(2006,12,2,18,0,0), +d(2007,3,24,18,0,0), +d(2007,10,27,18,0,0), +d(2008,3,29,18,0,0), +d(2008,10,25,18,0,0), +d(2009,3,28,18,0,0), + ] + + _transition_info = [ +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), +i(32400,3600,'WST'), +i(28800,0,'WST'), + ] + +West = West() + diff --git a/vendor/pytz/zoneinfo/Australia/Yancowinna.py b/vendor/pytz/zoneinfo/Australia/Yancowinna.py new file mode 100644 index 00000000..5a0883e9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Australia/Yancowinna.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for Australia/Yancowinna.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yancowinna(DstTzInfo): + '''Australia/Yancowinna timezone definition. See datetime.tzinfo for details''' + + zone = 'Australia/Yancowinna' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,14,31,0), +d(1917,3,24,15,30,0), +d(1941,12,31,16,30,0), +d(1942,3,28,15,30,0), +d(1942,9,26,16,30,0), +d(1943,3,27,15,30,0), +d(1943,10,2,16,30,0), +d(1944,3,25,15,30,0), +d(1971,10,30,16,30,0), +d(1972,2,26,16,30,0), +d(1972,10,28,16,30,0), +d(1973,3,3,16,30,0), +d(1973,10,27,16,30,0), +d(1974,3,2,16,30,0), +d(1974,10,26,16,30,0), +d(1975,3,1,16,30,0), +d(1975,10,25,16,30,0), +d(1976,3,6,16,30,0), +d(1976,10,30,16,30,0), +d(1977,3,5,16,30,0), +d(1977,10,29,16,30,0), +d(1978,3,4,16,30,0), +d(1978,10,28,16,30,0), +d(1979,3,3,16,30,0), +d(1979,10,27,16,30,0), +d(1980,3,1,16,30,0), +d(1980,10,25,16,30,0), +d(1981,2,28,16,30,0), +d(1981,10,24,16,30,0), +d(1982,4,3,16,30,0), +d(1982,10,30,16,30,0), +d(1983,3,5,16,30,0), +d(1983,10,29,16,30,0), +d(1984,3,3,16,30,0), +d(1984,10,27,16,30,0), +d(1985,3,2,16,30,0), +d(1985,10,26,16,30,0), +d(1986,3,15,16,30,0), +d(1986,10,18,16,30,0), +d(1987,3,14,16,30,0), +d(1987,10,24,16,30,0), +d(1988,3,19,16,30,0), +d(1988,10,29,16,30,0), +d(1989,3,18,16,30,0), +d(1989,10,28,16,30,0), +d(1990,3,3,16,30,0), +d(1990,10,27,16,30,0), +d(1991,3,2,16,30,0), +d(1991,10,26,16,30,0), +d(1992,2,29,16,30,0), +d(1992,10,24,16,30,0), +d(1993,3,6,16,30,0), +d(1993,10,30,16,30,0), +d(1994,3,5,16,30,0), +d(1994,10,29,16,30,0), +d(1995,3,4,16,30,0), +d(1995,10,28,16,30,0), +d(1996,3,30,16,30,0), +d(1996,10,26,16,30,0), +d(1997,3,29,16,30,0), +d(1997,10,25,16,30,0), +d(1998,3,28,16,30,0), +d(1998,10,24,16,30,0), +d(1999,3,27,16,30,0), +d(1999,10,30,16,30,0), +d(1999,12,31,13,30,0), +d(2000,3,25,16,30,0), +d(2000,10,28,16,30,0), +d(2001,3,24,16,30,0), +d(2001,10,27,16,30,0), +d(2002,3,30,16,30,0), +d(2002,10,26,16,30,0), +d(2003,3,29,16,30,0), +d(2003,10,25,16,30,0), +d(2004,3,27,16,30,0), +d(2004,10,30,16,30,0), +d(2005,3,26,16,30,0), +d(2005,10,29,16,30,0), +d(2006,4,1,16,30,0), +d(2006,10,28,16,30,0), +d(2007,3,24,16,30,0), +d(2007,10,27,16,30,0), +d(2008,3,29,16,30,0), +d(2008,10,25,16,30,0), +d(2009,3,28,16,30,0), +d(2009,10,24,16,30,0), +d(2010,3,27,16,30,0), +d(2010,10,30,16,30,0), +d(2011,3,26,16,30,0), +d(2011,10,29,16,30,0), +d(2012,3,24,16,30,0), +d(2012,10,27,16,30,0), +d(2013,3,30,16,30,0), +d(2013,10,26,16,30,0), +d(2014,3,29,16,30,0), +d(2014,10,25,16,30,0), +d(2015,3,28,16,30,0), +d(2015,10,24,16,30,0), +d(2016,3,26,16,30,0), +d(2016,10,29,16,30,0), +d(2017,3,25,16,30,0), +d(2017,10,28,16,30,0), +d(2018,3,24,16,30,0), +d(2018,10,27,16,30,0), +d(2019,3,30,16,30,0), +d(2019,10,26,16,30,0), +d(2020,3,28,16,30,0), +d(2020,10,24,16,30,0), +d(2021,3,27,16,30,0), +d(2021,10,30,16,30,0), +d(2022,3,26,16,30,0), +d(2022,10,29,16,30,0), +d(2023,3,25,16,30,0), +d(2023,10,28,16,30,0), +d(2024,3,30,16,30,0), +d(2024,10,26,16,30,0), +d(2025,3,29,16,30,0), +d(2025,10,25,16,30,0), +d(2026,3,28,16,30,0), +d(2026,10,24,16,30,0), +d(2027,3,27,16,30,0), +d(2027,10,30,16,30,0), +d(2028,3,25,16,30,0), +d(2028,10,28,16,30,0), +d(2029,3,24,16,30,0), +d(2029,10,27,16,30,0), +d(2030,3,30,16,30,0), +d(2030,10,26,16,30,0), +d(2031,3,29,16,30,0), +d(2031,10,25,16,30,0), +d(2032,3,27,16,30,0), +d(2032,10,30,16,30,0), +d(2033,3,26,16,30,0), +d(2033,10,29,16,30,0), +d(2034,3,25,16,30,0), +d(2034,10,28,16,30,0), +d(2035,3,24,16,30,0), +d(2035,10,27,16,30,0), +d(2036,3,29,16,30,0), +d(2036,10,25,16,30,0), +d(2037,3,28,16,30,0), +d(2037,10,24,16,30,0), + ] + + _transition_info = [ +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), +i(34200,0,'CST'), +i(37800,3600,'CST'), + ] + +Yancowinna = Yancowinna() + diff --git a/vendor/pytz/zoneinfo/Australia/__init__.py b/vendor/pytz/zoneinfo/Australia/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Brazil/Acre.py b/vendor/pytz/zoneinfo/Brazil/Acre.py new file mode 100644 index 00000000..e1f86e97 --- /dev/null +++ b/vendor/pytz/zoneinfo/Brazil/Acre.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for Brazil/Acre.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Acre(DstTzInfo): + '''Brazil/Acre timezone definition. See datetime.tzinfo for details''' + + zone = 'Brazil/Acre' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,31,12), +d(1931,10,3,16,0,0), +d(1932,4,1,4,0,0), +d(1932,10,3,5,0,0), +d(1933,4,1,4,0,0), +d(1949,12,1,5,0,0), +d(1950,4,16,5,0,0), +d(1950,12,1,5,0,0), +d(1951,4,1,4,0,0), +d(1951,12,1,5,0,0), +d(1952,4,1,4,0,0), +d(1952,12,1,5,0,0), +d(1953,3,1,4,0,0), +d(1963,12,9,5,0,0), +d(1964,3,1,4,0,0), +d(1965,1,31,5,0,0), +d(1965,3,31,4,0,0), +d(1965,12,1,5,0,0), +d(1966,3,1,4,0,0), +d(1966,11,1,5,0,0), +d(1967,3,1,4,0,0), +d(1967,11,1,5,0,0), +d(1968,3,1,4,0,0), +d(1985,11,2,5,0,0), +d(1986,3,15,4,0,0), +d(1986,10,25,5,0,0), +d(1987,2,14,4,0,0), +d(1987,10,25,5,0,0), +d(1988,2,7,4,0,0), + ] + + _transition_info = [ +i(-16260,0,'LMT'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), +i(-14400,3600,'ACST'), +i(-18000,0,'ACT'), + ] + +Acre = Acre() + diff --git a/vendor/pytz/zoneinfo/Brazil/DeNoronha.py b/vendor/pytz/zoneinfo/Brazil/DeNoronha.py new file mode 100644 index 00000000..240aac55 --- /dev/null +++ b/vendor/pytz/zoneinfo/Brazil/DeNoronha.py @@ -0,0 +1,98 @@ +'''tzinfo timezone information for Brazil/DeNoronha.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class DeNoronha(DstTzInfo): + '''Brazil/DeNoronha timezone definition. See datetime.tzinfo for details''' + + zone = 'Brazil/DeNoronha' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,2,9,40), +d(1931,10,3,13,0,0), +d(1932,4,1,1,0,0), +d(1932,10,3,2,0,0), +d(1933,4,1,1,0,0), +d(1949,12,1,2,0,0), +d(1950,4,16,2,0,0), +d(1950,12,1,2,0,0), +d(1951,4,1,1,0,0), +d(1951,12,1,2,0,0), +d(1952,4,1,1,0,0), +d(1952,12,1,2,0,0), +d(1953,3,1,1,0,0), +d(1963,12,9,2,0,0), +d(1964,3,1,1,0,0), +d(1965,1,31,2,0,0), +d(1965,3,31,1,0,0), +d(1965,12,1,2,0,0), +d(1966,3,1,1,0,0), +d(1966,11,1,2,0,0), +d(1967,3,1,1,0,0), +d(1967,11,1,2,0,0), +d(1968,3,1,1,0,0), +d(1985,11,2,2,0,0), +d(1986,3,15,1,0,0), +d(1986,10,25,2,0,0), +d(1987,2,14,1,0,0), +d(1987,10,25,2,0,0), +d(1988,2,7,1,0,0), +d(1988,10,16,2,0,0), +d(1989,1,29,1,0,0), +d(1989,10,15,2,0,0), +d(1990,2,11,1,0,0), +d(1999,10,3,2,0,0), +d(2000,2,27,1,0,0), +d(2000,10,8,2,0,0), +d(2000,10,15,1,0,0), +d(2001,10,14,2,0,0), +d(2002,2,17,1,0,0), + ] + + _transition_info = [ +i(-7800,0,'LMT'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), +i(-3600,3600,'FNST'), +i(-7200,0,'FNT'), + ] + +DeNoronha = DeNoronha() + diff --git a/vendor/pytz/zoneinfo/Brazil/East.py b/vendor/pytz/zoneinfo/Brazil/East.py new file mode 100644 index 00000000..0e0c7122 --- /dev/null +++ b/vendor/pytz/zoneinfo/Brazil/East.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for Brazil/East.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class East(DstTzInfo): + '''Brazil/East timezone definition. See datetime.tzinfo for details''' + + zone = 'Brazil/East' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,3,6,28), +d(1931,10,3,14,0,0), +d(1932,4,1,2,0,0), +d(1932,10,3,3,0,0), +d(1933,4,1,2,0,0), +d(1949,12,1,3,0,0), +d(1950,4,16,3,0,0), +d(1950,12,1,3,0,0), +d(1951,4,1,2,0,0), +d(1951,12,1,3,0,0), +d(1952,4,1,2,0,0), +d(1952,12,1,3,0,0), +d(1953,3,1,2,0,0), +d(1963,10,23,3,0,0), +d(1964,3,1,2,0,0), +d(1965,1,31,3,0,0), +d(1965,3,31,2,0,0), +d(1965,12,1,3,0,0), +d(1966,3,1,2,0,0), +d(1966,11,1,3,0,0), +d(1967,3,1,2,0,0), +d(1967,11,1,3,0,0), +d(1968,3,1,2,0,0), +d(1985,11,2,3,0,0), +d(1986,3,15,2,0,0), +d(1986,10,25,3,0,0), +d(1987,2,14,2,0,0), +d(1987,10,25,3,0,0), +d(1988,2,7,2,0,0), +d(1988,10,16,3,0,0), +d(1989,1,29,2,0,0), +d(1989,10,15,3,0,0), +d(1990,2,11,2,0,0), +d(1990,10,21,3,0,0), +d(1991,2,17,2,0,0), +d(1991,10,20,3,0,0), +d(1992,2,9,2,0,0), +d(1992,10,25,3,0,0), +d(1993,1,31,2,0,0), +d(1993,10,17,3,0,0), +d(1994,2,20,2,0,0), +d(1994,10,16,3,0,0), +d(1995,2,19,2,0,0), +d(1995,10,15,3,0,0), +d(1996,2,11,2,0,0), +d(1996,10,6,3,0,0), +d(1997,2,16,2,0,0), +d(1997,10,6,3,0,0), +d(1998,3,1,2,0,0), +d(1998,10,11,3,0,0), +d(1999,2,21,2,0,0), +d(1999,10,3,3,0,0), +d(2000,2,27,2,0,0), +d(2000,10,8,3,0,0), +d(2001,2,18,2,0,0), +d(2001,10,14,3,0,0), +d(2002,2,17,2,0,0), +d(2002,11,3,3,0,0), +d(2003,2,16,2,0,0), +d(2003,10,19,3,0,0), +d(2004,2,15,2,0,0), +d(2004,11,2,3,0,0), +d(2005,2,20,2,0,0), +d(2005,10,16,3,0,0), +d(2006,2,19,2,0,0), +d(2006,11,5,3,0,0), +d(2007,2,25,2,0,0), +d(2007,11,4,3,0,0), +d(2008,2,24,2,0,0), +d(2008,11,2,3,0,0), +d(2009,2,22,2,0,0), +d(2009,11,1,3,0,0), +d(2010,2,28,2,0,0), +d(2010,11,7,3,0,0), +d(2011,2,27,2,0,0), +d(2011,11,6,3,0,0), +d(2012,2,26,2,0,0), +d(2012,11,4,3,0,0), +d(2013,2,24,2,0,0), +d(2013,11,3,3,0,0), +d(2014,2,23,2,0,0), +d(2014,11,2,3,0,0), +d(2015,2,22,2,0,0), +d(2015,11,1,3,0,0), +d(2016,2,28,2,0,0), +d(2016,11,6,3,0,0), +d(2017,2,26,2,0,0), +d(2017,11,5,3,0,0), +d(2018,2,25,2,0,0), +d(2018,11,4,3,0,0), +d(2019,2,24,2,0,0), +d(2019,11,3,3,0,0), +d(2020,2,23,2,0,0), +d(2020,11,1,3,0,0), +d(2021,2,28,2,0,0), +d(2021,11,7,3,0,0), +d(2022,2,27,2,0,0), +d(2022,11,6,3,0,0), +d(2023,2,26,2,0,0), +d(2023,11,5,3,0,0), +d(2024,2,25,2,0,0), +d(2024,11,3,3,0,0), +d(2025,2,23,2,0,0), +d(2025,11,2,3,0,0), +d(2026,2,22,2,0,0), +d(2026,11,1,3,0,0), +d(2027,2,28,2,0,0), +d(2027,11,7,3,0,0), +d(2028,2,27,2,0,0), +d(2028,11,5,3,0,0), +d(2029,2,25,2,0,0), +d(2029,11,4,3,0,0), +d(2030,2,24,2,0,0), +d(2030,11,3,3,0,0), +d(2031,2,23,2,0,0), +d(2031,11,2,3,0,0), +d(2032,2,29,2,0,0), +d(2032,11,7,3,0,0), +d(2033,2,27,2,0,0), +d(2033,11,6,3,0,0), +d(2034,2,26,2,0,0), +d(2034,11,5,3,0,0), +d(2035,2,25,2,0,0), +d(2035,11,4,3,0,0), +d(2036,2,24,2,0,0), +d(2036,11,2,3,0,0), +d(2037,2,22,2,0,0), +d(2037,11,1,3,0,0), + ] + + _transition_info = [ +i(-11160,0,'LMT'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), +i(-10800,0,'BRT'), +i(-7200,3600,'BRST'), + ] + +East = East() + diff --git a/vendor/pytz/zoneinfo/Brazil/West.py b/vendor/pytz/zoneinfo/Brazil/West.py new file mode 100644 index 00000000..b18d9313 --- /dev/null +++ b/vendor/pytz/zoneinfo/Brazil/West.py @@ -0,0 +1,82 @@ +'''tzinfo timezone information for Brazil/West.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class West(DstTzInfo): + '''Brazil/West timezone definition. See datetime.tzinfo for details''' + + zone = 'Brazil/West' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,1,1,4,0,4), +d(1931,10,3,15,0,0), +d(1932,4,1,3,0,0), +d(1932,10,3,4,0,0), +d(1933,4,1,3,0,0), +d(1949,12,1,4,0,0), +d(1950,4,16,4,0,0), +d(1950,12,1,4,0,0), +d(1951,4,1,3,0,0), +d(1951,12,1,4,0,0), +d(1952,4,1,3,0,0), +d(1952,12,1,4,0,0), +d(1953,3,1,3,0,0), +d(1963,12,9,4,0,0), +d(1964,3,1,3,0,0), +d(1965,1,31,4,0,0), +d(1965,3,31,3,0,0), +d(1965,12,1,4,0,0), +d(1966,3,1,3,0,0), +d(1966,11,1,4,0,0), +d(1967,3,1,3,0,0), +d(1967,11,1,4,0,0), +d(1968,3,1,3,0,0), +d(1985,11,2,4,0,0), +d(1986,3,15,3,0,0), +d(1986,10,25,4,0,0), +d(1987,2,14,3,0,0), +d(1987,10,25,4,0,0), +d(1988,2,7,3,0,0), +d(1993,10,17,4,0,0), +d(1994,2,20,3,0,0), + ] + + _transition_info = [ +i(-14400,0,'LMT'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), +i(-10800,3600,'AMST'), +i(-14400,0,'AMT'), + ] + +West = West() + diff --git a/vendor/pytz/zoneinfo/Brazil/__init__.py b/vendor/pytz/zoneinfo/Brazil/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/CET.py b/vendor/pytz/zoneinfo/CET.py new file mode 100644 index 00000000..6de05954 --- /dev/null +++ b/vendor/pytz/zoneinfo/CET.py @@ -0,0 +1,288 @@ +'''tzinfo timezone information for CET.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class CET(DstTzInfo): + '''CET timezone definition. See datetime.tzinfo for details''' + + zone = 'CET' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +CET = CET() + diff --git a/vendor/pytz/zoneinfo/CST6CDT.py b/vendor/pytz/zoneinfo/CST6CDT.py new file mode 100644 index 00000000..ba53cff0 --- /dev/null +++ b/vendor/pytz/zoneinfo/CST6CDT.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for CST6CDT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class CST6CDT(DstTzInfo): + '''CST6CDT timezone definition. See datetime.tzinfo for details''' + + zone = 'CST6CDT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +CST6CDT = CST6CDT() + diff --git a/vendor/pytz/zoneinfo/Canada/Atlantic.py b/vendor/pytz/zoneinfo/Canada/Atlantic.py new file mode 100644 index 00000000..22c41c59 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Atlantic.py @@ -0,0 +1,476 @@ +'''tzinfo timezone information for Canada/Atlantic.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Atlantic(DstTzInfo): + '''Canada/Atlantic timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Atlantic' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1902,6,15,4,14,24), +d(1916,4,1,4,0,0), +d(1916,10,1,3,0,0), +d(1918,4,14,6,0,0), +d(1918,10,31,5,0,0), +d(1920,5,9,4,0,0), +d(1920,8,29,3,0,0), +d(1921,5,6,4,0,0), +d(1921,9,5,3,0,0), +d(1922,4,30,4,0,0), +d(1922,9,5,3,0,0), +d(1923,5,6,4,0,0), +d(1923,9,4,3,0,0), +d(1924,5,4,4,0,0), +d(1924,9,15,3,0,0), +d(1925,5,3,4,0,0), +d(1925,9,28,3,0,0), +d(1926,5,16,4,0,0), +d(1926,9,13,3,0,0), +d(1927,5,1,4,0,0), +d(1927,9,26,3,0,0), +d(1928,5,13,4,0,0), +d(1928,9,9,3,0,0), +d(1929,5,12,4,0,0), +d(1929,9,3,3,0,0), +d(1930,5,11,4,0,0), +d(1930,9,15,3,0,0), +d(1931,5,10,4,0,0), +d(1931,9,28,3,0,0), +d(1932,5,1,4,0,0), +d(1932,9,26,3,0,0), +d(1933,4,30,4,0,0), +d(1933,10,2,3,0,0), +d(1934,5,20,4,0,0), +d(1934,9,16,3,0,0), +d(1935,6,2,4,0,0), +d(1935,9,30,3,0,0), +d(1936,6,1,4,0,0), +d(1936,9,14,3,0,0), +d(1937,5,2,4,0,0), +d(1937,9,27,3,0,0), +d(1938,5,1,4,0,0), +d(1938,9,26,3,0,0), +d(1939,5,28,4,0,0), +d(1939,9,25,3,0,0), +d(1940,5,5,4,0,0), +d(1940,9,30,3,0,0), +d(1941,5,4,4,0,0), +d(1941,9,29,3,0,0), +d(1942,2,9,6,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,5,0,0), +d(1946,4,28,6,0,0), +d(1946,9,29,5,0,0), +d(1947,4,27,6,0,0), +d(1947,9,28,5,0,0), +d(1948,4,25,6,0,0), +d(1948,9,26,5,0,0), +d(1949,4,24,6,0,0), +d(1949,9,25,5,0,0), +d(1951,4,29,6,0,0), +d(1951,9,30,5,0,0), +d(1952,4,27,6,0,0), +d(1952,9,28,5,0,0), +d(1953,4,26,6,0,0), +d(1953,9,27,5,0,0), +d(1954,4,25,6,0,0), +d(1954,9,26,5,0,0), +d(1956,4,29,6,0,0), +d(1956,9,30,5,0,0), +d(1957,4,28,6,0,0), +d(1957,9,29,5,0,0), +d(1958,4,27,6,0,0), +d(1958,9,28,5,0,0), +d(1959,4,26,6,0,0), +d(1959,9,27,5,0,0), +d(1962,4,29,6,0,0), +d(1962,10,28,5,0,0), +d(1963,4,28,6,0,0), +d(1963,10,27,5,0,0), +d(1964,4,26,6,0,0), +d(1964,10,25,5,0,0), +d(1965,4,25,6,0,0), +d(1965,10,31,5,0,0), +d(1966,4,24,6,0,0), +d(1966,10,30,5,0,0), +d(1967,4,30,6,0,0), +d(1967,10,29,5,0,0), +d(1968,4,28,6,0,0), +d(1968,10,27,5,0,0), +d(1969,4,27,6,0,0), +d(1969,10,26,5,0,0), +d(1970,4,26,6,0,0), +d(1970,10,25,5,0,0), +d(1971,4,25,6,0,0), +d(1971,10,31,5,0,0), +d(1972,4,30,6,0,0), +d(1972,10,29,5,0,0), +d(1973,4,29,6,0,0), +d(1973,10,28,5,0,0), +d(1974,4,28,6,0,0), +d(1974,10,27,5,0,0), +d(1975,4,27,6,0,0), +d(1975,10,26,5,0,0), +d(1976,4,25,6,0,0), +d(1976,10,31,5,0,0), +d(1977,4,24,6,0,0), +d(1977,10,30,5,0,0), +d(1978,4,30,6,0,0), +d(1978,10,29,5,0,0), +d(1979,4,29,6,0,0), +d(1979,10,28,5,0,0), +d(1980,4,27,6,0,0), +d(1980,10,26,5,0,0), +d(1981,4,26,6,0,0), +d(1981,10,25,5,0,0), +d(1982,4,25,6,0,0), +d(1982,10,31,5,0,0), +d(1983,4,24,6,0,0), +d(1983,10,30,5,0,0), +d(1984,4,29,6,0,0), +d(1984,10,28,5,0,0), +d(1985,4,28,6,0,0), +d(1985,10,27,5,0,0), +d(1986,4,27,6,0,0), +d(1986,10,26,5,0,0), +d(1987,4,5,6,0,0), +d(1987,10,25,5,0,0), +d(1988,4,3,6,0,0), +d(1988,10,30,5,0,0), +d(1989,4,2,6,0,0), +d(1989,10,29,5,0,0), +d(1990,4,1,6,0,0), +d(1990,10,28,5,0,0), +d(1991,4,7,6,0,0), +d(1991,10,27,5,0,0), +d(1992,4,5,6,0,0), +d(1992,10,25,5,0,0), +d(1993,4,4,6,0,0), +d(1993,10,31,5,0,0), +d(1994,4,3,6,0,0), +d(1994,10,30,5,0,0), +d(1995,4,2,6,0,0), +d(1995,10,29,5,0,0), +d(1996,4,7,6,0,0), +d(1996,10,27,5,0,0), +d(1997,4,6,6,0,0), +d(1997,10,26,5,0,0), +d(1998,4,5,6,0,0), +d(1998,10,25,5,0,0), +d(1999,4,4,6,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,6,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,6,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,6,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,6,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,6,0,0), +d(2004,10,31,5,0,0), +d(2005,4,3,6,0,0), +d(2005,10,30,5,0,0), +d(2006,4,2,6,0,0), +d(2006,10,29,5,0,0), +d(2007,3,11,6,0,0), +d(2007,11,4,5,0,0), +d(2008,3,9,6,0,0), +d(2008,11,2,5,0,0), +d(2009,3,8,6,0,0), +d(2009,11,1,5,0,0), +d(2010,3,14,6,0,0), +d(2010,11,7,5,0,0), +d(2011,3,13,6,0,0), +d(2011,11,6,5,0,0), +d(2012,3,11,6,0,0), +d(2012,11,4,5,0,0), +d(2013,3,10,6,0,0), +d(2013,11,3,5,0,0), +d(2014,3,9,6,0,0), +d(2014,11,2,5,0,0), +d(2015,3,8,6,0,0), +d(2015,11,1,5,0,0), +d(2016,3,13,6,0,0), +d(2016,11,6,5,0,0), +d(2017,3,12,6,0,0), +d(2017,11,5,5,0,0), +d(2018,3,11,6,0,0), +d(2018,11,4,5,0,0), +d(2019,3,10,6,0,0), +d(2019,11,3,5,0,0), +d(2020,3,8,6,0,0), +d(2020,11,1,5,0,0), +d(2021,3,14,6,0,0), +d(2021,11,7,5,0,0), +d(2022,3,13,6,0,0), +d(2022,11,6,5,0,0), +d(2023,3,12,6,0,0), +d(2023,11,5,5,0,0), +d(2024,3,10,6,0,0), +d(2024,11,3,5,0,0), +d(2025,3,9,6,0,0), +d(2025,11,2,5,0,0), +d(2026,3,8,6,0,0), +d(2026,11,1,5,0,0), +d(2027,3,14,6,0,0), +d(2027,11,7,5,0,0), +d(2028,3,12,6,0,0), +d(2028,11,5,5,0,0), +d(2029,3,11,6,0,0), +d(2029,11,4,5,0,0), +d(2030,3,10,6,0,0), +d(2030,11,3,5,0,0), +d(2031,3,9,6,0,0), +d(2031,11,2,5,0,0), +d(2032,3,14,6,0,0), +d(2032,11,7,5,0,0), +d(2033,3,13,6,0,0), +d(2033,11,6,5,0,0), +d(2034,3,12,6,0,0), +d(2034,11,5,5,0,0), +d(2035,3,11,6,0,0), +d(2035,11,4,5,0,0), +d(2036,3,9,6,0,0), +d(2036,11,2,5,0,0), +d(2037,3,8,6,0,0), +d(2037,11,1,5,0,0), + ] + + _transition_info = [ +i(-15240,0,'LMT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'AWT'), +i(-10800,3600,'APT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), +i(-10800,3600,'ADT'), +i(-14400,0,'AST'), + ] + +Atlantic = Atlantic() + diff --git a/vendor/pytz/zoneinfo/Canada/Central.py b/vendor/pytz/zoneinfo/Canada/Central.py new file mode 100644 index 00000000..f268839e --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Central.py @@ -0,0 +1,392 @@ +'''tzinfo timezone information for Canada/Central.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Central(DstTzInfo): + '''Canada/Central timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Central' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,23,6,0,0), +d(1916,9,17,5,0,0), +d(1918,4,14,8,0,0), +d(1918,10,31,7,0,0), +d(1937,5,16,8,0,0), +d(1937,9,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,5,12,8,0,0), +d(1946,10,13,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,5,1,8,0,0), +d(1950,9,30,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,9,25,7,0,0), +d(1956,4,29,8,0,0), +d(1956,9,30,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,9,25,7,0,0), +d(1963,4,28,8,0,0), +d(1963,9,22,7,0,0), +d(1966,4,24,8,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,8,0,0), +d(1974,4,28,8,0,0), +d(1974,10,27,8,0,0), +d(1975,4,27,8,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,8,0,0), +d(2006,1,1,6,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Central = Central() + diff --git a/vendor/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py b/vendor/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py new file mode 100644 index 00000000..950907d8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/East_minus_Saskatchewan.py @@ -0,0 +1,126 @@ +'''tzinfo timezone information for Canada/East_minus_Saskatchewan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class East_minus_Saskatchewan(DstTzInfo): + '''Canada/East_minus_Saskatchewan timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/East_minus_Saskatchewan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,9,1,6,58,36), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1930,5,4,7,0,0), +d(1930,10,5,6,0,0), +d(1931,5,3,7,0,0), +d(1931,10,4,6,0,0), +d(1932,5,1,7,0,0), +d(1932,10,2,6,0,0), +d(1933,5,7,7,0,0), +d(1933,10,1,6,0,0), +d(1934,5,6,7,0,0), +d(1934,10,7,6,0,0), +d(1937,4,11,7,0,0), +d(1937,10,10,6,0,0), +d(1938,4,10,7,0,0), +d(1938,10,2,6,0,0), +d(1939,4,9,7,0,0), +d(1939,10,8,6,0,0), +d(1940,4,14,7,0,0), +d(1940,10,13,6,0,0), +d(1941,4,13,7,0,0), +d(1941,10,12,6,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1946,4,14,9,0,0), +d(1946,10,13,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1948,4,25,9,0,0), +d(1948,9,26,8,0,0), +d(1949,4,24,9,0,0), +d(1949,9,25,8,0,0), +d(1950,4,30,9,0,0), +d(1950,9,24,8,0,0), +d(1951,4,29,9,0,0), +d(1951,9,30,8,0,0), +d(1952,4,27,9,0,0), +d(1952,9,28,8,0,0), +d(1953,4,26,9,0,0), +d(1953,9,27,8,0,0), +d(1954,4,25,9,0,0), +d(1954,9,26,8,0,0), +d(1955,4,24,9,0,0), +d(1955,9,25,8,0,0), +d(1956,4,29,9,0,0), +d(1956,9,30,8,0,0), +d(1957,4,28,9,0,0), +d(1957,9,29,8,0,0), +d(1959,4,26,9,0,0), +d(1959,10,25,8,0,0), +d(1960,4,24,9,0,0), + ] + + _transition_info = [ +i(-25140,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), + ] + +East_minus_Saskatchewan = East_minus_Saskatchewan() + diff --git a/vendor/pytz/zoneinfo/Canada/Eastern.py b/vendor/pytz/zoneinfo/Canada/Eastern.py new file mode 100644 index 00000000..4c30c5f9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Eastern.py @@ -0,0 +1,484 @@ +'''tzinfo timezone information for Canada/Eastern.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Eastern(DstTzInfo): + '''Canada/Eastern timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Eastern' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,7,0,0), +d(1918,10,31,6,0,0), +d(1919,3,31,4,30,0), +d(1919,10,26,4,0,0), +d(1920,5,2,7,0,0), +d(1920,9,26,4,0,0), +d(1921,5,15,7,0,0), +d(1921,9,15,6,0,0), +d(1922,5,14,7,0,0), +d(1922,9,17,6,0,0), +d(1923,5,13,7,0,0), +d(1923,9,16,6,0,0), +d(1924,5,4,7,0,0), +d(1924,9,21,6,0,0), +d(1925,5,3,7,0,0), +d(1925,9,20,6,0,0), +d(1926,5,2,7,0,0), +d(1926,9,19,6,0,0), +d(1927,5,1,7,0,0), +d(1927,9,25,6,0,0), +d(1928,4,29,7,0,0), +d(1928,9,30,6,0,0), +d(1929,4,28,7,0,0), +d(1929,9,29,6,0,0), +d(1930,4,27,7,0,0), +d(1930,9,28,6,0,0), +d(1931,4,26,7,0,0), +d(1931,9,27,6,0,0), +d(1932,5,1,7,0,0), +d(1932,9,25,6,0,0), +d(1933,4,30,7,0,0), +d(1933,10,1,6,0,0), +d(1934,4,29,7,0,0), +d(1934,9,30,6,0,0), +d(1935,4,28,7,0,0), +d(1935,9,29,6,0,0), +d(1936,4,26,7,0,0), +d(1936,9,27,6,0,0), +d(1937,4,25,7,0,0), +d(1937,9,26,6,0,0), +d(1938,4,24,7,0,0), +d(1938,9,25,6,0,0), +d(1939,4,30,7,0,0), +d(1939,9,24,6,0,0), +d(1940,4,28,7,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,5,0,0), +d(1947,9,28,4,0,0), +d(1948,4,25,5,0,0), +d(1948,9,26,4,0,0), +d(1949,4,24,5,0,0), +d(1949,11,27,4,0,0), +d(1950,4,30,7,0,0), +d(1950,11,26,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,9,25,6,0,0), +d(1956,4,29,7,0,0), +d(1956,9,30,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Eastern = Eastern() + diff --git a/vendor/pytz/zoneinfo/Canada/Mountain.py b/vendor/pytz/zoneinfo/Canada/Mountain.py new file mode 100644 index 00000000..91afe383 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Mountain.py @@ -0,0 +1,328 @@ +'''tzinfo timezone information for Canada/Mountain.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mountain(DstTzInfo): + '''Canada/Mountain timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Mountain' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,9,1,7,33,52), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1919,4,13,9,0,0), +d(1919,5,27,8,0,0), +d(1920,4,25,9,0,0), +d(1920,10,31,8,0,0), +d(1921,4,24,9,0,0), +d(1921,9,25,8,0,0), +d(1922,4,30,9,0,0), +d(1922,9,24,8,0,0), +d(1923,4,29,9,0,0), +d(1923,9,30,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,4,28,9,0,0), +d(1974,10,27,8,0,0), +d(1975,4,27,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-27240,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Mountain = Mountain() + diff --git a/vendor/pytz/zoneinfo/Canada/Newfoundland.py b/vendor/pytz/zoneinfo/Canada/Newfoundland.py new file mode 100644 index 00000000..2829f601 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Newfoundland.py @@ -0,0 +1,496 @@ +'''tzinfo timezone information for Canada/Newfoundland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Newfoundland(DstTzInfo): + '''Canada/Newfoundland timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Newfoundland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,4,8,5,30,52), +d(1917,9,17,4,30,52), +d(1918,4,14,5,30,52), +d(1918,10,31,4,30,52), +d(1919,5,6,2,30,52), +d(1919,8,13,1,30,52), +d(1920,5,3,2,30,52), +d(1920,11,1,1,30,52), +d(1921,5,2,2,30,52), +d(1921,10,31,1,30,52), +d(1922,5,8,2,30,52), +d(1922,10,30,1,30,52), +d(1923,5,7,2,30,52), +d(1923,10,29,1,30,52), +d(1924,5,5,2,30,52), +d(1924,10,27,1,30,52), +d(1925,5,4,2,30,52), +d(1925,10,26,1,30,52), +d(1926,5,3,2,30,52), +d(1926,11,1,1,30,52), +d(1927,5,2,2,30,52), +d(1927,10,31,1,30,52), +d(1928,5,7,2,30,52), +d(1928,10,29,1,30,52), +d(1929,5,6,2,30,52), +d(1929,10,28,1,30,52), +d(1930,5,5,2,30,52), +d(1930,10,27,1,30,52), +d(1931,5,4,2,30,52), +d(1931,10,26,1,30,52), +d(1932,5,2,2,30,52), +d(1932,10,31,1,30,52), +d(1933,5,8,2,30,52), +d(1933,10,30,1,30,52), +d(1934,5,7,2,30,52), +d(1934,10,29,1,30,52), +d(1935,3,30,3,30,52), +d(1935,5,6,2,30,0), +d(1935,10,28,1,30,0), +d(1936,5,11,3,30,0), +d(1936,10,5,2,30,0), +d(1937,5,10,3,30,0), +d(1937,10,4,2,30,0), +d(1938,5,9,3,30,0), +d(1938,10,3,2,30,0), +d(1939,5,15,3,30,0), +d(1939,10,2,2,30,0), +d(1940,5,13,3,30,0), +d(1940,10,7,2,30,0), +d(1941,5,12,3,30,0), +d(1941,10,6,2,30,0), +d(1942,5,11,3,30,0), +d(1945,8,14,23,0,0), +d(1945,9,30,4,30,0), +d(1946,5,12,5,30,0), +d(1946,10,6,4,30,0), +d(1947,5,11,5,30,0), +d(1947,10,5,4,30,0), +d(1948,5,9,5,30,0), +d(1948,10,3,4,30,0), +d(1949,5,8,5,30,0), +d(1949,10,2,4,30,0), +d(1950,5,14,5,30,0), +d(1950,10,8,4,30,0), +d(1951,4,29,5,30,0), +d(1951,9,30,4,30,0), +d(1952,4,27,5,30,0), +d(1952,9,28,4,30,0), +d(1953,4,26,5,30,0), +d(1953,9,27,4,30,0), +d(1954,4,25,5,30,0), +d(1954,9,26,4,30,0), +d(1955,4,24,5,30,0), +d(1955,9,25,4,30,0), +d(1956,4,29,5,30,0), +d(1956,9,30,4,30,0), +d(1957,4,28,5,30,0), +d(1957,9,29,4,30,0), +d(1958,4,27,5,30,0), +d(1958,9,28,4,30,0), +d(1959,4,26,5,30,0), +d(1959,9,27,4,30,0), +d(1960,4,24,5,30,0), +d(1960,10,30,4,30,0), +d(1961,4,30,5,30,0), +d(1961,10,29,4,30,0), +d(1962,4,29,5,30,0), +d(1962,10,28,4,30,0), +d(1963,4,28,5,30,0), +d(1963,10,27,4,30,0), +d(1964,4,26,5,30,0), +d(1964,10,25,4,30,0), +d(1965,4,25,5,30,0), +d(1965,10,31,4,30,0), +d(1966,4,24,5,30,0), +d(1966,10,30,4,30,0), +d(1967,4,30,5,30,0), +d(1967,10,29,4,30,0), +d(1968,4,28,5,30,0), +d(1968,10,27,4,30,0), +d(1969,4,27,5,30,0), +d(1969,10,26,4,30,0), +d(1970,4,26,5,30,0), +d(1970,10,25,4,30,0), +d(1971,4,25,5,30,0), +d(1971,10,31,4,30,0), +d(1972,4,30,5,30,0), +d(1972,10,29,4,30,0), +d(1973,4,29,5,30,0), +d(1973,10,28,4,30,0), +d(1974,4,28,5,30,0), +d(1974,10,27,4,30,0), +d(1975,4,27,5,30,0), +d(1975,10,26,4,30,0), +d(1976,4,25,5,30,0), +d(1976,10,31,4,30,0), +d(1977,4,24,5,30,0), +d(1977,10,30,4,30,0), +d(1978,4,30,5,30,0), +d(1978,10,29,4,30,0), +d(1979,4,29,5,30,0), +d(1979,10,28,4,30,0), +d(1980,4,27,5,30,0), +d(1980,10,26,4,30,0), +d(1981,4,26,5,30,0), +d(1981,10,25,4,30,0), +d(1982,4,25,5,30,0), +d(1982,10,31,4,30,0), +d(1983,4,24,5,30,0), +d(1983,10,30,4,30,0), +d(1984,4,29,5,30,0), +d(1984,10,28,4,30,0), +d(1985,4,28,5,30,0), +d(1985,10,27,4,30,0), +d(1986,4,27,5,30,0), +d(1986,10,26,4,30,0), +d(1987,4,5,3,31,0), +d(1987,10,25,2,31,0), +d(1988,4,3,3,31,0), +d(1988,10,30,1,31,0), +d(1989,4,2,3,31,0), +d(1989,10,29,2,31,0), +d(1990,4,1,3,31,0), +d(1990,10,28,2,31,0), +d(1991,4,7,3,31,0), +d(1991,10,27,2,31,0), +d(1992,4,5,3,31,0), +d(1992,10,25,2,31,0), +d(1993,4,4,3,31,0), +d(1993,10,31,2,31,0), +d(1994,4,3,3,31,0), +d(1994,10,30,2,31,0), +d(1995,4,2,3,31,0), +d(1995,10,29,2,31,0), +d(1996,4,7,3,31,0), +d(1996,10,27,2,31,0), +d(1997,4,6,3,31,0), +d(1997,10,26,2,31,0), +d(1998,4,5,3,31,0), +d(1998,10,25,2,31,0), +d(1999,4,4,3,31,0), +d(1999,10,31,2,31,0), +d(2000,4,2,3,31,0), +d(2000,10,29,2,31,0), +d(2001,4,1,3,31,0), +d(2001,10,28,2,31,0), +d(2002,4,7,3,31,0), +d(2002,10,27,2,31,0), +d(2003,4,6,3,31,0), +d(2003,10,26,2,31,0), +d(2004,4,4,3,31,0), +d(2004,10,31,2,31,0), +d(2005,4,3,3,31,0), +d(2005,10,30,2,31,0), +d(2006,4,2,3,31,0), +d(2006,10,29,2,31,0), +d(2007,3,11,3,31,0), +d(2007,11,4,2,31,0), +d(2008,3,9,3,31,0), +d(2008,11,2,2,31,0), +d(2009,3,8,3,31,0), +d(2009,11,1,2,31,0), +d(2010,3,14,3,31,0), +d(2010,11,7,2,31,0), +d(2011,3,13,3,31,0), +d(2011,11,6,2,31,0), +d(2012,3,11,3,31,0), +d(2012,11,4,2,31,0), +d(2013,3,10,3,31,0), +d(2013,11,3,2,31,0), +d(2014,3,9,3,31,0), +d(2014,11,2,2,31,0), +d(2015,3,8,3,31,0), +d(2015,11,1,2,31,0), +d(2016,3,13,3,31,0), +d(2016,11,6,2,31,0), +d(2017,3,12,3,31,0), +d(2017,11,5,2,31,0), +d(2018,3,11,3,31,0), +d(2018,11,4,2,31,0), +d(2019,3,10,3,31,0), +d(2019,11,3,2,31,0), +d(2020,3,8,3,31,0), +d(2020,11,1,2,31,0), +d(2021,3,14,3,31,0), +d(2021,11,7,2,31,0), +d(2022,3,13,3,31,0), +d(2022,11,6,2,31,0), +d(2023,3,12,3,31,0), +d(2023,11,5,2,31,0), +d(2024,3,10,3,31,0), +d(2024,11,3,2,31,0), +d(2025,3,9,3,31,0), +d(2025,11,2,2,31,0), +d(2026,3,8,3,31,0), +d(2026,11,1,2,31,0), +d(2027,3,14,3,31,0), +d(2027,11,7,2,31,0), +d(2028,3,12,3,31,0), +d(2028,11,5,2,31,0), +d(2029,3,11,3,31,0), +d(2029,11,4,2,31,0), +d(2030,3,10,3,31,0), +d(2030,11,3,2,31,0), +d(2031,3,9,3,31,0), +d(2031,11,2,2,31,0), +d(2032,3,14,3,31,0), +d(2032,11,7,2,31,0), +d(2033,3,13,3,31,0), +d(2033,11,6,2,31,0), +d(2034,3,12,3,31,0), +d(2034,11,5,2,31,0), +d(2035,3,11,3,31,0), +d(2035,11,4,2,31,0), +d(2036,3,9,3,31,0), +d(2036,11,2,2,31,0), +d(2037,3,8,3,31,0), +d(2037,11,1,2,31,0), + ] + + _transition_info = [ +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-9060,3600,'NDT'), +i(-12660,0,'NST'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NWT'), +i(-9000,3600,'NPT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-5400,7200,'NDDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), +i(-9000,3600,'NDT'), +i(-12600,0,'NST'), + ] + +Newfoundland = Newfoundland() + diff --git a/vendor/pytz/zoneinfo/Canada/Pacific.py b/vendor/pytz/zoneinfo/Canada/Pacific.py new file mode 100644 index 00000000..1fd0d950 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Pacific.py @@ -0,0 +1,398 @@ +'''tzinfo timezone information for Canada/Pacific.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pacific(DstTzInfo): + '''Canada/Pacific timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Pacific' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,10,0,0), +d(1918,10,31,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1946,4,28,10,0,0), +d(1946,10,13,9,0,0), +d(1947,4,27,10,0,0), +d(1947,9,28,9,0,0), +d(1948,4,25,10,0,0), +d(1948,9,26,9,0,0), +d(1949,4,24,10,0,0), +d(1949,9,25,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,4,28,10,0,0), +d(1974,10,27,9,0,0), +d(1975,4,27,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Pacific = Pacific() + diff --git a/vendor/pytz/zoneinfo/Canada/Saskatchewan.py b/vendor/pytz/zoneinfo/Canada/Saskatchewan.py new file mode 100644 index 00000000..33c7cc09 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Saskatchewan.py @@ -0,0 +1,126 @@ +'''tzinfo timezone information for Canada/Saskatchewan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Saskatchewan(DstTzInfo): + '''Canada/Saskatchewan timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Saskatchewan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,9,1,6,58,36), +d(1918,4,14,9,0,0), +d(1918,10,31,8,0,0), +d(1930,5,4,7,0,0), +d(1930,10,5,6,0,0), +d(1931,5,3,7,0,0), +d(1931,10,4,6,0,0), +d(1932,5,1,7,0,0), +d(1932,10,2,6,0,0), +d(1933,5,7,7,0,0), +d(1933,10,1,6,0,0), +d(1934,5,6,7,0,0), +d(1934,10,7,6,0,0), +d(1937,4,11,7,0,0), +d(1937,10,10,6,0,0), +d(1938,4,10,7,0,0), +d(1938,10,2,6,0,0), +d(1939,4,9,7,0,0), +d(1939,10,8,6,0,0), +d(1940,4,14,7,0,0), +d(1940,10,13,6,0,0), +d(1941,4,13,7,0,0), +d(1941,10,12,6,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1946,4,14,9,0,0), +d(1946,10,13,8,0,0), +d(1947,4,27,9,0,0), +d(1947,9,28,8,0,0), +d(1948,4,25,9,0,0), +d(1948,9,26,8,0,0), +d(1949,4,24,9,0,0), +d(1949,9,25,8,0,0), +d(1950,4,30,9,0,0), +d(1950,9,24,8,0,0), +d(1951,4,29,9,0,0), +d(1951,9,30,8,0,0), +d(1952,4,27,9,0,0), +d(1952,9,28,8,0,0), +d(1953,4,26,9,0,0), +d(1953,9,27,8,0,0), +d(1954,4,25,9,0,0), +d(1954,9,26,8,0,0), +d(1955,4,24,9,0,0), +d(1955,9,25,8,0,0), +d(1956,4,29,9,0,0), +d(1956,9,30,8,0,0), +d(1957,4,28,9,0,0), +d(1957,9,29,8,0,0), +d(1959,4,26,9,0,0), +d(1959,10,25,8,0,0), +d(1960,4,24,9,0,0), + ] + + _transition_info = [ +i(-25140,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), + ] + +Saskatchewan = Saskatchewan() + diff --git a/vendor/pytz/zoneinfo/Canada/Yukon.py b/vendor/pytz/zoneinfo/Canada/Yukon.py new file mode 100644 index 00000000..a69a95d6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Canada/Yukon.py @@ -0,0 +1,272 @@ +'''tzinfo timezone information for Canada/Yukon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Yukon(DstTzInfo): + '''Canada/Yukon timezone definition. See datetime.tzinfo for details''' + + zone = 'Canada/Yukon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,14,11,0,0), +d(1918,10,27,10,0,0), +d(1919,5,25,11,0,0), +d(1919,11,1,8,0,0), +d(1942,2,9,11,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,10,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,9,0,0), +d(1966,7,1,11,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YDT'), +i(-32400,0,'YST'), +i(-28800,3600,'YWT'), +i(-28800,3600,'YPT'), +i(-32400,0,'YST'), +i(-25200,7200,'YDDT'), +i(-32400,0,'YST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Yukon = Yukon() + diff --git a/vendor/pytz/zoneinfo/Canada/__init__.py b/vendor/pytz/zoneinfo/Canada/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Chile/Continental.py b/vendor/pytz/zoneinfo/Chile/Continental.py new file mode 100644 index 00000000..b240aa54 --- /dev/null +++ b/vendor/pytz/zoneinfo/Chile/Continental.py @@ -0,0 +1,336 @@ +'''tzinfo timezone information for Chile/Continental.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Continental(DstTzInfo): + '''Chile/Continental timezone definition. See datetime.tzinfo for details''' + + zone = 'Chile/Continental' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,1,1,4,42,46), +d(1916,7,1,5,0,0), +d(1918,9,1,4,42,46), +d(1919,7,1,4,0,0), +d(1927,9,1,4,42,46), +d(1928,4,1,4,0,0), +d(1928,9,1,5,0,0), +d(1929,4,1,4,0,0), +d(1929,9,1,5,0,0), +d(1930,4,1,4,0,0), +d(1930,9,1,5,0,0), +d(1931,4,1,4,0,0), +d(1931,9,1,5,0,0), +d(1932,4,1,4,0,0), +d(1932,9,1,5,0,0), +d(1942,6,1,4,0,0), +d(1942,8,1,5,0,0), +d(1946,9,1,3,0,0), +d(1947,5,22,5,0,0), +d(1968,11,3,4,0,0), +d(1969,3,30,3,0,0), +d(1969,11,23,4,0,0), +d(1970,3,29,3,0,0), +d(1970,10,11,4,0,0), +d(1971,3,14,3,0,0), +d(1971,10,10,4,0,0), +d(1972,3,12,3,0,0), +d(1972,10,15,4,0,0), +d(1973,3,11,3,0,0), +d(1973,9,30,4,0,0), +d(1974,3,10,3,0,0), +d(1974,10,13,4,0,0), +d(1975,3,9,3,0,0), +d(1975,10,12,4,0,0), +d(1976,3,14,3,0,0), +d(1976,10,10,4,0,0), +d(1977,3,13,3,0,0), +d(1977,10,9,4,0,0), +d(1978,3,12,3,0,0), +d(1978,10,15,4,0,0), +d(1979,3,11,3,0,0), +d(1979,10,14,4,0,0), +d(1980,3,9,3,0,0), +d(1980,10,12,4,0,0), +d(1981,3,15,3,0,0), +d(1981,10,11,4,0,0), +d(1982,3,14,3,0,0), +d(1982,10,10,4,0,0), +d(1983,3,13,3,0,0), +d(1983,10,9,4,0,0), +d(1984,3,11,3,0,0), +d(1984,10,14,4,0,0), +d(1985,3,10,3,0,0), +d(1985,10,13,4,0,0), +d(1986,3,9,3,0,0), +d(1986,10,12,4,0,0), +d(1987,4,12,3,0,0), +d(1987,10,11,4,0,0), +d(1988,3,13,3,0,0), +d(1988,10,2,4,0,0), +d(1989,3,12,3,0,0), +d(1989,10,15,4,0,0), +d(1990,3,18,3,0,0), +d(1990,9,16,4,0,0), +d(1991,3,10,3,0,0), +d(1991,10,13,4,0,0), +d(1992,3,15,3,0,0), +d(1992,10,11,4,0,0), +d(1993,3,14,3,0,0), +d(1993,10,10,4,0,0), +d(1994,3,13,3,0,0), +d(1994,10,9,4,0,0), +d(1995,3,12,3,0,0), +d(1995,10,15,4,0,0), +d(1996,3,10,3,0,0), +d(1996,10,13,4,0,0), +d(1997,3,30,3,0,0), +d(1997,10,12,4,0,0), +d(1998,3,15,3,0,0), +d(1998,9,27,4,0,0), +d(1999,4,4,3,0,0), +d(1999,10,10,4,0,0), +d(2000,3,12,3,0,0), +d(2000,10,15,4,0,0), +d(2001,3,11,3,0,0), +d(2001,10,14,4,0,0), +d(2002,3,10,3,0,0), +d(2002,10,13,4,0,0), +d(2003,3,9,3,0,0), +d(2003,10,12,4,0,0), +d(2004,3,14,3,0,0), +d(2004,10,10,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,9,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,14,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,12,4,0,0), +d(2009,3,15,3,0,0), +d(2009,10,11,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,10,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,9,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,14,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,13,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,12,4,0,0), +d(2015,3,15,3,0,0), +d(2015,10,11,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,9,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,14,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,13,4,0,0), +d(2020,3,15,3,0,0), +d(2020,10,11,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,10,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,9,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,13,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,12,4,0,0), +d(2026,3,15,3,0,0), +d(2026,10,11,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,10,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,14,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,13,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,12,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,10,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,9,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,14,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,12,4,0,0), +d(2037,3,15,3,0,0), +d(2037,10,11,4,0,0), + ] + + _transition_info = [ +i(-16980,0,'SMT'), +i(-18000,0,'CLT'), +i(-16980,0,'SMT'), +i(-14400,0,'CLT'), +i(-16980,0,'SMT'), +i(-14400,2580,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,3600,'CLST'), +i(-18000,0,'CLT'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), +i(-14400,0,'CLT'), +i(-10800,3600,'CLST'), + ] + +Continental = Continental() + diff --git a/vendor/pytz/zoneinfo/Chile/EasterIsland.py b/vendor/pytz/zoneinfo/Chile/EasterIsland.py new file mode 100644 index 00000000..fc17b262 --- /dev/null +++ b/vendor/pytz/zoneinfo/Chile/EasterIsland.py @@ -0,0 +1,308 @@ +'''tzinfo timezone information for Chile/EasterIsland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class EasterIsland(DstTzInfo): + '''Chile/EasterIsland timezone definition. See datetime.tzinfo for details''' + + zone = 'Chile/EasterIsland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1932,9,1,7,17,28), +d(1942,6,1,4,0,0), +d(1942,8,1,5,0,0), +d(1946,9,1,3,0,0), +d(1968,11,3,4,0,0), +d(1969,3,30,3,0,0), +d(1969,11,23,4,0,0), +d(1970,3,29,3,0,0), +d(1970,10,11,4,0,0), +d(1971,3,14,3,0,0), +d(1971,10,10,4,0,0), +d(1972,3,12,3,0,0), +d(1972,10,15,4,0,0), +d(1973,3,11,3,0,0), +d(1973,9,30,4,0,0), +d(1974,3,10,3,0,0), +d(1974,10,13,4,0,0), +d(1975,3,9,3,0,0), +d(1975,10,12,4,0,0), +d(1976,3,14,3,0,0), +d(1976,10,10,4,0,0), +d(1977,3,13,3,0,0), +d(1977,10,9,4,0,0), +d(1978,3,12,3,0,0), +d(1978,10,15,4,0,0), +d(1979,3,11,3,0,0), +d(1979,10,14,4,0,0), +d(1980,3,9,3,0,0), +d(1980,10,12,4,0,0), +d(1981,3,15,3,0,0), +d(1981,10,11,4,0,0), +d(1982,1,19,3,0,0), +d(1982,3,14,3,0,0), +d(1982,10,10,4,0,0), +d(1983,3,13,3,0,0), +d(1983,10,9,4,0,0), +d(1984,3,11,3,0,0), +d(1984,10,14,4,0,0), +d(1985,3,10,3,0,0), +d(1985,10,13,4,0,0), +d(1986,3,9,3,0,0), +d(1986,10,12,4,0,0), +d(1987,4,12,3,0,0), +d(1987,10,11,4,0,0), +d(1988,3,13,3,0,0), +d(1988,10,2,4,0,0), +d(1989,3,12,3,0,0), +d(1989,10,15,4,0,0), +d(1990,3,18,3,0,0), +d(1990,9,16,4,0,0), +d(1991,3,10,3,0,0), +d(1991,10,13,4,0,0), +d(1992,3,15,3,0,0), +d(1992,10,11,4,0,0), +d(1993,3,14,3,0,0), +d(1993,10,10,4,0,0), +d(1994,3,13,3,0,0), +d(1994,10,9,4,0,0), +d(1995,3,12,3,0,0), +d(1995,10,15,4,0,0), +d(1996,3,10,3,0,0), +d(1996,10,13,4,0,0), +d(1997,3,30,3,0,0), +d(1997,10,12,4,0,0), +d(1998,3,15,3,0,0), +d(1998,9,27,4,0,0), +d(1999,4,4,3,0,0), +d(1999,10,10,4,0,0), +d(2000,3,12,3,0,0), +d(2000,10,15,4,0,0), +d(2001,3,11,3,0,0), +d(2001,10,14,4,0,0), +d(2002,3,10,3,0,0), +d(2002,10,13,4,0,0), +d(2003,3,9,3,0,0), +d(2003,10,12,4,0,0), +d(2004,3,14,3,0,0), +d(2004,10,10,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,9,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,14,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,12,4,0,0), +d(2009,3,15,3,0,0), +d(2009,10,11,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,10,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,9,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,14,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,13,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,12,4,0,0), +d(2015,3,15,3,0,0), +d(2015,10,11,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,9,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,14,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,13,4,0,0), +d(2020,3,15,3,0,0), +d(2020,10,11,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,10,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,9,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,13,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,12,4,0,0), +d(2026,3,15,3,0,0), +d(2026,10,11,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,10,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,14,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,13,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,12,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,10,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,9,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,14,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,12,4,0,0), +d(2037,3,15,3,0,0), +d(2037,10,11,4,0,0), + ] + + _transition_info = [ +i(-26220,0,'MMT'), +i(-21600,4620,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-18000,7200,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), + ] + +EasterIsland = EasterIsland() + diff --git a/vendor/pytz/zoneinfo/Chile/__init__.py b/vendor/pytz/zoneinfo/Chile/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Cuba.py b/vendor/pytz/zoneinfo/Cuba.py new file mode 100644 index 00000000..5665bc4b --- /dev/null +++ b/vendor/pytz/zoneinfo/Cuba.py @@ -0,0 +1,330 @@ +'''tzinfo timezone information for Cuba.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Cuba(DstTzInfo): + '''Cuba timezone definition. See datetime.tzinfo for details''' + + zone = 'Cuba' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1925,7,19,17,29,36), +d(1928,6,10,5,0,0), +d(1928,10,10,4,0,0), +d(1940,6,2,5,0,0), +d(1940,9,1,4,0,0), +d(1941,6,1,5,0,0), +d(1941,9,7,4,0,0), +d(1942,6,7,5,0,0), +d(1942,9,6,4,0,0), +d(1945,6,3,5,0,0), +d(1945,9,2,4,0,0), +d(1946,6,2,5,0,0), +d(1946,9,1,4,0,0), +d(1965,6,1,5,0,0), +d(1965,9,30,4,0,0), +d(1966,5,29,5,0,0), +d(1966,10,2,4,0,0), +d(1967,4,8,5,0,0), +d(1967,9,10,4,0,0), +d(1968,4,14,5,0,0), +d(1968,9,8,4,0,0), +d(1969,4,27,5,0,0), +d(1969,10,26,4,0,0), +d(1970,4,26,5,0,0), +d(1970,10,25,4,0,0), +d(1971,4,25,5,0,0), +d(1971,10,31,4,0,0), +d(1972,4,30,5,0,0), +d(1972,10,8,4,0,0), +d(1973,4,29,5,0,0), +d(1973,10,8,4,0,0), +d(1974,4,28,5,0,0), +d(1974,10,8,4,0,0), +d(1975,4,27,5,0,0), +d(1975,10,26,4,0,0), +d(1976,4,25,5,0,0), +d(1976,10,31,4,0,0), +d(1977,4,24,5,0,0), +d(1977,10,30,4,0,0), +d(1978,5,7,5,0,0), +d(1978,10,8,4,0,0), +d(1979,3,18,5,0,0), +d(1979,10,14,4,0,0), +d(1980,3,16,5,0,0), +d(1980,10,12,4,0,0), +d(1981,5,10,5,0,0), +d(1981,10,11,4,0,0), +d(1982,5,9,5,0,0), +d(1982,10,10,4,0,0), +d(1983,5,8,5,0,0), +d(1983,10,9,4,0,0), +d(1984,5,6,5,0,0), +d(1984,10,14,4,0,0), +d(1985,5,5,5,0,0), +d(1985,10,13,4,0,0), +d(1986,3,16,5,0,0), +d(1986,10,12,4,0,0), +d(1987,3,15,5,0,0), +d(1987,10,11,4,0,0), +d(1988,3,20,5,0,0), +d(1988,10,9,4,0,0), +d(1989,3,19,5,0,0), +d(1989,10,8,4,0,0), +d(1990,4,1,5,0,0), +d(1990,10,14,4,0,0), +d(1991,4,7,5,0,0), +d(1991,10,13,5,0,0), +d(1992,4,5,5,0,0), +d(1992,10,11,5,0,0), +d(1993,4,4,5,0,0), +d(1993,10,10,5,0,0), +d(1994,4,3,5,0,0), +d(1994,10,9,5,0,0), +d(1995,4,2,5,0,0), +d(1995,10,8,5,0,0), +d(1996,4,7,5,0,0), +d(1996,10,6,5,0,0), +d(1997,4,6,5,0,0), +d(1997,10,12,5,0,0), +d(1998,3,29,5,0,0), +d(1998,10,25,5,0,0), +d(1999,3,28,5,0,0), +d(1999,10,31,5,0,0), +d(2000,4,2,5,0,0), +d(2000,10,29,5,0,0), +d(2001,4,1,5,0,0), +d(2001,10,28,5,0,0), +d(2002,4,7,5,0,0), +d(2002,10,27,5,0,0), +d(2003,4,6,5,0,0), +d(2003,10,26,5,0,0), +d(2004,4,4,5,0,0), +d(2006,10,29,5,0,0), +d(2007,4,1,5,0,0), +d(2007,10,28,5,0,0), +d(2008,4,6,5,0,0), +d(2008,10,26,5,0,0), +d(2009,4,5,5,0,0), +d(2009,10,25,5,0,0), +d(2010,4,4,5,0,0), +d(2010,10,31,5,0,0), +d(2011,4,3,5,0,0), +d(2011,10,30,5,0,0), +d(2012,4,1,5,0,0), +d(2012,10,28,5,0,0), +d(2013,4,7,5,0,0), +d(2013,10,27,5,0,0), +d(2014,4,6,5,0,0), +d(2014,10,26,5,0,0), +d(2015,4,5,5,0,0), +d(2015,10,25,5,0,0), +d(2016,4,3,5,0,0), +d(2016,10,30,5,0,0), +d(2017,4,2,5,0,0), +d(2017,10,29,5,0,0), +d(2018,4,1,5,0,0), +d(2018,10,28,5,0,0), +d(2019,4,7,5,0,0), +d(2019,10,27,5,0,0), +d(2020,4,5,5,0,0), +d(2020,10,25,5,0,0), +d(2021,4,4,5,0,0), +d(2021,10,31,5,0,0), +d(2022,4,3,5,0,0), +d(2022,10,30,5,0,0), +d(2023,4,2,5,0,0), +d(2023,10,29,5,0,0), +d(2024,4,7,5,0,0), +d(2024,10,27,5,0,0), +d(2025,4,6,5,0,0), +d(2025,10,26,5,0,0), +d(2026,4,5,5,0,0), +d(2026,10,25,5,0,0), +d(2027,4,4,5,0,0), +d(2027,10,31,5,0,0), +d(2028,4,2,5,0,0), +d(2028,10,29,5,0,0), +d(2029,4,1,5,0,0), +d(2029,10,28,5,0,0), +d(2030,4,7,5,0,0), +d(2030,10,27,5,0,0), +d(2031,4,6,5,0,0), +d(2031,10,26,5,0,0), +d(2032,4,4,5,0,0), +d(2032,10,31,5,0,0), +d(2033,4,3,5,0,0), +d(2033,10,30,5,0,0), +d(2034,4,2,5,0,0), +d(2034,10,29,5,0,0), +d(2035,4,1,5,0,0), +d(2035,10,28,5,0,0), +d(2036,4,6,5,0,0), +d(2036,10,26,5,0,0), +d(2037,4,5,5,0,0), +d(2037,10,25,5,0,0), + ] + + _transition_info = [ +i(-19800,0,'HMT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), +i(-14400,3600,'CDT'), +i(-18000,0,'CST'), + ] + +Cuba = Cuba() + diff --git a/vendor/pytz/zoneinfo/EET.py b/vendor/pytz/zoneinfo/EET.py new file mode 100644 index 00000000..9f22313f --- /dev/null +++ b/vendor/pytz/zoneinfo/EET.py @@ -0,0 +1,264 @@ +'''tzinfo timezone information for EET.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class EET(DstTzInfo): + '''EET timezone definition. See datetime.tzinfo for details''' + + zone = 'EET' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +EET = EET() + diff --git a/vendor/pytz/zoneinfo/EST.py b/vendor/pytz/zoneinfo/EST.py new file mode 100644 index 00000000..cf965783 --- /dev/null +++ b/vendor/pytz/zoneinfo/EST.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for EST.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class EST(StaticTzInfo): + '''EST timezone definition. See datetime.tzinfo for details''' + zone = 'EST' + _utcoffset = timedelta(seconds=-18000) + _tzname = 'EST' + +EST = EST() + diff --git a/vendor/pytz/zoneinfo/EST5EDT.py b/vendor/pytz/zoneinfo/EST5EDT.py new file mode 100644 index 00000000..f84da28c --- /dev/null +++ b/vendor/pytz/zoneinfo/EST5EDT.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for EST5EDT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class EST5EDT(DstTzInfo): + '''EST5EDT timezone definition. See datetime.tzinfo for details''' + + zone = 'EST5EDT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,7,0,0), +d(1918,10,27,6,0,0), +d(1919,3,30,7,0,0), +d(1919,10,26,6,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +EST5EDT = EST5EDT() + diff --git a/vendor/pytz/zoneinfo/Egypt.py b/vendor/pytz/zoneinfo/Egypt.py new file mode 100644 index 00000000..99c41c8d --- /dev/null +++ b/vendor/pytz/zoneinfo/Egypt.py @@ -0,0 +1,368 @@ +'''tzinfo timezone information for Egypt.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Egypt(DstTzInfo): + '''Egypt timezone definition. See datetime.tzinfo for details''' + + zone = 'Egypt' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,7,14,22,0,0), +d(1940,9,30,21,0,0), +d(1941,4,14,22,0,0), +d(1941,9,15,21,0,0), +d(1942,3,31,22,0,0), +d(1942,10,26,21,0,0), +d(1943,3,31,22,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,21,0,0), +d(1957,5,9,22,0,0), +d(1957,9,30,21,0,0), +d(1958,4,30,22,0,0), +d(1958,9,30,21,0,0), +d(1959,4,30,23,0,0), +d(1959,9,30,0,0,0), +d(1960,4,30,23,0,0), +d(1960,9,30,0,0,0), +d(1961,4,30,23,0,0), +d(1961,9,30,0,0,0), +d(1962,4,30,23,0,0), +d(1962,9,30,0,0,0), +d(1963,4,30,23,0,0), +d(1963,9,30,0,0,0), +d(1964,4,30,23,0,0), +d(1964,9,30,0,0,0), +d(1965,4,30,23,0,0), +d(1965,9,30,0,0,0), +d(1966,4,30,23,0,0), +d(1966,10,1,0,0,0), +d(1967,4,30,23,0,0), +d(1967,10,1,0,0,0), +d(1968,4,30,23,0,0), +d(1968,10,1,0,0,0), +d(1969,4,30,23,0,0), +d(1969,10,1,0,0,0), +d(1970,4,30,23,0,0), +d(1970,10,1,0,0,0), +d(1971,4,30,23,0,0), +d(1971,10,1,0,0,0), +d(1972,4,30,23,0,0), +d(1972,10,1,0,0,0), +d(1973,4,30,23,0,0), +d(1973,10,1,0,0,0), +d(1974,4,30,23,0,0), +d(1974,10,1,0,0,0), +d(1975,4,30,23,0,0), +d(1975,10,1,0,0,0), +d(1976,4,30,23,0,0), +d(1976,10,1,0,0,0), +d(1977,4,30,23,0,0), +d(1977,10,1,0,0,0), +d(1978,4,30,23,0,0), +d(1978,10,1,0,0,0), +d(1979,4,30,23,0,0), +d(1979,10,1,0,0,0), +d(1980,4,30,23,0,0), +d(1980,10,1,0,0,0), +d(1981,4,30,23,0,0), +d(1981,10,1,0,0,0), +d(1982,7,24,23,0,0), +d(1982,10,1,0,0,0), +d(1983,7,11,23,0,0), +d(1983,10,1,0,0,0), +d(1984,4,30,23,0,0), +d(1984,10,1,0,0,0), +d(1985,4,30,23,0,0), +d(1985,10,1,0,0,0), +d(1986,4,30,23,0,0), +d(1986,10,1,0,0,0), +d(1987,4,30,23,0,0), +d(1987,10,1,0,0,0), +d(1988,4,30,23,0,0), +d(1988,10,1,0,0,0), +d(1989,5,5,23,0,0), +d(1989,10,1,0,0,0), +d(1990,4,30,23,0,0), +d(1990,10,1,0,0,0), +d(1991,4,30,23,0,0), +d(1991,10,1,0,0,0), +d(1992,4,30,23,0,0), +d(1992,10,1,0,0,0), +d(1993,4,30,23,0,0), +d(1993,10,1,0,0,0), +d(1994,4,30,23,0,0), +d(1994,10,1,0,0,0), +d(1995,4,27,22,0,0), +d(1995,9,28,21,0,0), +d(1996,4,25,22,0,0), +d(1996,9,26,21,0,0), +d(1997,4,24,22,0,0), +d(1997,9,25,21,0,0), +d(1998,4,23,22,0,0), +d(1998,9,24,21,0,0), +d(1999,4,29,22,0,0), +d(1999,9,30,21,0,0), +d(2000,4,27,22,0,0), +d(2000,9,28,21,0,0), +d(2001,4,26,22,0,0), +d(2001,9,27,21,0,0), +d(2002,4,25,22,0,0), +d(2002,9,26,21,0,0), +d(2003,4,24,22,0,0), +d(2003,9,25,21,0,0), +d(2004,4,29,22,0,0), +d(2004,9,30,21,0,0), +d(2005,4,28,22,0,0), +d(2005,9,29,21,0,0), +d(2006,4,27,22,0,0), +d(2006,9,21,21,0,0), +d(2007,4,26,22,0,0), +d(2007,9,27,21,0,0), +d(2008,4,24,22,0,0), +d(2008,9,25,21,0,0), +d(2009,4,23,22,0,0), +d(2009,9,24,21,0,0), +d(2010,4,29,22,0,0), +d(2010,9,30,21,0,0), +d(2011,4,28,22,0,0), +d(2011,9,29,21,0,0), +d(2012,4,26,22,0,0), +d(2012,9,27,21,0,0), +d(2013,4,25,22,0,0), +d(2013,9,26,21,0,0), +d(2014,4,24,22,0,0), +d(2014,9,25,21,0,0), +d(2015,4,23,22,0,0), +d(2015,9,24,21,0,0), +d(2016,4,28,22,0,0), +d(2016,9,29,21,0,0), +d(2017,4,27,22,0,0), +d(2017,9,28,21,0,0), +d(2018,4,26,22,0,0), +d(2018,9,27,21,0,0), +d(2019,4,25,22,0,0), +d(2019,9,26,21,0,0), +d(2020,4,23,22,0,0), +d(2020,9,24,21,0,0), +d(2021,4,29,22,0,0), +d(2021,9,30,21,0,0), +d(2022,4,28,22,0,0), +d(2022,9,29,21,0,0), +d(2023,4,27,22,0,0), +d(2023,9,28,21,0,0), +d(2024,4,25,22,0,0), +d(2024,9,26,21,0,0), +d(2025,4,24,22,0,0), +d(2025,9,25,21,0,0), +d(2026,4,23,22,0,0), +d(2026,9,24,21,0,0), +d(2027,4,29,22,0,0), +d(2027,9,30,21,0,0), +d(2028,4,27,22,0,0), +d(2028,9,28,21,0,0), +d(2029,4,26,22,0,0), +d(2029,9,27,21,0,0), +d(2030,4,25,22,0,0), +d(2030,9,26,21,0,0), +d(2031,4,24,22,0,0), +d(2031,9,25,21,0,0), +d(2032,4,29,22,0,0), +d(2032,9,30,21,0,0), +d(2033,4,28,22,0,0), +d(2033,9,29,21,0,0), +d(2034,4,27,22,0,0), +d(2034,9,28,21,0,0), +d(2035,4,26,22,0,0), +d(2035,9,27,21,0,0), +d(2036,4,24,22,0,0), +d(2036,9,25,21,0,0), +d(2037,4,23,22,0,0), +d(2037,9,24,21,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Egypt = Egypt() + diff --git a/vendor/pytz/zoneinfo/Eire.py b/vendor/pytz/zoneinfo/Eire.py new file mode 100644 index 00000000..eb7f4abe --- /dev/null +++ b/vendor/pytz/zoneinfo/Eire.py @@ -0,0 +1,478 @@ +'''tzinfo timezone information for Eire.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Eire(DstTzInfo): + '''Eire timezone definition. See datetime.tzinfo for details''' + + zone = 'Eire' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,25,21), +d(1916,10,1,2,25,21), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1921,12,6,0,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1946,10,6,1,0,0), +d(1947,3,16,2,0,0), +d(1947,11,2,1,0,0), +d(1948,4,18,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-1500,0,'DMT'), +i(2100,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(3600,0,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), + ] + +Eire = Eire() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT.py b/vendor/pytz/zoneinfo/Etc/GMT.py new file mode 100644 index 00000000..b91f301f --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT(StaticTzInfo): + '''Etc/GMT timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT = GMT() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT0.py b/vendor/pytz/zoneinfo/Etc/GMT0.py new file mode 100644 index 00000000..ce857ca0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT0(StaticTzInfo): + '''Etc/GMT0 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT0 = GMT0() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_0.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_0.py new file mode 100644 index 00000000..fb143c9a --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_0(StaticTzInfo): + '''Etc/GMT_minus_0 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT_minus_0 = GMT_minus_0() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_1.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_1.py new file mode 100644 index 00000000..b280ae98 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_1.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_1.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_1(StaticTzInfo): + '''Etc/GMT_minus_1 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_1' + _utcoffset = timedelta(seconds=3600) + _tzname = 'GMT-1' + +GMT_minus_1 = GMT_minus_1() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_10.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_10.py new file mode 100644 index 00000000..4c97903f --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_10.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_10.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_10(StaticTzInfo): + '''Etc/GMT_minus_10 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_10' + _utcoffset = timedelta(seconds=36000) + _tzname = 'GMT-10' + +GMT_minus_10 = GMT_minus_10() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_11.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_11.py new file mode 100644 index 00000000..4f7d9d44 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_11.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_11.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_11(StaticTzInfo): + '''Etc/GMT_minus_11 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_11' + _utcoffset = timedelta(seconds=39600) + _tzname = 'GMT-11' + +GMT_minus_11 = GMT_minus_11() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_12.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_12.py new file mode 100644 index 00000000..c542dbfe --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_12.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_12.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_12(StaticTzInfo): + '''Etc/GMT_minus_12 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_12' + _utcoffset = timedelta(seconds=43200) + _tzname = 'GMT-12' + +GMT_minus_12 = GMT_minus_12() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_13.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_13.py new file mode 100644 index 00000000..78e23fa8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_13.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_13.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_13(StaticTzInfo): + '''Etc/GMT_minus_13 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_13' + _utcoffset = timedelta(seconds=46800) + _tzname = 'GMT-13' + +GMT_minus_13 = GMT_minus_13() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_14.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_14.py new file mode 100644 index 00000000..b20f9859 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_14.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_14.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_14(StaticTzInfo): + '''Etc/GMT_minus_14 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_14' + _utcoffset = timedelta(seconds=50400) + _tzname = 'GMT-14' + +GMT_minus_14 = GMT_minus_14() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_2.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_2.py new file mode 100644 index 00000000..98aeabbc --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_2.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_2.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_2(StaticTzInfo): + '''Etc/GMT_minus_2 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_2' + _utcoffset = timedelta(seconds=7200) + _tzname = 'GMT-2' + +GMT_minus_2 = GMT_minus_2() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_3.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_3.py new file mode 100644 index 00000000..a2d4cd50 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_3.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_3.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_3(StaticTzInfo): + '''Etc/GMT_minus_3 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_3' + _utcoffset = timedelta(seconds=10800) + _tzname = 'GMT-3' + +GMT_minus_3 = GMT_minus_3() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_4.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_4.py new file mode 100644 index 00000000..09575ac2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_4.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_4.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_4(StaticTzInfo): + '''Etc/GMT_minus_4 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_4' + _utcoffset = timedelta(seconds=14400) + _tzname = 'GMT-4' + +GMT_minus_4 = GMT_minus_4() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_5.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_5.py new file mode 100644 index 00000000..4d93e313 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_5.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_5.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_5(StaticTzInfo): + '''Etc/GMT_minus_5 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_5' + _utcoffset = timedelta(seconds=18000) + _tzname = 'GMT-5' + +GMT_minus_5 = GMT_minus_5() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_6.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_6.py new file mode 100644 index 00000000..02612da4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_6.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_6.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_6(StaticTzInfo): + '''Etc/GMT_minus_6 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_6' + _utcoffset = timedelta(seconds=21600) + _tzname = 'GMT-6' + +GMT_minus_6 = GMT_minus_6() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_7.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_7.py new file mode 100644 index 00000000..b675a696 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_7.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_7.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_7(StaticTzInfo): + '''Etc/GMT_minus_7 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_7' + _utcoffset = timedelta(seconds=25200) + _tzname = 'GMT-7' + +GMT_minus_7 = GMT_minus_7() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_8.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_8.py new file mode 100644 index 00000000..34578205 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_8.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_8.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_8(StaticTzInfo): + '''Etc/GMT_minus_8 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_8' + _utcoffset = timedelta(seconds=28800) + _tzname = 'GMT-8' + +GMT_minus_8 = GMT_minus_8() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_minus_9.py b/vendor/pytz/zoneinfo/Etc/GMT_minus_9.py new file mode 100644 index 00000000..2ab33c50 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_minus_9.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_minus_9.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_9(StaticTzInfo): + '''Etc/GMT_minus_9 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_minus_9' + _utcoffset = timedelta(seconds=32400) + _tzname = 'GMT-9' + +GMT_minus_9 = GMT_minus_9() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_0.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_0.py new file mode 100644 index 00000000..342e2a5d --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_0(StaticTzInfo): + '''Etc/GMT_plus_0 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT_plus_0 = GMT_plus_0() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_1.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_1.py new file mode 100644 index 00000000..9b62d1ed --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_1.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_1.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_1(StaticTzInfo): + '''Etc/GMT_plus_1 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_1' + _utcoffset = timedelta(seconds=-3600) + _tzname = 'GMT+1' + +GMT_plus_1 = GMT_plus_1() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_10.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_10.py new file mode 100644 index 00000000..cf7943b4 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_10.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_10.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_10(StaticTzInfo): + '''Etc/GMT_plus_10 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_10' + _utcoffset = timedelta(seconds=-36000) + _tzname = 'GMT+10' + +GMT_plus_10 = GMT_plus_10() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_11.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_11.py new file mode 100644 index 00000000..fb9e3e08 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_11.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_11.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_11(StaticTzInfo): + '''Etc/GMT_plus_11 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_11' + _utcoffset = timedelta(seconds=-39600) + _tzname = 'GMT+11' + +GMT_plus_11 = GMT_plus_11() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_12.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_12.py new file mode 100644 index 00000000..fcf2a236 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_12.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_12.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_12(StaticTzInfo): + '''Etc/GMT_plus_12 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_12' + _utcoffset = timedelta(seconds=-43200) + _tzname = 'GMT+12' + +GMT_plus_12 = GMT_plus_12() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_2.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_2.py new file mode 100644 index 00000000..672dbb2b --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_2.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_2.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_2(StaticTzInfo): + '''Etc/GMT_plus_2 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_2' + _utcoffset = timedelta(seconds=-7200) + _tzname = 'GMT+2' + +GMT_plus_2 = GMT_plus_2() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_3.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_3.py new file mode 100644 index 00000000..1d7f3837 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_3.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_3.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_3(StaticTzInfo): + '''Etc/GMT_plus_3 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_3' + _utcoffset = timedelta(seconds=-10800) + _tzname = 'GMT+3' + +GMT_plus_3 = GMT_plus_3() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_4.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_4.py new file mode 100644 index 00000000..8f199672 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_4.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_4.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_4(StaticTzInfo): + '''Etc/GMT_plus_4 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_4' + _utcoffset = timedelta(seconds=-14400) + _tzname = 'GMT+4' + +GMT_plus_4 = GMT_plus_4() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_5.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_5.py new file mode 100644 index 00000000..e1015637 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_5.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_5.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_5(StaticTzInfo): + '''Etc/GMT_plus_5 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_5' + _utcoffset = timedelta(seconds=-18000) + _tzname = 'GMT+5' + +GMT_plus_5 = GMT_plus_5() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_6.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_6.py new file mode 100644 index 00000000..ee30aba6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_6.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_6.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_6(StaticTzInfo): + '''Etc/GMT_plus_6 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_6' + _utcoffset = timedelta(seconds=-21600) + _tzname = 'GMT+6' + +GMT_plus_6 = GMT_plus_6() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_7.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_7.py new file mode 100644 index 00000000..e56b8287 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_7.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_7.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_7(StaticTzInfo): + '''Etc/GMT_plus_7 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_7' + _utcoffset = timedelta(seconds=-25200) + _tzname = 'GMT+7' + +GMT_plus_7 = GMT_plus_7() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_8.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_8.py new file mode 100644 index 00000000..63856c90 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_8.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_8.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_8(StaticTzInfo): + '''Etc/GMT_plus_8 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_8' + _utcoffset = timedelta(seconds=-28800) + _tzname = 'GMT+8' + +GMT_plus_8 = GMT_plus_8() + diff --git a/vendor/pytz/zoneinfo/Etc/GMT_plus_9.py b/vendor/pytz/zoneinfo/Etc/GMT_plus_9.py new file mode 100644 index 00000000..6964c544 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/GMT_plus_9.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/GMT_plus_9.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_9(StaticTzInfo): + '''Etc/GMT_plus_9 timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/GMT_plus_9' + _utcoffset = timedelta(seconds=-32400) + _tzname = 'GMT+9' + +GMT_plus_9 = GMT_plus_9() + diff --git a/vendor/pytz/zoneinfo/Etc/Greenwich.py b/vendor/pytz/zoneinfo/Etc/Greenwich.py new file mode 100644 index 00000000..74ecf645 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/Greenwich.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/Greenwich.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Greenwich(StaticTzInfo): + '''Etc/Greenwich timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/Greenwich' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +Greenwich = Greenwich() + diff --git a/vendor/pytz/zoneinfo/Etc/UCT.py b/vendor/pytz/zoneinfo/Etc/UCT.py new file mode 100644 index 00000000..3c830816 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/UCT.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/UCT.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class UCT(StaticTzInfo): + '''Etc/UCT timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/UCT' + _utcoffset = timedelta(seconds=0) + _tzname = 'UCT' + +UCT = UCT() + diff --git a/vendor/pytz/zoneinfo/Etc/UTC.py b/vendor/pytz/zoneinfo/Etc/UTC.py new file mode 100644 index 00000000..80eb784c --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/UTC.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/UTC.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class UTC(StaticTzInfo): + '''Etc/UTC timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/UTC' + _utcoffset = timedelta(seconds=0) + _tzname = 'UTC' + +UTC = UTC() + diff --git a/vendor/pytz/zoneinfo/Etc/Universal.py b/vendor/pytz/zoneinfo/Etc/Universal.py new file mode 100644 index 00000000..bddf3c45 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/Universal.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/Universal.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Universal(StaticTzInfo): + '''Etc/Universal timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/Universal' + _utcoffset = timedelta(seconds=0) + _tzname = 'UTC' + +Universal = Universal() + diff --git a/vendor/pytz/zoneinfo/Etc/Zulu.py b/vendor/pytz/zoneinfo/Etc/Zulu.py new file mode 100644 index 00000000..d569a825 --- /dev/null +++ b/vendor/pytz/zoneinfo/Etc/Zulu.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Etc/Zulu.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Zulu(StaticTzInfo): + '''Etc/Zulu timezone definition. See datetime.tzinfo for details''' + zone = 'Etc/Zulu' + _utcoffset = timedelta(seconds=0) + _tzname = 'UTC' + +Zulu = Zulu() + diff --git a/vendor/pytz/zoneinfo/Etc/__init__.py b/vendor/pytz/zoneinfo/Etc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Europe/Amsterdam.py b/vendor/pytz/zoneinfo/Europe/Amsterdam.py new file mode 100644 index 00000000..b210f20a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Amsterdam.py @@ -0,0 +1,380 @@ +'''tzinfo timezone information for Europe/Amsterdam.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Amsterdam(DstTzInfo): + '''Europe/Amsterdam timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Amsterdam' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,23,40,28), +d(1916,9,30,22,40,28), +d(1917,4,16,1,40,28), +d(1917,9,17,1,40,28), +d(1918,4,1,1,40,28), +d(1918,9,30,1,40,28), +d(1919,4,7,1,40,28), +d(1919,9,29,1,40,28), +d(1920,4,5,1,40,28), +d(1920,9,27,1,40,28), +d(1921,4,4,1,40,28), +d(1921,9,26,1,40,28), +d(1922,3,26,1,40,28), +d(1922,10,8,1,40,28), +d(1923,6,1,1,40,28), +d(1923,10,7,1,40,28), +d(1924,3,30,1,40,28), +d(1924,10,5,1,40,28), +d(1925,6,5,1,40,28), +d(1925,10,4,1,40,28), +d(1926,5,15,1,40,28), +d(1926,10,3,1,40,28), +d(1927,5,15,1,40,28), +d(1927,10,2,1,40,28), +d(1928,5,15,1,40,28), +d(1928,10,7,1,40,28), +d(1929,5,15,1,40,28), +d(1929,10,6,1,40,28), +d(1930,5,15,1,40,28), +d(1930,10,5,1,40,28), +d(1931,5,15,1,40,28), +d(1931,10,4,1,40,28), +d(1932,5,22,1,40,28), +d(1932,10,2,1,40,28), +d(1933,5,15,1,40,28), +d(1933,10,8,1,40,28), +d(1934,5,15,1,40,28), +d(1934,10,7,1,40,28), +d(1935,5,15,1,40,28), +d(1935,10,6,1,40,28), +d(1936,5,15,1,40,28), +d(1936,10,4,1,40,28), +d(1937,5,22,1,40,28), +d(1937,6,30,22,40,28), +d(1937,10,3,1,40,0), +d(1938,5,15,1,40,0), +d(1938,10,2,1,40,0), +d(1939,5,15,1,40,0), +d(1939,10,8,1,40,0), +d(1940,5,15,23,40,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,9,16,1,0,0), +d(1976,12,31,23,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(1200,0,'AMT'), +i(4800,3600,'NST'), +i(4800,3600,'NEST'), +i(1200,0,'NET'), +i(4800,3600,'NEST'), +i(1200,0,'NET'), +i(4800,3600,'NEST'), +i(1200,0,'NET'), +i(7200,6000,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Amsterdam = Amsterdam() + diff --git a/vendor/pytz/zoneinfo/Europe/Andorra.py b/vendor/pytz/zoneinfo/Europe/Andorra.py new file mode 100644 index 00000000..2f5d03d0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Andorra.py @@ -0,0 +1,234 @@ +'''tzinfo timezone information for Europe/Andorra.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Andorra(DstTzInfo): + '''Europe/Andorra timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Andorra' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1946,9,30,0,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'WET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Andorra = Andorra() + diff --git a/vendor/pytz/zoneinfo/Europe/Athens.py b/vendor/pytz/zoneinfo/Europe/Athens.py new file mode 100644 index 00000000..c76b1960 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Athens.py @@ -0,0 +1,294 @@ +'''tzinfo timezone information for Europe/Athens.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Athens(DstTzInfo): + '''Europe/Athens timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Athens' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,27,22,26,8), +d(1932,7,6,22,0,0), +d(1932,8,31,21,0,0), +d(1941,4,6,22,0,0), +d(1941,4,29,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,23,0,0), +d(1943,10,3,22,0,0), +d(1944,4,3,23,0,0), +d(1952,6,30,22,0,0), +d(1952,11,1,21,0,0), +d(1975,4,11,22,0,0), +d(1975,11,25,22,0,0), +d(1976,4,11,0,0,0), +d(1976,10,10,0,0,0), +d(1977,4,3,0,0,0), +d(1977,9,26,0,0,0), +d(1978,4,2,0,0,0), +d(1978,9,24,1,0,0), +d(1979,4,1,7,0,0), +d(1979,9,28,23,0,0), +d(1980,3,31,22,0,0), +d(1980,9,27,21,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5700,0,'AMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Athens = Athens() + diff --git a/vendor/pytz/zoneinfo/Europe/Belfast.py b/vendor/pytz/zoneinfo/Europe/Belfast.py new file mode 100644 index 00000000..fa9c7b8d --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Belfast.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for Europe/Belfast.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Belfast(DstTzInfo): + '''Europe/Belfast timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Belfast' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +Belfast = Belfast() + diff --git a/vendor/pytz/zoneinfo/Europe/Belgrade.py b/vendor/pytz/zoneinfo/Europe/Belgrade.py new file mode 100644 index 00000000..9d363754 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Belgrade.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Belgrade.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Belgrade(DstTzInfo): + '''Europe/Belgrade timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Belgrade' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Belgrade = Belgrade() + diff --git a/vendor/pytz/zoneinfo/Europe/Berlin.py b/vendor/pytz/zoneinfo/Europe/Berlin.py new file mode 100644 index 00000000..bf588a1c --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Berlin.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for Europe/Berlin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Berlin(DstTzInfo): + '''Europe/Berlin timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Berlin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,5,24,0,0,0), +d(1945,9,24,0,0,0), +d(1945,11,18,1,0,0), +d(1946,4,14,1,0,0), +d(1946,10,7,1,0,0), +d(1947,4,6,1,0,0), +d(1947,5,11,1,0,0), +d(1947,6,29,0,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,10,1,0,0), +d(1949,10,2,1,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,7200,'CEMT'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,7200,'CEMT'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Berlin = Berlin() + diff --git a/vendor/pytz/zoneinfo/Europe/Bratislava.py b/vendor/pytz/zoneinfo/Europe/Bratislava.py new file mode 100644 index 00000000..db606b77 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Bratislava.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Europe/Bratislava.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bratislava(DstTzInfo): + '''Europe/Bratislava timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Bratislava' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,8,1,0,0), +d(1945,11,18,1,0,0), +d(1946,5,6,1,0,0), +d(1946,10,6,1,0,0), +d(1947,4,20,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,9,1,0,0), +d(1949,10,2,1,0,0), +d(1978,12,31,23,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Bratislava = Bratislava() + diff --git a/vendor/pytz/zoneinfo/Europe/Brussels.py b/vendor/pytz/zoneinfo/Europe/Brussels.py new file mode 100644 index 00000000..51a28a3f --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Brussels.py @@ -0,0 +1,390 @@ +'''tzinfo timezone information for Europe/Brussels.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Brussels(DstTzInfo): + '''Europe/Brussels timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Brussels' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1914,11,8,0,0,0), +d(1916,4,30,23,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1918,11,11,11,0,0), +d(1919,3,1,23,0,0), +d(1919,10,4,23,0,0), +d(1920,2,14,23,0,0), +d(1920,10,23,23,0,0), +d(1921,3,14,23,0,0), +d(1921,10,25,23,0,0), +d(1922,3,25,23,0,0), +d(1922,10,7,23,0,0), +d(1923,4,21,23,0,0), +d(1923,10,6,23,0,0), +d(1924,3,29,23,0,0), +d(1924,10,4,23,0,0), +d(1925,4,4,23,0,0), +d(1925,10,3,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,3,2,0,0), +d(1932,10,2,2,0,0), +d(1933,3,26,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,8,2,0,0), +d(1934,10,7,2,0,0), +d(1935,3,31,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,4,2,0,0), +d(1937,10,3,2,0,0), +d(1938,3,27,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1940,5,20,2,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,2,22,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,9,16,1,0,0), +d(1946,5,19,1,0,0), +d(1946,10,7,1,0,0), +d(1976,12,31,23,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'WET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Brussels = Brussels() + diff --git a/vendor/pytz/zoneinfo/Europe/Bucharest.py b/vendor/pytz/zoneinfo/Europe/Bucharest.py new file mode 100644 index 00000000..c565d9ef --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Bucharest.py @@ -0,0 +1,294 @@ +'''tzinfo timezone information for Europe/Bucharest.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Bucharest(DstTzInfo): + '''Europe/Bucharest timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Bucharest' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1931,7,23,22,15,36), +d(1932,5,20,22,0,0), +d(1932,10,1,22,0,0), +d(1933,4,1,22,0,0), +d(1933,9,30,22,0,0), +d(1934,4,7,22,0,0), +d(1934,10,6,22,0,0), +d(1935,4,6,22,0,0), +d(1935,10,5,22,0,0), +d(1936,4,4,22,0,0), +d(1936,10,3,22,0,0), +d(1937,4,3,22,0,0), +d(1937,10,2,22,0,0), +d(1938,4,2,22,0,0), +d(1938,10,1,22,0,0), +d(1939,4,1,22,0,0), +d(1939,9,30,22,0,0), +d(1979,5,26,22,0,0), +d(1979,9,29,21,0,0), +d(1980,4,5,21,0,0), +d(1980,9,27,22,0,0), +d(1981,3,29,0,0,0), +d(1981,9,27,0,0,0), +d(1982,3,28,0,0,0), +d(1982,9,26,0,0,0), +d(1983,3,27,0,0,0), +d(1983,9,25,0,0,0), +d(1984,3,25,0,0,0), +d(1984,9,30,0,0,0), +d(1985,3,31,0,0,0), +d(1985,9,29,0,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1988,3,27,0,0,0), +d(1988,9,25,0,0,0), +d(1989,3,26,0,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1990,12,31,22,0,0), +d(1991,3,30,22,0,0), +d(1991,9,28,22,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,22,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,22,0,0), +d(1993,12,31,22,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,21,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(6240,0,'BMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Bucharest = Bucharest() + diff --git a/vendor/pytz/zoneinfo/Europe/Budapest.py b/vendor/pytz/zoneinfo/Europe/Budapest.py new file mode 100644 index 00000000..3421346b --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Budapest.py @@ -0,0 +1,326 @@ +'''tzinfo timezone information for Europe/Budapest.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Budapest(DstTzInfo): + '''Europe/Budapest timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Budapest' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1917,12,31,23,0,0), +d(1918,4,1,2,0,0), +d(1918,9,29,1,0,0), +d(1919,4,15,2,0,0), +d(1919,9,15,1,0,0), +d(1920,4,5,2,0,0), +d(1920,9,30,1,0,0), +d(1941,4,6,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,1,22,0,0), +d(1945,11,2,22,0,0), +d(1946,3,31,1,0,0), +d(1946,10,6,1,0,0), +d(1947,4,6,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,4,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,10,1,0,0), +d(1949,10,2,1,0,0), +d(1950,4,17,1,0,0), +d(1950,10,23,1,0,0), +d(1954,5,22,23,0,0), +d(1954,10,2,22,0,0), +d(1955,5,22,23,0,0), +d(1955,10,2,22,0,0), +d(1956,6,2,23,0,0), +d(1956,9,29,22,0,0), +d(1957,6,2,0,0,0), +d(1957,9,29,1,0,0), +d(1980,4,6,0,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Budapest = Budapest() + diff --git a/vendor/pytz/zoneinfo/Europe/Chisinau.py b/vendor/pytz/zoneinfo/Europe/Chisinau.py new file mode 100644 index 00000000..a433db39 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Chisinau.py @@ -0,0 +1,300 @@ +'''tzinfo timezone information for Europe/Chisinau.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chisinau(DstTzInfo): + '''Europe/Chisinau timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Chisinau' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,2,14,22,5,0), +d(1931,7,23,22,15,36), +d(1932,5,20,22,0,0), +d(1932,10,1,22,0,0), +d(1933,4,1,22,0,0), +d(1933,9,30,22,0,0), +d(1934,4,7,22,0,0), +d(1934,10,6,22,0,0), +d(1935,4,6,22,0,0), +d(1935,10,5,22,0,0), +d(1936,4,4,22,0,0), +d(1936,10,3,22,0,0), +d(1937,4,3,22,0,0), +d(1937,10,2,22,0,0), +d(1938,4,2,22,0,0), +d(1938,10,1,22,0,0), +d(1939,4,1,22,0,0), +d(1939,9,30,22,0,0), +d(1940,8,14,22,0,0), +d(1941,7,16,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,8,23,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1990,5,5,21,0,0), +d(1991,3,31,0,0,0), +d(1991,9,29,0,0,0), +d(1991,12,31,22,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,21,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(6900,0,'CMT'), +i(6240,0,'BMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Chisinau = Chisinau() + diff --git a/vendor/pytz/zoneinfo/Europe/Copenhagen.py b/vendor/pytz/zoneinfo/Europe/Copenhagen.py new file mode 100644 index 00000000..9a0f2b68 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Copenhagen.py @@ -0,0 +1,286 @@ +'''tzinfo timezone information for Europe/Copenhagen.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Copenhagen(DstTzInfo): + '''Europe/Copenhagen timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Copenhagen' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,14,22,0,0), +d(1916,9,30,21,0,0), +d(1940,5,14,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,8,15,1,0,0), +d(1946,5,1,1,0,0), +d(1946,9,1,1,0,0), +d(1947,5,4,1,0,0), +d(1947,8,10,1,0,0), +d(1948,5,9,1,0,0), +d(1948,8,8,1,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Copenhagen = Copenhagen() + diff --git a/vendor/pytz/zoneinfo/Europe/Dublin.py b/vendor/pytz/zoneinfo/Europe/Dublin.py new file mode 100644 index 00000000..845c206d --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Dublin.py @@ -0,0 +1,478 @@ +'''tzinfo timezone information for Europe/Dublin.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Dublin(DstTzInfo): + '''Europe/Dublin timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Dublin' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,25,21), +d(1916,10,1,2,25,21), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1921,12,6,0,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1946,10,6,1,0,0), +d(1947,3,16,2,0,0), +d(1947,11,2,1,0,0), +d(1948,4,18,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-1500,0,'DMT'), +i(2100,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(3600,0,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), +i(3600,3600,'IST'), +i(0,0,'GMT'), + ] + +Dublin = Dublin() + diff --git a/vendor/pytz/zoneinfo/Europe/Gibraltar.py b/vendor/pytz/zoneinfo/Europe/Gibraltar.py new file mode 100644 index 00000000..b0598e8d --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Gibraltar.py @@ -0,0 +1,414 @@ +'''tzinfo timezone information for Europe/Gibraltar.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Gibraltar(DstTzInfo): + '''Europe/Gibraltar timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Gibraltar' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Gibraltar = Gibraltar() + diff --git a/vendor/pytz/zoneinfo/Europe/Guernsey.py b/vendor/pytz/zoneinfo/Europe/Guernsey.py new file mode 100644 index 00000000..7e1b9af6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Guernsey.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for Europe/Guernsey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guernsey(DstTzInfo): + '''Europe/Guernsey timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Guernsey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +Guernsey = Guernsey() + diff --git a/vendor/pytz/zoneinfo/Europe/Helsinki.py b/vendor/pytz/zoneinfo/Europe/Helsinki.py new file mode 100644 index 00000000..eefbebbc --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Helsinki.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Europe/Helsinki.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Helsinki(DstTzInfo): + '''Europe/Helsinki timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Helsinki' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,4,30,22,20,8), +d(1942,4,2,22,0,0), +d(1942,10,2,21,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(6000,0,'HMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Helsinki = Helsinki() + diff --git a/vendor/pytz/zoneinfo/Europe/Isle_of_Man.py b/vendor/pytz/zoneinfo/Europe/Isle_of_Man.py new file mode 100644 index 00000000..b5667de2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Isle_of_Man.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for Europe/Isle_of_Man.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Isle_of_Man(DstTzInfo): + '''Europe/Isle_of_Man timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Isle_of_Man' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +Isle_of_Man = Isle_of_Man() + diff --git a/vendor/pytz/zoneinfo/Europe/Istanbul.py b/vendor/pytz/zoneinfo/Europe/Istanbul.py new file mode 100644 index 00000000..7f02cca9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Istanbul.py @@ -0,0 +1,362 @@ +'''tzinfo timezone information for Europe/Istanbul.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Istanbul(DstTzInfo): + '''Europe/Istanbul timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Istanbul' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,9,30,22,3,4), +d(1916,4,30,22,0,0), +d(1916,9,30,21,0,0), +d(1920,3,27,22,0,0), +d(1920,10,24,21,0,0), +d(1921,4,2,22,0,0), +d(1921,10,2,21,0,0), +d(1922,3,25,22,0,0), +d(1922,10,7,21,0,0), +d(1924,5,12,22,0,0), +d(1924,9,30,21,0,0), +d(1925,4,30,22,0,0), +d(1925,9,30,21,0,0), +d(1940,6,29,22,0,0), +d(1940,10,4,21,0,0), +d(1940,11,30,22,0,0), +d(1941,9,20,21,0,0), +d(1942,3,31,22,0,0), +d(1942,10,31,21,0,0), +d(1945,4,1,22,0,0), +d(1945,10,7,21,0,0), +d(1946,5,31,22,0,0), +d(1946,9,30,21,0,0), +d(1947,4,19,22,0,0), +d(1947,10,4,21,0,0), +d(1948,4,17,22,0,0), +d(1948,10,2,21,0,0), +d(1949,4,9,22,0,0), +d(1949,10,1,21,0,0), +d(1950,4,18,22,0,0), +d(1950,10,7,21,0,0), +d(1951,4,21,22,0,0), +d(1951,10,7,21,0,0), +d(1962,7,14,22,0,0), +d(1962,10,7,21,0,0), +d(1964,5,14,22,0,0), +d(1964,9,30,21,0,0), +d(1970,5,2,22,0,0), +d(1970,10,3,21,0,0), +d(1971,5,1,22,0,0), +d(1971,10,2,21,0,0), +d(1972,5,6,22,0,0), +d(1972,10,7,21,0,0), +d(1973,6,2,23,0,0), +d(1973,11,4,0,0,0), +d(1974,3,31,0,0,0), +d(1974,11,3,2,0,0), +d(1975,3,29,22,0,0), +d(1975,10,25,21,0,0), +d(1976,5,31,22,0,0), +d(1976,10,30,21,0,0), +d(1977,4,2,22,0,0), +d(1977,10,15,21,0,0), +d(1978,4,1,22,0,0), +d(1978,10,14,21,0,0), +d(1979,10,14,20,0,0), +d(1980,4,6,0,0,0), +d(1980,10,12,20,0,0), +d(1981,3,29,0,0,0), +d(1981,10,11,20,0,0), +d(1982,3,28,0,0,0), +d(1982,10,10,20,0,0), +d(1983,7,30,21,0,0), +d(1983,10,1,20,0,0), +d(1985,4,19,21,0,0), +d(1985,9,27,21,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1988,3,27,0,0,0), +d(1988,9,25,0,0,0), +d(1989,3,26,0,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1990,12,31,22,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7020,0,'IMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(14400,7200,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Istanbul = Istanbul() + diff --git a/vendor/pytz/zoneinfo/Europe/Jersey.py b/vendor/pytz/zoneinfo/Europe/Jersey.py new file mode 100644 index 00000000..4c5bd165 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Jersey.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for Europe/Jersey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jersey(DstTzInfo): + '''Europe/Jersey timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Jersey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +Jersey = Jersey() + diff --git a/vendor/pytz/zoneinfo/Europe/Kaliningrad.py b/vendor/pytz/zoneinfo/Europe/Kaliningrad.py new file mode 100644 index 00000000..a0fe042c --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Kaliningrad.py @@ -0,0 +1,280 @@ +'''tzinfo timezone information for Europe/Kaliningrad.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kaliningrad(DstTzInfo): + '''Europe/Kaliningrad timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Kaliningrad' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1944,12,31,23,0,0), +d(1945,4,28,22,0,0), +d(1945,10,31,21,0,0), +d(1945,12,31,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1992,3,28,21,0,0), +d(1992,9,26,20,0,0), +d(1993,3,28,0,0,0), +d(1993,9,26,0,0,0), +d(1994,3,27,0,0,0), +d(1994,9,25,0,0,0), +d(1995,3,26,0,0,0), +d(1995,9,24,0,0,0), +d(1996,3,31,0,0,0), +d(1996,10,27,0,0,0), +d(1997,3,30,0,0,0), +d(1997,10,26,0,0,0), +d(1998,3,29,0,0,0), +d(1998,10,25,0,0,0), +d(1999,3,28,0,0,0), +d(1999,10,31,0,0,0), +d(2000,3,26,0,0,0), +d(2000,10,29,0,0,0), +d(2001,3,25,0,0,0), +d(2001,10,28,0,0,0), +d(2002,3,31,0,0,0), +d(2002,10,27,0,0,0), +d(2003,3,30,0,0,0), +d(2003,10,26,0,0,0), +d(2004,3,28,0,0,0), +d(2004,10,31,0,0,0), +d(2005,3,27,0,0,0), +d(2005,10,30,0,0,0), +d(2006,3,26,0,0,0), +d(2006,10,29,0,0,0), +d(2007,3,25,0,0,0), +d(2007,10,28,0,0,0), +d(2008,3,30,0,0,0), +d(2008,10,26,0,0,0), +d(2009,3,29,0,0,0), +d(2009,10,25,0,0,0), +d(2010,3,28,0,0,0), +d(2010,10,31,0,0,0), +d(2011,3,27,0,0,0), +d(2011,10,30,0,0,0), +d(2012,3,25,0,0,0), +d(2012,10,28,0,0,0), +d(2013,3,31,0,0,0), +d(2013,10,27,0,0,0), +d(2014,3,30,0,0,0), +d(2014,10,26,0,0,0), +d(2015,3,29,0,0,0), +d(2015,10,25,0,0,0), +d(2016,3,27,0,0,0), +d(2016,10,30,0,0,0), +d(2017,3,26,0,0,0), +d(2017,10,29,0,0,0), +d(2018,3,25,0,0,0), +d(2018,10,28,0,0,0), +d(2019,3,31,0,0,0), +d(2019,10,27,0,0,0), +d(2020,3,29,0,0,0), +d(2020,10,25,0,0,0), +d(2021,3,28,0,0,0), +d(2021,10,31,0,0,0), +d(2022,3,27,0,0,0), +d(2022,10,30,0,0,0), +d(2023,3,26,0,0,0), +d(2023,10,29,0,0,0), +d(2024,3,31,0,0,0), +d(2024,10,27,0,0,0), +d(2025,3,30,0,0,0), +d(2025,10,26,0,0,0), +d(2026,3,29,0,0,0), +d(2026,10,25,0,0,0), +d(2027,3,28,0,0,0), +d(2027,10,31,0,0,0), +d(2028,3,26,0,0,0), +d(2028,10,29,0,0,0), +d(2029,3,25,0,0,0), +d(2029,10,28,0,0,0), +d(2030,3,31,0,0,0), +d(2030,10,27,0,0,0), +d(2031,3,30,0,0,0), +d(2031,10,26,0,0,0), +d(2032,3,28,0,0,0), +d(2032,10,31,0,0,0), +d(2033,3,27,0,0,0), +d(2033,10,30,0,0,0), +d(2034,3,26,0,0,0), +d(2034,10,29,0,0,0), +d(2035,3,25,0,0,0), +d(2035,10,28,0,0,0), +d(2036,3,30,0,0,0), +d(2036,10,26,0,0,0), +d(2037,3,29,0,0,0), +d(2037,10,25,0,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'CET'), +i(10800,3600,'CEST'), +i(7200,0,'CET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Kaliningrad = Kaliningrad() + diff --git a/vendor/pytz/zoneinfo/Europe/Kiev.py b/vendor/pytz/zoneinfo/Europe/Kiev.py new file mode 100644 index 00000000..6219010a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Kiev.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Kiev.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kiev(DstTzInfo): + '''Europe/Kiev timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Kiev' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,21,57,56), +d(1930,6,20,22,0,0), +d(1941,9,19,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1943,11,5,23,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1990,6,30,23,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7320,0,'KMT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Kiev = Kiev() + diff --git a/vendor/pytz/zoneinfo/Europe/Lisbon.py b/vendor/pytz/zoneinfo/Europe/Lisbon.py new file mode 100644 index 00000000..a522a5e6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Lisbon.py @@ -0,0 +1,462 @@ +'''tzinfo timezone information for Europe/Lisbon.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Lisbon(DstTzInfo): + '''Europe/Lisbon timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Lisbon' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,36,32), +d(1916,6,17,23,0,0), +d(1916,11,1,0,0,0), +d(1917,2,28,23,0,0), +d(1917,10,14,23,0,0), +d(1918,3,1,23,0,0), +d(1918,10,14,23,0,0), +d(1919,2,28,23,0,0), +d(1919,10,14,23,0,0), +d(1920,2,29,23,0,0), +d(1920,10,14,23,0,0), +d(1921,2,28,23,0,0), +d(1921,10,14,23,0,0), +d(1924,4,16,23,0,0), +d(1924,10,14,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,4,20,23,0,0), +d(1929,10,5,23,0,0), +d(1931,4,18,23,0,0), +d(1931,10,3,23,0,0), +d(1932,4,2,23,0,0), +d(1932,10,1,23,0,0), +d(1934,4,7,23,0,0), +d(1934,10,6,23,0,0), +d(1935,3,30,23,0,0), +d(1935,10,5,23,0,0), +d(1936,4,18,23,0,0), +d(1936,10,3,23,0,0), +d(1937,4,3,23,0,0), +d(1937,10,2,23,0,0), +d(1938,3,26,23,0,0), +d(1938,10,1,23,0,0), +d(1939,4,15,23,0,0), +d(1939,11,18,23,0,0), +d(1940,2,24,23,0,0), +d(1940,10,5,23,0,0), +d(1941,4,5,23,0,0), +d(1941,10,5,23,0,0), +d(1942,3,14,23,0,0), +d(1942,4,25,22,0,0), +d(1942,8,15,22,0,0), +d(1942,10,24,23,0,0), +d(1943,3,13,23,0,0), +d(1943,4,17,22,0,0), +d(1943,8,28,22,0,0), +d(1943,10,30,23,0,0), +d(1944,3,11,23,0,0), +d(1944,4,22,22,0,0), +d(1944,8,26,22,0,0), +d(1944,10,28,23,0,0), +d(1945,3,10,23,0,0), +d(1945,4,21,22,0,0), +d(1945,8,25,22,0,0), +d(1945,10,27,23,0,0), +d(1946,4,6,23,0,0), +d(1946,10,5,23,0,0), +d(1947,4,6,2,0,0), +d(1947,10,5,2,0,0), +d(1948,4,4,2,0,0), +d(1948,10,3,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,2,2,0,0), +d(1951,4,1,2,0,0), +d(1951,10,7,2,0,0), +d(1952,4,6,2,0,0), +d(1952,10,5,2,0,0), +d(1953,4,5,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,4,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,3,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,1,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,7,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,6,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,5,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,3,2,0,0), +d(1960,10,2,2,0,0), +d(1961,4,2,2,0,0), +d(1961,10,1,2,0,0), +d(1962,4,1,2,0,0), +d(1962,10,7,2,0,0), +d(1963,4,7,2,0,0), +d(1963,10,6,2,0,0), +d(1964,4,5,2,0,0), +d(1964,10,4,2,0,0), +d(1965,4,4,2,0,0), +d(1965,10,3,2,0,0), +d(1966,4,3,2,0,0), +d(1976,9,26,0,0,0), +d(1977,3,27,0,0,0), +d(1977,9,25,0,0,0), +d(1978,4,2,0,0,0), +d(1978,10,1,0,0,0), +d(1979,4,1,0,0,0), +d(1979,9,30,1,0,0), +d(1980,3,30,0,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,2,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-2220,0,'LMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +Lisbon = Lisbon() + diff --git a/vendor/pytz/zoneinfo/Europe/Ljubljana.py b/vendor/pytz/zoneinfo/Europe/Ljubljana.py new file mode 100644 index 00000000..adf954f0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Ljubljana.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Ljubljana.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Ljubljana(DstTzInfo): + '''Europe/Ljubljana timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Ljubljana' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Ljubljana = Ljubljana() + diff --git a/vendor/pytz/zoneinfo/Europe/London.py b/vendor/pytz/zoneinfo/Europe/London.py new file mode 100644 index 00000000..9eff5985 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/London.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for Europe/London.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class London(DstTzInfo): + '''Europe/London timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/London' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +London = London() + diff --git a/vendor/pytz/zoneinfo/Europe/Luxembourg.py b/vendor/pytz/zoneinfo/Europe/Luxembourg.py new file mode 100644 index 00000000..89884ecd --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Luxembourg.py @@ -0,0 +1,388 @@ +'''tzinfo timezone information for Europe/Luxembourg.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Luxembourg(DstTzInfo): + '''Europe/Luxembourg timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Luxembourg' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,5,31,23,35,24), +d(1916,5,14,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,28,22,0,0), +d(1917,9,16,23,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1918,11,24,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,5,2,0,0), +d(1920,2,14,23,0,0), +d(1920,10,24,1,0,0), +d(1921,3,14,23,0,0), +d(1921,10,26,1,0,0), +d(1922,3,25,23,0,0), +d(1922,10,8,0,0,0), +d(1923,4,21,23,0,0), +d(1923,10,7,1,0,0), +d(1924,3,29,23,0,0), +d(1924,10,5,0,0,0), +d(1925,4,5,23,0,0), +d(1925,10,4,0,0,0), +d(1926,4,17,23,0,0), +d(1926,10,3,0,0,0), +d(1927,4,9,23,0,0), +d(1927,10,2,0,0,0), +d(1928,4,14,23,0,0), +d(1928,10,7,0,0,0), +d(1929,4,20,23,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,3,2,0,0), +d(1932,10,2,2,0,0), +d(1933,3,26,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,8,2,0,0), +d(1934,10,7,2,0,0), +d(1935,3,31,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,4,2,0,0), +d(1937,10,3,2,0,0), +d(1938,3,27,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1940,5,14,2,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,18,1,0,0), +d(1945,4,2,1,0,0), +d(1945,9,16,1,0,0), +d(1946,5,19,1,0,0), +d(1946,10,7,1,0,0), +d(1976,12,31,23,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(1500,0,'LMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEST'), +i(3600,0,'WET'), +i(7200,3600,'WEST'), +i(3600,0,'WET'), +i(7200,3600,'WEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Luxembourg = Luxembourg() + diff --git a/vendor/pytz/zoneinfo/Europe/Madrid.py b/vendor/pytz/zoneinfo/Europe/Madrid.py new file mode 100644 index 00000000..9d86ecfe --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Madrid.py @@ -0,0 +1,346 @@ +'''tzinfo timezone information for Europe/Madrid.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Madrid(DstTzInfo): + '''Europe/Madrid timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Madrid' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,5,5,23,0,0), +d(1917,10,6,23,0,0), +d(1918,4,15,23,0,0), +d(1918,10,6,23,0,0), +d(1919,4,5,23,0,0), +d(1919,10,6,23,0,0), +d(1924,4,16,23,0,0), +d(1924,10,4,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,4,20,23,0,0), +d(1929,10,5,23,0,0), +d(1937,5,22,23,0,0), +d(1937,10,2,23,0,0), +d(1938,3,22,23,0,0), +d(1938,10,1,23,0,0), +d(1939,4,15,23,0,0), +d(1939,10,7,23,0,0), +d(1940,3,16,23,0,0), +d(1942,5,2,22,0,0), +d(1942,9,1,22,0,0), +d(1943,4,17,22,0,0), +d(1943,10,3,22,0,0), +d(1944,4,15,22,0,0), +d(1944,10,10,22,0,0), +d(1945,4,14,22,0,0), +d(1945,9,29,23,0,0), +d(1946,4,13,22,0,0), +d(1946,9,29,22,0,0), +d(1949,4,30,22,0,0), +d(1949,9,29,23,0,0), +d(1974,4,13,22,0,0), +d(1974,10,5,23,0,0), +d(1975,4,19,22,0,0), +d(1975,10,4,23,0,0), +d(1976,3,27,22,0,0), +d(1976,9,25,23,0,0), +d(1977,4,2,22,0,0), +d(1977,9,24,23,0,0), +d(1978,4,2,22,0,0), +d(1978,9,30,23,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Madrid = Madrid() + diff --git a/vendor/pytz/zoneinfo/Europe/Malta.py b/vendor/pytz/zoneinfo/Europe/Malta.py new file mode 100644 index 00000000..e361bfc5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Malta.py @@ -0,0 +1,356 @@ +'''tzinfo timezone information for Europe/Malta.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Malta(DstTzInfo): + '''Europe/Malta timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Malta' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,6,2,23,0,0), +d(1916,9,30,23,0,0), +d(1917,3,31,23,0,0), +d(1917,9,29,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,5,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,4,23,0,0), +d(1920,3,20,23,0,0), +d(1920,9,18,23,0,0), +d(1940,6,14,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,9,14,23,0,0), +d(1946,3,17,1,0,0), +d(1946,10,6,1,0,0), +d(1947,3,15,23,0,0), +d(1947,10,4,23,0,0), +d(1948,2,29,1,0,0), +d(1948,10,3,1,0,0), +d(1966,5,21,23,0,0), +d(1966,9,24,22,0,0), +d(1967,5,27,23,0,0), +d(1967,9,23,22,0,0), +d(1968,5,25,23,0,0), +d(1968,9,21,22,0,0), +d(1969,5,31,23,0,0), +d(1969,9,27,22,0,0), +d(1970,5,30,23,0,0), +d(1970,9,26,22,0,0), +d(1971,5,22,23,0,0), +d(1971,9,25,23,0,0), +d(1972,5,27,23,0,0), +d(1972,9,30,22,0,0), +d(1973,3,30,23,0,0), +d(1973,9,28,23,0,0), +d(1974,4,20,23,0,0), +d(1974,9,15,23,0,0), +d(1975,4,20,1,0,0), +d(1975,9,21,0,0,0), +d(1976,4,18,1,0,0), +d(1976,9,19,0,0,0), +d(1977,4,17,1,0,0), +d(1977,9,18,0,0,0), +d(1978,4,16,1,0,0), +d(1978,9,17,0,0,0), +d(1979,4,15,1,0,0), +d(1979,9,16,0,0,0), +d(1980,3,31,1,0,0), +d(1980,9,21,0,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Malta = Malta() + diff --git a/vendor/pytz/zoneinfo/Europe/Mariehamn.py b/vendor/pytz/zoneinfo/Europe/Mariehamn.py new file mode 100644 index 00000000..cd8bb70f --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Mariehamn.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Europe/Mariehamn.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mariehamn(DstTzInfo): + '''Europe/Mariehamn timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Mariehamn' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,4,30,22,20,8), +d(1942,4,2,22,0,0), +d(1942,10,2,21,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(6000,0,'HMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Mariehamn = Mariehamn() + diff --git a/vendor/pytz/zoneinfo/Europe/Minsk.py b/vendor/pytz/zoneinfo/Europe/Minsk.py new file mode 100644 index 00000000..2a1bb6da --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Minsk.py @@ -0,0 +1,262 @@ +'''tzinfo timezone information for Europe/Minsk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Minsk(DstTzInfo): + '''Europe/Minsk timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Minsk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,22,10,0), +d(1930,6,20,22,0,0), +d(1941,6,27,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,7,2,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,22,0,0), +d(1993,3,28,0,0,0), +d(1993,9,26,0,0,0), +d(1994,3,27,0,0,0), +d(1994,9,25,0,0,0), +d(1995,3,26,0,0,0), +d(1995,9,24,0,0,0), +d(1996,3,31,0,0,0), +d(1996,10,27,0,0,0), +d(1997,3,30,0,0,0), +d(1997,10,26,0,0,0), +d(1998,3,29,0,0,0), +d(1998,10,25,0,0,0), +d(1999,3,28,0,0,0), +d(1999,10,31,0,0,0), +d(2000,3,26,0,0,0), +d(2000,10,29,0,0,0), +d(2001,3,25,0,0,0), +d(2001,10,28,0,0,0), +d(2002,3,31,0,0,0), +d(2002,10,27,0,0,0), +d(2003,3,30,0,0,0), +d(2003,10,26,0,0,0), +d(2004,3,28,0,0,0), +d(2004,10,31,0,0,0), +d(2005,3,27,0,0,0), +d(2005,10,30,0,0,0), +d(2006,3,26,0,0,0), +d(2006,10,29,0,0,0), +d(2007,3,25,0,0,0), +d(2007,10,28,0,0,0), +d(2008,3,30,0,0,0), +d(2008,10,26,0,0,0), +d(2009,3,29,0,0,0), +d(2009,10,25,0,0,0), +d(2010,3,28,0,0,0), +d(2010,10,31,0,0,0), +d(2011,3,27,0,0,0), +d(2011,10,30,0,0,0), +d(2012,3,25,0,0,0), +d(2012,10,28,0,0,0), +d(2013,3,31,0,0,0), +d(2013,10,27,0,0,0), +d(2014,3,30,0,0,0), +d(2014,10,26,0,0,0), +d(2015,3,29,0,0,0), +d(2015,10,25,0,0,0), +d(2016,3,27,0,0,0), +d(2016,10,30,0,0,0), +d(2017,3,26,0,0,0), +d(2017,10,29,0,0,0), +d(2018,3,25,0,0,0), +d(2018,10,28,0,0,0), +d(2019,3,31,0,0,0), +d(2019,10,27,0,0,0), +d(2020,3,29,0,0,0), +d(2020,10,25,0,0,0), +d(2021,3,28,0,0,0), +d(2021,10,31,0,0,0), +d(2022,3,27,0,0,0), +d(2022,10,30,0,0,0), +d(2023,3,26,0,0,0), +d(2023,10,29,0,0,0), +d(2024,3,31,0,0,0), +d(2024,10,27,0,0,0), +d(2025,3,30,0,0,0), +d(2025,10,26,0,0,0), +d(2026,3,29,0,0,0), +d(2026,10,25,0,0,0), +d(2027,3,28,0,0,0), +d(2027,10,31,0,0,0), +d(2028,3,26,0,0,0), +d(2028,10,29,0,0,0), +d(2029,3,25,0,0,0), +d(2029,10,28,0,0,0), +d(2030,3,31,0,0,0), +d(2030,10,27,0,0,0), +d(2031,3,30,0,0,0), +d(2031,10,26,0,0,0), +d(2032,3,28,0,0,0), +d(2032,10,31,0,0,0), +d(2033,3,27,0,0,0), +d(2033,10,30,0,0,0), +d(2034,3,26,0,0,0), +d(2034,10,29,0,0,0), +d(2035,3,25,0,0,0), +d(2035,10,28,0,0,0), +d(2036,3,30,0,0,0), +d(2036,10,26,0,0,0), +d(2037,3,29,0,0,0), +d(2037,10,25,0,0,0), + ] + + _transition_info = [ +i(6600,0,'MMT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Minsk = Minsk() + diff --git a/vendor/pytz/zoneinfo/Europe/Monaco.py b/vendor/pytz/zoneinfo/Europe/Monaco.py new file mode 100644 index 00000000..4884ef22 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Monaco.py @@ -0,0 +1,388 @@ +'''tzinfo timezone information for Europe/Monaco.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Monaco(DstTzInfo): + '''Europe/Monaco timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Monaco' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,3,10,23,50,39), +d(1916,6,14,23,0,0), +d(1916,10,1,23,0,0), +d(1917,3,24,23,0,0), +d(1917,10,7,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,6,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,5,23,0,0), +d(1920,2,14,23,0,0), +d(1920,10,23,23,0,0), +d(1921,3,14,23,0,0), +d(1921,10,25,23,0,0), +d(1922,3,25,23,0,0), +d(1922,10,7,23,0,0), +d(1923,5,26,23,0,0), +d(1923,10,6,23,0,0), +d(1924,3,29,23,0,0), +d(1924,10,4,23,0,0), +d(1925,4,4,23,0,0), +d(1925,10,3,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,4,20,23,0,0), +d(1929,10,5,23,0,0), +d(1930,4,12,23,0,0), +d(1930,10,4,23,0,0), +d(1931,4,18,23,0,0), +d(1931,10,3,23,0,0), +d(1932,4,2,23,0,0), +d(1932,10,1,23,0,0), +d(1933,3,25,23,0,0), +d(1933,10,7,23,0,0), +d(1934,4,7,23,0,0), +d(1934,10,6,23,0,0), +d(1935,3,30,23,0,0), +d(1935,10,5,23,0,0), +d(1936,4,18,23,0,0), +d(1936,10,3,23,0,0), +d(1937,4,3,23,0,0), +d(1937,10,2,23,0,0), +d(1938,3,26,23,0,0), +d(1938,10,1,23,0,0), +d(1939,4,15,23,0,0), +d(1939,11,18,23,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,23,0,0), +d(1941,10,5,22,0,0), +d(1942,3,8,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,7,23,0,0), +d(1945,4,2,1,0,0), +d(1945,9,16,1,0,0), +d(1976,3,28,0,0,0), +d(1976,9,25,23,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(540,0,'PMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Monaco = Monaco() + diff --git a/vendor/pytz/zoneinfo/Europe/Moscow.py b/vendor/pytz/zoneinfo/Europe/Moscow.py new file mode 100644 index 00000000..943112d0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Moscow.py @@ -0,0 +1,278 @@ +'''tzinfo timezone information for Europe/Moscow.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Moscow(DstTzInfo): + '''Europe/Moscow timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Moscow' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,2,21,30,0), +d(1917,7,1,20,29,12), +d(1917,12,27,20,29,12), +d(1918,5,31,19,29,12), +d(1918,9,15,20,29,12), +d(1919,5,31,19,29,12), +d(1919,6,30,21,29,12), +d(1919,8,15,20,0,0), +d(1921,2,14,20,0,0), +d(1921,3,20,19,0,0), +d(1921,8,31,19,0,0), +d(1921,9,30,20,0,0), +d(1922,9,30,21,0,0), +d(1930,6,20,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1992,1,19,0,0,0), +d(1992,3,28,20,0,0), +d(1992,9,26,19,0,0), +d(1993,3,27,23,0,0), +d(1993,9,25,23,0,0), +d(1994,3,26,23,0,0), +d(1994,9,24,23,0,0), +d(1995,3,25,23,0,0), +d(1995,9,23,23,0,0), +d(1996,3,30,23,0,0), +d(1996,10,26,23,0,0), +d(1997,3,29,23,0,0), +d(1997,10,25,23,0,0), +d(1998,3,28,23,0,0), +d(1998,10,24,23,0,0), +d(1999,3,27,23,0,0), +d(1999,10,30,23,0,0), +d(2000,3,25,23,0,0), +d(2000,10,28,23,0,0), +d(2001,3,24,23,0,0), +d(2001,10,27,23,0,0), +d(2002,3,30,23,0,0), +d(2002,10,26,23,0,0), +d(2003,3,29,23,0,0), +d(2003,10,25,23,0,0), +d(2004,3,27,23,0,0), +d(2004,10,30,23,0,0), +d(2005,3,26,23,0,0), +d(2005,10,29,23,0,0), +d(2006,3,25,23,0,0), +d(2006,10,28,23,0,0), +d(2007,3,24,23,0,0), +d(2007,10,27,23,0,0), +d(2008,3,29,23,0,0), +d(2008,10,25,23,0,0), +d(2009,3,28,23,0,0), +d(2009,10,24,23,0,0), +d(2010,3,27,23,0,0), +d(2010,10,30,23,0,0), +d(2011,3,26,23,0,0), +d(2011,10,29,23,0,0), +d(2012,3,24,23,0,0), +d(2012,10,27,23,0,0), +d(2013,3,30,23,0,0), +d(2013,10,26,23,0,0), +d(2014,3,29,23,0,0), +d(2014,10,25,23,0,0), +d(2015,3,28,23,0,0), +d(2015,10,24,23,0,0), +d(2016,3,26,23,0,0), +d(2016,10,29,23,0,0), +d(2017,3,25,23,0,0), +d(2017,10,28,23,0,0), +d(2018,3,24,23,0,0), +d(2018,10,27,23,0,0), +d(2019,3,30,23,0,0), +d(2019,10,26,23,0,0), +d(2020,3,28,23,0,0), +d(2020,10,24,23,0,0), +d(2021,3,27,23,0,0), +d(2021,10,30,23,0,0), +d(2022,3,26,23,0,0), +d(2022,10,29,23,0,0), +d(2023,3,25,23,0,0), +d(2023,10,28,23,0,0), +d(2024,3,30,23,0,0), +d(2024,10,26,23,0,0), +d(2025,3,29,23,0,0), +d(2025,10,25,23,0,0), +d(2026,3,28,23,0,0), +d(2026,10,24,23,0,0), +d(2027,3,27,23,0,0), +d(2027,10,30,23,0,0), +d(2028,3,25,23,0,0), +d(2028,10,28,23,0,0), +d(2029,3,24,23,0,0), +d(2029,10,27,23,0,0), +d(2030,3,30,23,0,0), +d(2030,10,26,23,0,0), +d(2031,3,29,23,0,0), +d(2031,10,25,23,0,0), +d(2032,3,27,23,0,0), +d(2032,10,30,23,0,0), +d(2033,3,26,23,0,0), +d(2033,10,29,23,0,0), +d(2034,3,25,23,0,0), +d(2034,10,28,23,0,0), +d(2035,3,24,23,0,0), +d(2035,10,27,23,0,0), +d(2036,3,29,23,0,0), +d(2036,10,25,23,0,0), +d(2037,3,28,23,0,0), +d(2037,10,24,23,0,0), + ] + + _transition_info = [ +i(9000,0,'MMT'), +i(9060,0,'MMT'), +i(12660,3600,'MST'), +i(9060,0,'MMT'), +i(16260,7200,'MDST'), +i(12660,3600,'MST'), +i(16260,7200,'MDST'), +i(14400,5340,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(18000,7200,'MSD'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), + ] + +Moscow = Moscow() + diff --git a/vendor/pytz/zoneinfo/Europe/Nicosia.py b/vendor/pytz/zoneinfo/Europe/Nicosia.py new file mode 100644 index 00000000..0eb3bc8f --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Nicosia.py @@ -0,0 +1,274 @@ +'''tzinfo timezone information for Europe/Nicosia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nicosia(DstTzInfo): + '''Europe/Nicosia timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Nicosia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,11,13,21,46,32), +d(1975,4,12,22,0,0), +d(1975,10,11,21,0,0), +d(1976,5,14,22,0,0), +d(1976,10,10,21,0,0), +d(1977,4,2,22,0,0), +d(1977,9,24,21,0,0), +d(1978,4,1,22,0,0), +d(1978,10,1,21,0,0), +d(1979,3,31,22,0,0), +d(1979,9,29,21,0,0), +d(1980,4,5,22,0,0), +d(1980,9,27,21,0,0), +d(1981,3,28,22,0,0), +d(1981,9,26,21,0,0), +d(1982,3,27,22,0,0), +d(1982,9,25,21,0,0), +d(1983,3,26,22,0,0), +d(1983,9,24,21,0,0), +d(1984,3,24,22,0,0), +d(1984,9,29,21,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,21,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,21,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,21,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,21,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,21,0,0), +d(1990,3,24,22,0,0), +d(1990,9,29,21,0,0), +d(1991,3,30,22,0,0), +d(1991,9,28,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,9,28,21,0,0), +d(1997,3,29,22,0,0), +d(1997,9,27,21,0,0), +d(1998,3,28,22,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7980,0,'LMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Nicosia = Nicosia() + diff --git a/vendor/pytz/zoneinfo/Europe/Oslo.py b/vendor/pytz/zoneinfo/Europe/Oslo.py new file mode 100644 index 00000000..f2e47949 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Oslo.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Europe/Oslo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Oslo(DstTzInfo): + '''Europe/Oslo timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Oslo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,22,0,0,0), +d(1916,9,29,22,0,0), +d(1940,8,10,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,10,1,1,0,0), +d(1959,3,15,1,0,0), +d(1959,9,20,1,0,0), +d(1960,3,20,1,0,0), +d(1960,9,18,1,0,0), +d(1961,3,19,1,0,0), +d(1961,9,17,1,0,0), +d(1962,3,18,1,0,0), +d(1962,9,16,1,0,0), +d(1963,3,17,1,0,0), +d(1963,9,15,1,0,0), +d(1964,3,15,1,0,0), +d(1964,9,20,1,0,0), +d(1965,4,25,1,0,0), +d(1965,9,19,1,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Oslo = Oslo() + diff --git a/vendor/pytz/zoneinfo/Europe/Paris.py b/vendor/pytz/zoneinfo/Europe/Paris.py new file mode 100644 index 00000000..59892b45 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Paris.py @@ -0,0 +1,386 @@ +'''tzinfo timezone information for Europe/Paris.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Paris(DstTzInfo): + '''Europe/Paris timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Paris' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,3,10,23,51,39), +d(1916,6,14,23,0,0), +d(1916,10,1,23,0,0), +d(1917,3,24,23,0,0), +d(1917,10,7,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,6,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,5,23,0,0), +d(1920,2,14,23,0,0), +d(1920,10,23,23,0,0), +d(1921,3,14,23,0,0), +d(1921,10,25,23,0,0), +d(1922,3,25,23,0,0), +d(1922,10,7,23,0,0), +d(1923,5,26,23,0,0), +d(1923,10,6,23,0,0), +d(1924,3,29,23,0,0), +d(1924,10,4,23,0,0), +d(1925,4,4,23,0,0), +d(1925,10,3,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,4,20,23,0,0), +d(1929,10,5,23,0,0), +d(1930,4,12,23,0,0), +d(1930,10,4,23,0,0), +d(1931,4,18,23,0,0), +d(1931,10,3,23,0,0), +d(1932,4,2,23,0,0), +d(1932,10,1,23,0,0), +d(1933,3,25,23,0,0), +d(1933,10,7,23,0,0), +d(1934,4,7,23,0,0), +d(1934,10,6,23,0,0), +d(1935,3,30,23,0,0), +d(1935,10,5,23,0,0), +d(1936,4,18,23,0,0), +d(1936,10,3,23,0,0), +d(1937,4,3,23,0,0), +d(1937,10,2,23,0,0), +d(1938,3,26,23,0,0), +d(1938,10,1,23,0,0), +d(1939,4,15,23,0,0), +d(1939,11,18,23,0,0), +d(1940,2,25,2,0,0), +d(1940,6,14,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,8,24,22,0,0), +d(1944,10,7,23,0,0), +d(1945,4,2,1,0,0), +d(1945,9,16,1,0,0), +d(1976,3,28,0,0,0), +d(1976,9,25,23,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(540,0,'PMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'WEMT'), +i(3600,0,'WEST'), +i(7200,3600,'WEMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Paris = Paris() + diff --git a/vendor/pytz/zoneinfo/Europe/Podgorica.py b/vendor/pytz/zoneinfo/Europe/Podgorica.py new file mode 100644 index 00000000..9be71d93 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Podgorica.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Podgorica.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Podgorica(DstTzInfo): + '''Europe/Podgorica timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Podgorica' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Podgorica = Podgorica() + diff --git a/vendor/pytz/zoneinfo/Europe/Prague.py b/vendor/pytz/zoneinfo/Europe/Prague.py new file mode 100644 index 00000000..9c7f982b --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Prague.py @@ -0,0 +1,302 @@ +'''tzinfo timezone information for Europe/Prague.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Prague(DstTzInfo): + '''Europe/Prague timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Prague' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,8,1,0,0), +d(1945,11,18,1,0,0), +d(1946,5,6,1,0,0), +d(1946,10,6,1,0,0), +d(1947,4,20,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,9,1,0,0), +d(1949,10,2,1,0,0), +d(1978,12,31,23,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Prague = Prague() + diff --git a/vendor/pytz/zoneinfo/Europe/Riga.py b/vendor/pytz/zoneinfo/Europe/Riga.py new file mode 100644 index 00000000..45b59725 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Riga.py @@ -0,0 +1,274 @@ +'''tzinfo timezone information for Europe/Riga.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Riga(DstTzInfo): + '''Europe/Riga timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Riga' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,4,15,0,23,36), +d(1918,9,16,0,23,36), +d(1919,4,1,0,23,36), +d(1919,5,22,0,23,36), +d(1926,5,10,22,23,36), +d(1940,8,4,22,0,0), +d(1941,6,30,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1944,10,12,23,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1991,3,31,0,0,0), +d(1991,9,29,0,0,0), +d(1992,3,29,0,0,0), +d(1992,9,27,0,0,0), +d(1993,3,28,0,0,0), +d(1993,9,26,0,0,0), +d(1994,3,27,0,0,0), +d(1994,9,25,0,0,0), +d(1995,3,26,0,0,0), +d(1995,9,24,0,0,0), +d(1996,3,31,0,0,0), +d(1996,9,29,0,0,0), +d(1997,1,20,22,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,2,28,22,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5760,0,'RMT'), +i(9360,3600,'LST'), +i(5760,0,'RMT'), +i(9360,3600,'LST'), +i(5760,0,'RMT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Riga = Riga() + diff --git a/vendor/pytz/zoneinfo/Europe/Rome.py b/vendor/pytz/zoneinfo/Europe/Rome.py new file mode 100644 index 00000000..758a6ed8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Rome.py @@ -0,0 +1,360 @@ +'''tzinfo timezone information for Europe/Rome.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rome(DstTzInfo): + '''Europe/Rome timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Rome' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,6,2,23,0,0), +d(1916,9,30,23,0,0), +d(1917,3,31,23,0,0), +d(1917,9,29,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,5,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,4,23,0,0), +d(1920,3,20,23,0,0), +d(1920,9,18,23,0,0), +d(1940,6,14,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,6,30,22,0,0), +d(1944,9,16,23,0,0), +d(1945,4,2,1,0,0), +d(1945,9,14,23,0,0), +d(1946,3,17,1,0,0), +d(1946,10,6,1,0,0), +d(1947,3,15,23,0,0), +d(1947,10,4,23,0,0), +d(1948,2,29,1,0,0), +d(1948,10,3,1,0,0), +d(1966,5,21,23,0,0), +d(1966,9,24,22,0,0), +d(1967,5,27,23,0,0), +d(1967,9,23,22,0,0), +d(1968,5,25,23,0,0), +d(1968,9,21,22,0,0), +d(1969,5,31,23,0,0), +d(1969,9,27,22,0,0), +d(1970,5,30,23,0,0), +d(1970,9,26,22,0,0), +d(1971,5,22,23,0,0), +d(1971,9,25,23,0,0), +d(1972,5,27,23,0,0), +d(1972,9,30,22,0,0), +d(1973,6,2,23,0,0), +d(1973,9,29,22,0,0), +d(1974,5,25,23,0,0), +d(1974,9,28,22,0,0), +d(1975,5,31,23,0,0), +d(1975,9,27,23,0,0), +d(1976,5,29,23,0,0), +d(1976,9,25,23,0,0), +d(1977,5,21,23,0,0), +d(1977,9,24,23,0,0), +d(1978,5,27,23,0,0), +d(1978,9,30,23,0,0), +d(1979,5,26,23,0,0), +d(1979,9,29,23,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Rome = Rome() + diff --git a/vendor/pytz/zoneinfo/Europe/Samara.py b/vendor/pytz/zoneinfo/Europe/Samara.py new file mode 100644 index 00000000..cb67e77a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Samara.py @@ -0,0 +1,256 @@ +'''tzinfo timezone information for Europe/Samara.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Samara(DstTzInfo): + '''Europe/Samara timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Samara' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,6,30,22,39,24), +d(1930,6,20,21,0,0), +d(1935,1,26,20,0,0), +d(1981,3,31,20,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,20,0,0), +d(1982,9,30,19,0,0), +d(1983,3,31,20,0,0), +d(1983,9,30,19,0,0), +d(1984,3,31,20,0,0), +d(1984,9,29,22,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1991,10,20,0,0,0), +d(1992,3,28,19,0,0), +d(1992,9,26,18,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,22,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,22,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,22,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,22,0,0), +d(1997,3,29,22,0,0), +d(1997,10,25,22,0,0), +d(1998,3,28,22,0,0), +d(1998,10,24,22,0,0), +d(1999,3,27,22,0,0), +d(1999,10,30,22,0,0), +d(2000,3,25,22,0,0), +d(2000,10,28,22,0,0), +d(2001,3,24,22,0,0), +d(2001,10,27,22,0,0), +d(2002,3,30,22,0,0), +d(2002,10,26,22,0,0), +d(2003,3,29,22,0,0), +d(2003,10,25,22,0,0), +d(2004,3,27,22,0,0), +d(2004,10,30,22,0,0), +d(2005,3,26,22,0,0), +d(2005,10,29,22,0,0), +d(2006,3,25,22,0,0), +d(2006,10,28,22,0,0), +d(2007,3,24,22,0,0), +d(2007,10,27,22,0,0), +d(2008,3,29,22,0,0), +d(2008,10,25,22,0,0), +d(2009,3,28,22,0,0), +d(2009,10,24,22,0,0), +d(2010,3,27,22,0,0), +d(2010,10,30,22,0,0), +d(2011,3,26,22,0,0), +d(2011,10,29,22,0,0), +d(2012,3,24,22,0,0), +d(2012,10,27,22,0,0), +d(2013,3,30,22,0,0), +d(2013,10,26,22,0,0), +d(2014,3,29,22,0,0), +d(2014,10,25,22,0,0), +d(2015,3,28,22,0,0), +d(2015,10,24,22,0,0), +d(2016,3,26,22,0,0), +d(2016,10,29,22,0,0), +d(2017,3,25,22,0,0), +d(2017,10,28,22,0,0), +d(2018,3,24,22,0,0), +d(2018,10,27,22,0,0), +d(2019,3,30,22,0,0), +d(2019,10,26,22,0,0), +d(2020,3,28,22,0,0), +d(2020,10,24,22,0,0), +d(2021,3,27,22,0,0), +d(2021,10,30,22,0,0), +d(2022,3,26,22,0,0), +d(2022,10,29,22,0,0), +d(2023,3,25,22,0,0), +d(2023,10,28,22,0,0), +d(2024,3,30,22,0,0), +d(2024,10,26,22,0,0), +d(2025,3,29,22,0,0), +d(2025,10,25,22,0,0), +d(2026,3,28,22,0,0), +d(2026,10,24,22,0,0), +d(2027,3,27,22,0,0), +d(2027,10,30,22,0,0), +d(2028,3,25,22,0,0), +d(2028,10,28,22,0,0), +d(2029,3,24,22,0,0), +d(2029,10,27,22,0,0), +d(2030,3,30,22,0,0), +d(2030,10,26,22,0,0), +d(2031,3,29,22,0,0), +d(2031,10,25,22,0,0), +d(2032,3,27,22,0,0), +d(2032,10,30,22,0,0), +d(2033,3,26,22,0,0), +d(2033,10,29,22,0,0), +d(2034,3,25,22,0,0), +d(2034,10,28,22,0,0), +d(2035,3,24,22,0,0), +d(2035,10,27,22,0,0), +d(2036,3,29,22,0,0), +d(2036,10,25,22,0,0), +d(2037,3,28,22,0,0), +d(2037,10,24,22,0,0), + ] + + _transition_info = [ +i(12060,0,'LMT'), +i(10800,0,'SAMT'), +i(14400,0,'SAMT'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(18000,3600,'KUYST'), +i(14400,0,'KUYT'), +i(14400,0,'KUYST'), +i(10800,0,'KUYT'), +i(14400,3600,'KUYST'), +i(10800,0,'KUYT'), +i(10800,0,'KUYST'), +i(10800,0,'KUYT'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), +i(18000,3600,'SAMST'), +i(14400,0,'SAMT'), + ] + +Samara = Samara() + diff --git a/vendor/pytz/zoneinfo/Europe/San_Marino.py b/vendor/pytz/zoneinfo/Europe/San_Marino.py new file mode 100644 index 00000000..dae62535 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/San_Marino.py @@ -0,0 +1,360 @@ +'''tzinfo timezone information for Europe/San_Marino.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class San_Marino(DstTzInfo): + '''Europe/San_Marino timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/San_Marino' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,6,2,23,0,0), +d(1916,9,30,23,0,0), +d(1917,3,31,23,0,0), +d(1917,9,29,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,5,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,4,23,0,0), +d(1920,3,20,23,0,0), +d(1920,9,18,23,0,0), +d(1940,6,14,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,6,30,22,0,0), +d(1944,9,16,23,0,0), +d(1945,4,2,1,0,0), +d(1945,9,14,23,0,0), +d(1946,3,17,1,0,0), +d(1946,10,6,1,0,0), +d(1947,3,15,23,0,0), +d(1947,10,4,23,0,0), +d(1948,2,29,1,0,0), +d(1948,10,3,1,0,0), +d(1966,5,21,23,0,0), +d(1966,9,24,22,0,0), +d(1967,5,27,23,0,0), +d(1967,9,23,22,0,0), +d(1968,5,25,23,0,0), +d(1968,9,21,22,0,0), +d(1969,5,31,23,0,0), +d(1969,9,27,22,0,0), +d(1970,5,30,23,0,0), +d(1970,9,26,22,0,0), +d(1971,5,22,23,0,0), +d(1971,9,25,23,0,0), +d(1972,5,27,23,0,0), +d(1972,9,30,22,0,0), +d(1973,6,2,23,0,0), +d(1973,9,29,22,0,0), +d(1974,5,25,23,0,0), +d(1974,9,28,22,0,0), +d(1975,5,31,23,0,0), +d(1975,9,27,23,0,0), +d(1976,5,29,23,0,0), +d(1976,9,25,23,0,0), +d(1977,5,21,23,0,0), +d(1977,9,24,23,0,0), +d(1978,5,27,23,0,0), +d(1978,9,30,23,0,0), +d(1979,5,26,23,0,0), +d(1979,9,29,23,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +San_Marino = San_Marino() + diff --git a/vendor/pytz/zoneinfo/Europe/Sarajevo.py b/vendor/pytz/zoneinfo/Europe/Sarajevo.py new file mode 100644 index 00000000..2b7d7540 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Sarajevo.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Sarajevo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sarajevo(DstTzInfo): + '''Europe/Sarajevo timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Sarajevo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Sarajevo = Sarajevo() + diff --git a/vendor/pytz/zoneinfo/Europe/Simferopol.py b/vendor/pytz/zoneinfo/Europe/Simferopol.py new file mode 100644 index 00000000..63b47f9a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Simferopol.py @@ -0,0 +1,266 @@ +'''tzinfo timezone information for Europe/Simferopol.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Simferopol(DstTzInfo): + '''Europe/Simferopol timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Simferopol' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,21,44,0), +d(1930,6,20,22,0,0), +d(1941,10,31,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,4,12,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1990,6,30,23,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,4,30,21,0,0), +d(1994,9,24,20,0,0), +d(1995,3,25,21,0,0), +d(1995,9,23,20,0,0), +d(1996,3,30,21,0,0), +d(1996,3,31,0,0,0), +d(1996,10,27,0,0,0), +d(1996,12,31,21,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(8160,0,'SMT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(14400,7200,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Simferopol = Simferopol() + diff --git a/vendor/pytz/zoneinfo/Europe/Skopje.py b/vendor/pytz/zoneinfo/Europe/Skopje.py new file mode 100644 index 00000000..c37e0328 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Skopje.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Skopje.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Skopje(DstTzInfo): + '''Europe/Skopje timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Skopje' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Skopje = Skopje() + diff --git a/vendor/pytz/zoneinfo/Europe/Sofia.py b/vendor/pytz/zoneinfo/Europe/Sofia.py new file mode 100644 index 00000000..528daf7d --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Sofia.py @@ -0,0 +1,270 @@ +'''tzinfo timezone information for Europe/Sofia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Sofia(DstTzInfo): + '''Europe/Sofia timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Sofia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,2,0,0), +d(1979,3,31,21,0,0), +d(1979,9,30,22,0,0), +d(1980,4,5,21,0,0), +d(1980,9,28,22,0,0), +d(1981,4,4,21,0,0), +d(1981,9,26,23,0,0), +d(1982,4,3,21,0,0), +d(1982,9,26,0,0,0), +d(1983,3,27,0,0,0), +d(1983,9,25,0,0,0), +d(1984,3,25,0,0,0), +d(1984,9,30,0,0,0), +d(1985,3,31,0,0,0), +d(1985,9,29,0,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1988,3,27,0,0,0), +d(1988,9,25,0,0,0), +d(1989,3,26,0,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1990,12,31,22,0,0), +d(1991,3,30,22,0,0), +d(1991,9,28,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,21,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Sofia = Sofia() + diff --git a/vendor/pytz/zoneinfo/Europe/Stockholm.py b/vendor/pytz/zoneinfo/Europe/Stockholm.py new file mode 100644 index 00000000..f9abbe6a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Stockholm.py @@ -0,0 +1,256 @@ +'''tzinfo timezone information for Europe/Stockholm.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Stockholm(DstTzInfo): + '''Europe/Stockholm timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Stockholm' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,14,22,0,0), +d(1916,9,30,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Stockholm = Stockholm() + diff --git a/vendor/pytz/zoneinfo/Europe/Tallinn.py b/vendor/pytz/zoneinfo/Europe/Tallinn.py new file mode 100644 index 00000000..95e569ac --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Tallinn.py @@ -0,0 +1,268 @@ +'''tzinfo timezone information for Europe/Tallinn.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tallinn(DstTzInfo): + '''Europe/Tallinn timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Tallinn' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,1,31,22,21,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1919,6,30,23,0,0), +d(1921,4,30,22,21,0), +d(1940,8,5,22,0,0), +d(1941,9,14,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,21,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1991,3,31,0,0,0), +d(1991,9,29,0,0,0), +d(1992,3,29,0,0,0), +d(1992,9,27,0,0,0), +d(1993,3,28,0,0,0), +d(1993,9,26,0,0,0), +d(1994,3,27,0,0,0), +d(1994,9,25,0,0,0), +d(1995,3,26,0,0,0), +d(1995,9,24,0,0,0), +d(1996,3,31,0,0,0), +d(1996,10,27,0,0,0), +d(1997,3,30,0,0,0), +d(1997,10,26,0,0,0), +d(1998,3,29,0,0,0), +d(1998,9,21,21,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(1999,10,31,22,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5940,0,'TMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(5940,0,'TMT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Tallinn = Tallinn() + diff --git a/vendor/pytz/zoneinfo/Europe/Tirane.py b/vendor/pytz/zoneinfo/Europe/Tirane.py new file mode 100644 index 00000000..4dba9c25 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Tirane.py @@ -0,0 +1,286 @@ +'''tzinfo timezone information for Europe/Tirane.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tirane(DstTzInfo): + '''Europe/Tirane timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Tirane' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1913,12,31,22,40,40), +d(1940,6,15,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,4,10,1,0,0), +d(1974,5,3,23,0,0), +d(1974,10,1,22,0,0), +d(1975,4,30,23,0,0), +d(1975,10,1,22,0,0), +d(1976,5,1,23,0,0), +d(1976,10,2,22,0,0), +d(1977,5,7,23,0,0), +d(1977,10,1,22,0,0), +d(1978,5,5,23,0,0), +d(1978,9,30,22,0,0), +d(1979,5,4,23,0,0), +d(1979,9,29,22,0,0), +d(1980,5,2,23,0,0), +d(1980,10,3,22,0,0), +d(1981,4,25,23,0,0), +d(1981,9,26,22,0,0), +d(1982,5,1,23,0,0), +d(1982,10,2,22,0,0), +d(1983,4,17,23,0,0), +d(1983,9,30,22,0,0), +d(1984,3,31,23,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(4740,0,'LMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Tirane = Tirane() + diff --git a/vendor/pytz/zoneinfo/Europe/Tiraspol.py b/vendor/pytz/zoneinfo/Europe/Tiraspol.py new file mode 100644 index 00000000..7663b8c2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Tiraspol.py @@ -0,0 +1,300 @@ +'''tzinfo timezone information for Europe/Tiraspol.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tiraspol(DstTzInfo): + '''Europe/Tiraspol timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Tiraspol' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,2,14,22,5,0), +d(1931,7,23,22,15,36), +d(1932,5,20,22,0,0), +d(1932,10,1,22,0,0), +d(1933,4,1,22,0,0), +d(1933,9,30,22,0,0), +d(1934,4,7,22,0,0), +d(1934,10,6,22,0,0), +d(1935,4,6,22,0,0), +d(1935,10,5,22,0,0), +d(1936,4,4,22,0,0), +d(1936,10,3,22,0,0), +d(1937,4,3,22,0,0), +d(1937,10,2,22,0,0), +d(1938,4,2,22,0,0), +d(1938,10,1,22,0,0), +d(1939,4,1,22,0,0), +d(1939,9,30,22,0,0), +d(1940,8,14,22,0,0), +d(1941,7,16,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,8,23,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1990,5,5,21,0,0), +d(1991,3,31,0,0,0), +d(1991,9,29,0,0,0), +d(1991,12,31,22,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,25,22,0,0), +d(1995,9,23,21,0,0), +d(1996,3,30,22,0,0), +d(1996,10,26,21,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(6900,0,'CMT'), +i(6240,0,'BMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Tiraspol = Tiraspol() + diff --git a/vendor/pytz/zoneinfo/Europe/Uzhgorod.py b/vendor/pytz/zoneinfo/Europe/Uzhgorod.py new file mode 100644 index 00000000..9da017f6 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Uzhgorod.py @@ -0,0 +1,262 @@ +'''tzinfo timezone information for Europe/Uzhgorod.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Uzhgorod(DstTzInfo): + '''Europe/Uzhgorod timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Uzhgorod' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,30,22,0,0), +d(1944,10,25,22,0,0), +d(1945,6,28,23,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1989,12,31,21,0,0), +d(1990,6,30,23,0,0), +d(1991,3,31,2,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'MSK'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Uzhgorod = Uzhgorod() + diff --git a/vendor/pytz/zoneinfo/Europe/Vaduz.py b/vendor/pytz/zoneinfo/Europe/Vaduz.py new file mode 100644 index 00000000..c4af9b35 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Vaduz.py @@ -0,0 +1,248 @@ +'''tzinfo timezone information for Europe/Vaduz.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vaduz(DstTzInfo): + '''Europe/Vaduz timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Vaduz' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Vaduz = Vaduz() + diff --git a/vendor/pytz/zoneinfo/Europe/Vatican.py b/vendor/pytz/zoneinfo/Europe/Vatican.py new file mode 100644 index 00000000..1806de2a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Vatican.py @@ -0,0 +1,360 @@ +'''tzinfo timezone information for Europe/Vatican.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vatican(DstTzInfo): + '''Europe/Vatican timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Vatican' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,6,2,23,0,0), +d(1916,9,30,23,0,0), +d(1917,3,31,23,0,0), +d(1917,9,29,23,0,0), +d(1918,3,9,23,0,0), +d(1918,10,5,23,0,0), +d(1919,3,1,23,0,0), +d(1919,10,4,23,0,0), +d(1920,3,20,23,0,0), +d(1920,9,18,23,0,0), +d(1940,6,14,23,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,6,30,22,0,0), +d(1944,9,16,23,0,0), +d(1945,4,2,1,0,0), +d(1945,9,14,23,0,0), +d(1946,3,17,1,0,0), +d(1946,10,6,1,0,0), +d(1947,3,15,23,0,0), +d(1947,10,4,23,0,0), +d(1948,2,29,1,0,0), +d(1948,10,3,1,0,0), +d(1966,5,21,23,0,0), +d(1966,9,24,22,0,0), +d(1967,5,27,23,0,0), +d(1967,9,23,22,0,0), +d(1968,5,25,23,0,0), +d(1968,9,21,22,0,0), +d(1969,5,31,23,0,0), +d(1969,9,27,22,0,0), +d(1970,5,30,23,0,0), +d(1970,9,26,22,0,0), +d(1971,5,22,23,0,0), +d(1971,9,25,23,0,0), +d(1972,5,27,23,0,0), +d(1972,9,30,22,0,0), +d(1973,6,2,23,0,0), +d(1973,9,29,22,0,0), +d(1974,5,25,23,0,0), +d(1974,9,28,22,0,0), +d(1975,5,31,23,0,0), +d(1975,9,27,23,0,0), +d(1976,5,29,23,0,0), +d(1976,9,25,23,0,0), +d(1977,5,21,23,0,0), +d(1977,9,24,23,0,0), +d(1978,5,27,23,0,0), +d(1978,9,30,23,0,0), +d(1979,5,26,23,0,0), +d(1979,9,29,23,0,0), +d(1979,12,31,23,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Vatican = Vatican() + diff --git a/vendor/pytz/zoneinfo/Europe/Vienna.py b/vendor/pytz/zoneinfo/Europe/Vienna.py new file mode 100644 index 00000000..5933d9d9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Vienna.py @@ -0,0 +1,300 @@ +'''tzinfo timezone information for Europe/Vienna.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vienna(DstTzInfo): + '''Europe/Vienna timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Vienna' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1919,12,31,23,0,0), +d(1920,4,5,1,0,0), +d(1920,9,13,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,4,2,1,0,0), +d(1945,4,12,1,0,0), +d(1945,12,31,23,0,0), +d(1946,4,14,1,0,0), +d(1946,10,6,1,0,0), +d(1947,4,6,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1980,4,5,23,0,0), +d(1980,9,27,22,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Vienna = Vienna() + diff --git a/vendor/pytz/zoneinfo/Europe/Vilnius.py b/vendor/pytz/zoneinfo/Europe/Vilnius.py new file mode 100644 index 00000000..51e3f435 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Vilnius.py @@ -0,0 +1,262 @@ +'''tzinfo timezone information for Europe/Vilnius.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Vilnius(DstTzInfo): + '''Europe/Vilnius timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Vilnius' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,12,31,22,36,0), +d(1919,10,9,22,24,24), +d(1920,7,11,23,0,0), +d(1920,10,8,22,0,0), +d(1940,8,2,23,0,0), +d(1941,6,23,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,7,31,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1992,3,29,0,0,0), +d(1992,9,27,0,0,0), +d(1993,3,28,0,0,0), +d(1993,9,26,0,0,0), +d(1994,3,27,0,0,0), +d(1994,9,25,0,0,0), +d(1995,3,26,0,0,0), +d(1995,9,24,0,0,0), +d(1996,3,31,0,0,0), +d(1996,10,27,0,0,0), +d(1997,3,30,0,0,0), +d(1997,10,26,0,0,0), +d(1997,12,31,22,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2002,12,31,22,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5040,0,'WMT'), +i(5760,0,'KMT'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(7200,0,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Vilnius = Vilnius() + diff --git a/vendor/pytz/zoneinfo/Europe/Volgograd.py b/vendor/pytz/zoneinfo/Europe/Volgograd.py new file mode 100644 index 00000000..8204bdcf --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Volgograd.py @@ -0,0 +1,254 @@ +'''tzinfo timezone information for Europe/Volgograd.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Volgograd(DstTzInfo): + '''Europe/Volgograd timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Volgograd' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1920,1,2,21,2,20), +d(1925,4,5,21,0,0), +d(1930,6,20,21,0,0), +d(1961,11,10,20,0,0), +d(1981,3,31,20,0,0), +d(1981,9,30,19,0,0), +d(1982,3,31,20,0,0), +d(1982,9,30,19,0,0), +d(1983,3,31,20,0,0), +d(1983,9,30,19,0,0), +d(1984,3,31,20,0,0), +d(1984,9,29,22,0,0), +d(1985,3,30,22,0,0), +d(1985,9,28,22,0,0), +d(1986,3,29,22,0,0), +d(1986,9,27,22,0,0), +d(1987,3,28,22,0,0), +d(1987,9,26,22,0,0), +d(1988,3,26,22,0,0), +d(1988,9,24,22,0,0), +d(1989,3,25,22,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,19,0,0), +d(1993,3,27,23,0,0), +d(1993,9,25,23,0,0), +d(1994,3,26,23,0,0), +d(1994,9,24,23,0,0), +d(1995,3,25,23,0,0), +d(1995,9,23,23,0,0), +d(1996,3,30,23,0,0), +d(1996,10,26,23,0,0), +d(1997,3,29,23,0,0), +d(1997,10,25,23,0,0), +d(1998,3,28,23,0,0), +d(1998,10,24,23,0,0), +d(1999,3,27,23,0,0), +d(1999,10,30,23,0,0), +d(2000,3,25,23,0,0), +d(2000,10,28,23,0,0), +d(2001,3,24,23,0,0), +d(2001,10,27,23,0,0), +d(2002,3,30,23,0,0), +d(2002,10,26,23,0,0), +d(2003,3,29,23,0,0), +d(2003,10,25,23,0,0), +d(2004,3,27,23,0,0), +d(2004,10,30,23,0,0), +d(2005,3,26,23,0,0), +d(2005,10,29,23,0,0), +d(2006,3,25,23,0,0), +d(2006,10,28,23,0,0), +d(2007,3,24,23,0,0), +d(2007,10,27,23,0,0), +d(2008,3,29,23,0,0), +d(2008,10,25,23,0,0), +d(2009,3,28,23,0,0), +d(2009,10,24,23,0,0), +d(2010,3,27,23,0,0), +d(2010,10,30,23,0,0), +d(2011,3,26,23,0,0), +d(2011,10,29,23,0,0), +d(2012,3,24,23,0,0), +d(2012,10,27,23,0,0), +d(2013,3,30,23,0,0), +d(2013,10,26,23,0,0), +d(2014,3,29,23,0,0), +d(2014,10,25,23,0,0), +d(2015,3,28,23,0,0), +d(2015,10,24,23,0,0), +d(2016,3,26,23,0,0), +d(2016,10,29,23,0,0), +d(2017,3,25,23,0,0), +d(2017,10,28,23,0,0), +d(2018,3,24,23,0,0), +d(2018,10,27,23,0,0), +d(2019,3,30,23,0,0), +d(2019,10,26,23,0,0), +d(2020,3,28,23,0,0), +d(2020,10,24,23,0,0), +d(2021,3,27,23,0,0), +d(2021,10,30,23,0,0), +d(2022,3,26,23,0,0), +d(2022,10,29,23,0,0), +d(2023,3,25,23,0,0), +d(2023,10,28,23,0,0), +d(2024,3,30,23,0,0), +d(2024,10,26,23,0,0), +d(2025,3,29,23,0,0), +d(2025,10,25,23,0,0), +d(2026,3,28,23,0,0), +d(2026,10,24,23,0,0), +d(2027,3,27,23,0,0), +d(2027,10,30,23,0,0), +d(2028,3,25,23,0,0), +d(2028,10,28,23,0,0), +d(2029,3,24,23,0,0), +d(2029,10,27,23,0,0), +d(2030,3,30,23,0,0), +d(2030,10,26,23,0,0), +d(2031,3,29,23,0,0), +d(2031,10,25,23,0,0), +d(2032,3,27,23,0,0), +d(2032,10,30,23,0,0), +d(2033,3,26,23,0,0), +d(2033,10,29,23,0,0), +d(2034,3,25,23,0,0), +d(2034,10,28,23,0,0), +d(2035,3,24,23,0,0), +d(2035,10,27,23,0,0), +d(2036,3,29,23,0,0), +d(2036,10,25,23,0,0), +d(2037,3,28,23,0,0), +d(2037,10,24,23,0,0), + ] + + _transition_info = [ +i(10680,0,'LMT'), +i(10800,0,'TSAT'), +i(10800,0,'STAT'), +i(14400,0,'STAT'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(18000,3600,'VOLST'), +i(14400,0,'VOLT'), +i(14400,0,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,0,'VOLT'), +i(14400,0,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), +i(14400,3600,'VOLST'), +i(10800,0,'VOLT'), + ] + +Volgograd = Volgograd() + diff --git a/vendor/pytz/zoneinfo/Europe/Warsaw.py b/vendor/pytz/zoneinfo/Europe/Warsaw.py new file mode 100644 index 00000000..93f05b39 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Warsaw.py @@ -0,0 +1,354 @@ +'''tzinfo timezone information for Europe/Warsaw.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Warsaw(DstTzInfo): + '''Europe/Warsaw timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Warsaw' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,8,4,22,36,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1919,4,15,0,0,0), +d(1919,9,16,0,0,0), +d(1922,5,31,22,0,0), +d(1940,6,23,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,30,22,0,0), +d(1944,10,4,0,0,0), +d(1945,4,28,23,0,0), +d(1945,10,31,22,0,0), +d(1946,4,13,23,0,0), +d(1946,10,7,1,0,0), +d(1947,5,4,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,10,1,0,0), +d(1949,10,2,1,0,0), +d(1957,6,2,0,0,0), +d(1957,9,29,0,0,0), +d(1958,3,30,0,0,0), +d(1958,9,28,0,0,0), +d(1959,5,31,0,0,0), +d(1959,10,4,0,0,0), +d(1960,4,3,0,0,0), +d(1960,10,2,0,0,0), +d(1961,5,28,0,0,0), +d(1961,10,1,0,0,0), +d(1962,5,27,0,0,0), +d(1962,9,30,0,0,0), +d(1963,5,26,0,0,0), +d(1963,9,29,0,0,0), +d(1964,5,31,0,0,0), +d(1964,9,27,0,0,0), +d(1976,12,31,23,0,0), +d(1977,4,3,0,0,0), +d(1977,9,25,0,0,0), +d(1978,4,2,0,0,0), +d(1978,10,1,0,0,0), +d(1979,4,1,0,0,0), +d(1979,9,30,0,0,0), +d(1980,4,6,0,0,0), +d(1980,9,28,0,0,0), +d(1981,3,29,0,0,0), +d(1981,9,27,0,0,0), +d(1982,3,28,0,0,0), +d(1982,9,26,0,0,0), +d(1983,3,27,0,0,0), +d(1983,9,25,0,0,0), +d(1984,3,25,0,0,0), +d(1984,9,30,0,0,0), +d(1985,3,31,0,0,0), +d(1985,9,29,0,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1987,12,31,23,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5040,0,'WMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Warsaw = Warsaw() + diff --git a/vendor/pytz/zoneinfo/Europe/Zagreb.py b/vendor/pytz/zoneinfo/Europe/Zagreb.py new file mode 100644 index 00000000..18d5f3a5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Zagreb.py @@ -0,0 +1,258 @@ +'''tzinfo timezone information for Europe/Zagreb.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Zagreb(DstTzInfo): + '''Europe/Zagreb timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Zagreb' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1941,4,18,22,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1945,5,8,1,0,0), +d(1945,9,16,1,0,0), +d(1982,11,26,23,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Zagreb = Zagreb() + diff --git a/vendor/pytz/zoneinfo/Europe/Zaporozhye.py b/vendor/pytz/zoneinfo/Europe/Zaporozhye.py new file mode 100644 index 00000000..51d09179 --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Zaporozhye.py @@ -0,0 +1,262 @@ +'''tzinfo timezone information for Europe/Zaporozhye.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Zaporozhye(DstTzInfo): + '''Europe/Zaporozhye timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Zaporozhye' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1924,5,1,21,40,0), +d(1930,6,20,22,0,0), +d(1941,8,24,21,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1943,10,24,23,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,28,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,26,21,0,0), +d(1993,3,27,22,0,0), +d(1993,9,25,21,0,0), +d(1994,3,26,22,0,0), +d(1994,9,24,21,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(8400,0,'CUT'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(7200,-3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Zaporozhye = Zaporozhye() + diff --git a/vendor/pytz/zoneinfo/Europe/Zurich.py b/vendor/pytz/zoneinfo/Europe/Zurich.py new file mode 100644 index 00000000..62ee715a --- /dev/null +++ b/vendor/pytz/zoneinfo/Europe/Zurich.py @@ -0,0 +1,260 @@ +'''tzinfo timezone information for Europe/Zurich.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Zurich(DstTzInfo): + '''Europe/Zurich timezone definition. See datetime.tzinfo for details''' + + zone = 'Europe/Zurich' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,11,1,23,0,0), +d(1940,12,30,22,0,0), +d(1941,5,4,1,0,0), +d(1941,10,4,22,0,0), +d(1942,5,3,1,0,0), +d(1942,10,3,22,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Zurich = Zurich() + diff --git a/vendor/pytz/zoneinfo/Europe/__init__.py b/vendor/pytz/zoneinfo/Europe/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/GB.py b/vendor/pytz/zoneinfo/GB.py new file mode 100644 index 00000000..559ae59d --- /dev/null +++ b/vendor/pytz/zoneinfo/GB.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for GB.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class GB(DstTzInfo): + '''GB timezone definition. See datetime.tzinfo for details''' + + zone = 'GB' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +GB = GB() + diff --git a/vendor/pytz/zoneinfo/GB_minus_Eire.py b/vendor/pytz/zoneinfo/GB_minus_Eire.py new file mode 100644 index 00000000..629bd90f --- /dev/null +++ b/vendor/pytz/zoneinfo/GB_minus_Eire.py @@ -0,0 +1,504 @@ +'''tzinfo timezone information for GB_minus_Eire.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class GB_minus_Eire(DstTzInfo): + '''GB_minus_Eire timezone definition. See datetime.tzinfo for details''' + + zone = 'GB_minus_Eire' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,5,21,2,0,0), +d(1916,10,1,2,0,0), +d(1917,4,8,2,0,0), +d(1917,9,17,2,0,0), +d(1918,3,24,2,0,0), +d(1918,9,30,2,0,0), +d(1919,3,30,2,0,0), +d(1919,9,29,2,0,0), +d(1920,3,28,2,0,0), +d(1920,10,25,2,0,0), +d(1921,4,3,2,0,0), +d(1921,10,3,2,0,0), +d(1922,3,26,2,0,0), +d(1922,10,8,2,0,0), +d(1923,4,22,2,0,0), +d(1923,9,16,2,0,0), +d(1924,4,13,2,0,0), +d(1924,9,21,2,0,0), +d(1925,4,19,2,0,0), +d(1925,10,4,2,0,0), +d(1926,4,18,2,0,0), +d(1926,10,3,2,0,0), +d(1927,4,10,2,0,0), +d(1927,10,2,2,0,0), +d(1928,4,22,2,0,0), +d(1928,10,7,2,0,0), +d(1929,4,21,2,0,0), +d(1929,10,6,2,0,0), +d(1930,4,13,2,0,0), +d(1930,10,5,2,0,0), +d(1931,4,19,2,0,0), +d(1931,10,4,2,0,0), +d(1932,4,17,2,0,0), +d(1932,10,2,2,0,0), +d(1933,4,9,2,0,0), +d(1933,10,8,2,0,0), +d(1934,4,22,2,0,0), +d(1934,10,7,2,0,0), +d(1935,4,14,2,0,0), +d(1935,10,6,2,0,0), +d(1936,4,19,2,0,0), +d(1936,10,4,2,0,0), +d(1937,4,18,2,0,0), +d(1937,10,3,2,0,0), +d(1938,4,10,2,0,0), +d(1938,10,2,2,0,0), +d(1939,4,16,2,0,0), +d(1939,11,19,2,0,0), +d(1940,2,25,2,0,0), +d(1941,5,4,1,0,0), +d(1941,8,10,1,0,0), +d(1942,4,5,1,0,0), +d(1942,8,9,1,0,0), +d(1943,4,4,1,0,0), +d(1943,8,15,1,0,0), +d(1944,4,2,1,0,0), +d(1944,9,17,1,0,0), +d(1945,4,2,1,0,0), +d(1945,7,15,1,0,0), +d(1945,10,7,2,0,0), +d(1946,4,14,2,0,0), +d(1946,10,6,2,0,0), +d(1947,3,16,2,0,0), +d(1947,4,13,1,0,0), +d(1947,8,10,1,0,0), +d(1947,11,2,2,0,0), +d(1948,3,14,2,0,0), +d(1948,10,31,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,16,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,15,2,0,0), +d(1951,10,21,2,0,0), +d(1952,4,20,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,19,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,11,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,17,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,22,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,14,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,20,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,19,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,10,2,0,0), +d(1960,10,2,2,0,0), +d(1961,3,26,2,0,0), +d(1961,10,29,2,0,0), +d(1962,3,25,2,0,0), +d(1962,10,28,2,0,0), +d(1963,3,31,2,0,0), +d(1963,10,27,2,0,0), +d(1964,3,22,2,0,0), +d(1964,10,25,2,0,0), +d(1965,3,21,2,0,0), +d(1965,10,24,2,0,0), +d(1966,3,20,2,0,0), +d(1966,10,23,2,0,0), +d(1967,3,19,2,0,0), +d(1967,10,29,2,0,0), +d(1968,2,18,2,0,0), +d(1968,10,26,23,0,0), +d(1971,10,31,2,0,0), +d(1972,3,19,2,0,0), +d(1972,10,29,2,0,0), +d(1973,3,18,2,0,0), +d(1973,10,28,2,0,0), +d(1974,3,17,2,0,0), +d(1974,10,27,2,0,0), +d(1975,3,16,2,0,0), +d(1975,10,26,2,0,0), +d(1976,3,21,2,0,0), +d(1976,10,24,2,0,0), +d(1977,3,20,2,0,0), +d(1977,10,23,2,0,0), +d(1978,3,19,2,0,0), +d(1978,10,29,2,0,0), +d(1979,3,18,2,0,0), +d(1979,10,28,2,0,0), +d(1980,3,16,2,0,0), +d(1980,10,26,2,0,0), +d(1981,3,29,1,0,0), +d(1981,10,25,1,0,0), +d(1982,3,28,1,0,0), +d(1982,10,24,1,0,0), +d(1983,3,27,1,0,0), +d(1983,10,23,1,0,0), +d(1984,3,25,1,0,0), +d(1984,10,28,1,0,0), +d(1985,3,31,1,0,0), +d(1985,10,27,1,0,0), +d(1986,3,30,1,0,0), +d(1986,10,26,1,0,0), +d(1987,3,29,1,0,0), +d(1987,10,25,1,0,0), +d(1988,3,27,1,0,0), +d(1988,10,23,1,0,0), +d(1989,3,26,1,0,0), +d(1989,10,29,1,0,0), +d(1990,3,25,1,0,0), +d(1990,10,28,1,0,0), +d(1991,3,31,1,0,0), +d(1991,10,27,1,0,0), +d(1992,3,29,1,0,0), +d(1992,10,25,1,0,0), +d(1993,3,28,1,0,0), +d(1993,10,24,1,0,0), +d(1994,3,27,1,0,0), +d(1994,10,23,1,0,0), +d(1995,3,26,1,0,0), +d(1995,10,22,1,0,0), +d(1996,1,1,0,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(7200,7200,'BDST'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(3600,0,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), +i(3600,3600,'BST'), +i(0,0,'GMT'), + ] + +GB_minus_Eire = GB_minus_Eire() + diff --git a/vendor/pytz/zoneinfo/GMT.py b/vendor/pytz/zoneinfo/GMT.py new file mode 100644 index 00000000..d9252ca0 --- /dev/null +++ b/vendor/pytz/zoneinfo/GMT.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for GMT.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT(StaticTzInfo): + '''GMT timezone definition. See datetime.tzinfo for details''' + zone = 'GMT' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT = GMT() + diff --git a/vendor/pytz/zoneinfo/GMT0.py b/vendor/pytz/zoneinfo/GMT0.py new file mode 100644 index 00000000..c67b1550 --- /dev/null +++ b/vendor/pytz/zoneinfo/GMT0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for GMT0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT0(StaticTzInfo): + '''GMT0 timezone definition. See datetime.tzinfo for details''' + zone = 'GMT0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT0 = GMT0() + diff --git a/vendor/pytz/zoneinfo/GMT_minus_0.py b/vendor/pytz/zoneinfo/GMT_minus_0.py new file mode 100644 index 00000000..1504d569 --- /dev/null +++ b/vendor/pytz/zoneinfo/GMT_minus_0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for GMT_minus_0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_minus_0(StaticTzInfo): + '''GMT_minus_0 timezone definition. See datetime.tzinfo for details''' + zone = 'GMT_minus_0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT_minus_0 = GMT_minus_0() + diff --git a/vendor/pytz/zoneinfo/GMT_plus_0.py b/vendor/pytz/zoneinfo/GMT_plus_0.py new file mode 100644 index 00000000..543f8566 --- /dev/null +++ b/vendor/pytz/zoneinfo/GMT_plus_0.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for GMT_plus_0.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class GMT_plus_0(StaticTzInfo): + '''GMT_plus_0 timezone definition. See datetime.tzinfo for details''' + zone = 'GMT_plus_0' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +GMT_plus_0 = GMT_plus_0() + diff --git a/vendor/pytz/zoneinfo/Greenwich.py b/vendor/pytz/zoneinfo/Greenwich.py new file mode 100644 index 00000000..46174f74 --- /dev/null +++ b/vendor/pytz/zoneinfo/Greenwich.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Greenwich.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Greenwich(StaticTzInfo): + '''Greenwich timezone definition. See datetime.tzinfo for details''' + zone = 'Greenwich' + _utcoffset = timedelta(seconds=0) + _tzname = 'GMT' + +Greenwich = Greenwich() + diff --git a/vendor/pytz/zoneinfo/HST.py b/vendor/pytz/zoneinfo/HST.py new file mode 100644 index 00000000..ee3d5d23 --- /dev/null +++ b/vendor/pytz/zoneinfo/HST.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for HST.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class HST(StaticTzInfo): + '''HST timezone definition. See datetime.tzinfo for details''' + zone = 'HST' + _utcoffset = timedelta(seconds=-36000) + _tzname = 'HST' + +HST = HST() + diff --git a/vendor/pytz/zoneinfo/Hongkong.py b/vendor/pytz/zoneinfo/Hongkong.py new file mode 100644 index 00000000..a9aa0c40 --- /dev/null +++ b/vendor/pytz/zoneinfo/Hongkong.py @@ -0,0 +1,158 @@ +'''tzinfo timezone information for Hongkong.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hongkong(DstTzInfo): + '''Hongkong timezone definition. See datetime.tzinfo for details''' + + zone = 'Hongkong' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,10,29,16,23,24), +d(1946,4,19,19,30,0), +d(1946,11,30,18,30,0), +d(1947,4,12,19,30,0), +d(1947,12,29,18,30,0), +d(1948,5,1,19,30,0), +d(1948,10,30,18,30,0), +d(1949,4,2,19,30,0), +d(1949,10,29,18,30,0), +d(1950,4,1,19,30,0), +d(1950,10,28,18,30,0), +d(1951,3,31,19,30,0), +d(1951,10,27,18,30,0), +d(1952,4,5,19,30,0), +d(1952,10,25,18,30,0), +d(1953,4,4,19,30,0), +d(1953,10,31,18,30,0), +d(1954,3,20,19,30,0), +d(1954,10,30,18,30,0), +d(1955,3,19,19,30,0), +d(1955,11,5,18,30,0), +d(1956,3,17,19,30,0), +d(1956,11,3,18,30,0), +d(1957,3,23,19,30,0), +d(1957,11,2,18,30,0), +d(1958,3,22,19,30,0), +d(1958,11,1,18,30,0), +d(1959,3,21,19,30,0), +d(1959,10,31,18,30,0), +d(1960,3,19,19,30,0), +d(1960,11,5,18,30,0), +d(1961,3,18,19,30,0), +d(1961,11,4,18,30,0), +d(1962,3,17,19,30,0), +d(1962,11,3,18,30,0), +d(1963,3,23,19,30,0), +d(1963,11,2,18,30,0), +d(1964,3,21,19,30,0), +d(1964,10,31,18,30,0), +d(1965,4,17,19,30,0), +d(1965,10,16,18,30,0), +d(1966,4,16,19,30,0), +d(1966,10,15,18,30,0), +d(1967,4,15,19,30,0), +d(1967,10,21,18,30,0), +d(1968,4,20,19,30,0), +d(1968,10,19,18,30,0), +d(1969,4,19,19,30,0), +d(1969,10,18,18,30,0), +d(1970,4,18,19,30,0), +d(1970,10,17,18,30,0), +d(1971,4,17,19,30,0), +d(1971,10,16,18,30,0), +d(1972,4,15,19,30,0), +d(1972,10,21,18,30,0), +d(1973,4,21,19,30,0), +d(1973,10,20,18,30,0), +d(1974,4,20,19,30,0), +d(1974,10,19,18,30,0), +d(1975,4,19,19,30,0), +d(1975,10,18,18,30,0), +d(1976,4,17,19,30,0), +d(1976,10,16,18,30,0), +d(1977,4,16,19,30,0), +d(1977,10,15,18,30,0), +d(1979,5,12,19,30,0), +d(1979,10,20,18,30,0), +d(1980,5,10,19,30,0), +d(1980,10,18,18,30,0), + ] + + _transition_info = [ +i(27420,0,'LMT'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), +i(32400,3600,'HKST'), +i(28800,0,'HKT'), + ] + +Hongkong = Hongkong() + diff --git a/vendor/pytz/zoneinfo/Iceland.py b/vendor/pytz/zoneinfo/Iceland.py new file mode 100644 index 00000000..e62b5968 --- /dev/null +++ b/vendor/pytz/zoneinfo/Iceland.py @@ -0,0 +1,148 @@ +'''tzinfo timezone information for Iceland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Iceland(DstTzInfo): + '''Iceland timezone definition. See datetime.tzinfo for details''' + + zone = 'Iceland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1908,1,1,1,27,48), +d(1917,2,20,0,0,0), +d(1917,10,21,1,0,0), +d(1918,2,20,0,0,0), +d(1918,11,16,1,0,0), +d(1939,4,30,0,0,0), +d(1939,11,29,2,0,0), +d(1940,2,25,3,0,0), +d(1940,11,3,2,0,0), +d(1941,3,2,2,0,0), +d(1941,11,2,2,0,0), +d(1942,3,8,2,0,0), +d(1942,10,25,2,0,0), +d(1943,3,7,2,0,0), +d(1943,10,24,2,0,0), +d(1944,3,5,2,0,0), +d(1944,10,22,2,0,0), +d(1945,3,4,2,0,0), +d(1945,10,28,2,0,0), +d(1946,3,3,2,0,0), +d(1946,10,27,2,0,0), +d(1947,4,6,2,0,0), +d(1947,10,26,2,0,0), +d(1948,4,4,2,0,0), +d(1948,10,24,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,30,2,0,0), +d(1950,4,2,2,0,0), +d(1950,10,22,2,0,0), +d(1951,4,1,2,0,0), +d(1951,10,28,2,0,0), +d(1952,4,6,2,0,0), +d(1952,10,26,2,0,0), +d(1953,4,5,2,0,0), +d(1953,10,25,2,0,0), +d(1954,4,4,2,0,0), +d(1954,10,24,2,0,0), +d(1955,4,3,2,0,0), +d(1955,10,23,2,0,0), +d(1956,4,1,2,0,0), +d(1956,10,28,2,0,0), +d(1957,4,7,2,0,0), +d(1957,10,27,2,0,0), +d(1958,4,6,2,0,0), +d(1958,10,26,2,0,0), +d(1959,4,5,2,0,0), +d(1959,10,25,2,0,0), +d(1960,4,3,2,0,0), +d(1960,10,23,2,0,0), +d(1961,4,2,2,0,0), +d(1961,10,22,2,0,0), +d(1962,4,1,2,0,0), +d(1962,10,28,2,0,0), +d(1963,4,7,2,0,0), +d(1963,10,27,2,0,0), +d(1964,4,5,2,0,0), +d(1964,10,25,2,0,0), +d(1965,4,4,2,0,0), +d(1965,10,24,2,0,0), +d(1966,4,3,2,0,0), +d(1966,10,23,2,0,0), +d(1967,4,2,2,0,0), +d(1967,10,29,2,0,0), +d(1968,4,7,2,0,0), + ] + + _transition_info = [ +i(-5280,0,'RMT'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,3600,'ISST'), +i(-3600,0,'IST'), +i(0,0,'GMT'), + ] + +Iceland = Iceland() + diff --git a/vendor/pytz/zoneinfo/Indian/Antananarivo.py b/vendor/pytz/zoneinfo/Indian/Antananarivo.py new file mode 100644 index 00000000..05663b9d --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Antananarivo.py @@ -0,0 +1,26 @@ +'''tzinfo timezone information for Indian/Antananarivo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Antananarivo(DstTzInfo): + '''Indian/Antananarivo timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Antananarivo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,6,30,20,49,56), +d(1954,2,27,20,0,0), +d(1954,5,29,20,0,0), + ] + + _transition_info = [ +i(11400,0,'LMT'), +i(10800,0,'EAT'), +i(14400,3600,'EAST'), +i(10800,0,'EAT'), + ] + +Antananarivo = Antananarivo() + diff --git a/vendor/pytz/zoneinfo/Indian/Chagos.py b/vendor/pytz/zoneinfo/Indian/Chagos.py new file mode 100644 index 00000000..3ea97289 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Chagos.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Indian/Chagos.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chagos(DstTzInfo): + '''Indian/Chagos timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Chagos' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,12,31,19,10,20), +d(1995,12,31,19,0,0), + ] + + _transition_info = [ +i(17400,0,'LMT'), +i(18000,0,'IOT'), +i(21600,0,'IOT'), + ] + +Chagos = Chagos() + diff --git a/vendor/pytz/zoneinfo/Indian/Christmas.py b/vendor/pytz/zoneinfo/Indian/Christmas.py new file mode 100644 index 00000000..a6a2e0b9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Christmas.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Indian/Christmas.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Christmas(StaticTzInfo): + '''Indian/Christmas timezone definition. See datetime.tzinfo for details''' + zone = 'Indian/Christmas' + _utcoffset = timedelta(seconds=25200) + _tzname = 'CXT' + +Christmas = Christmas() + diff --git a/vendor/pytz/zoneinfo/Indian/Cocos.py b/vendor/pytz/zoneinfo/Indian/Cocos.py new file mode 100644 index 00000000..5ffe4706 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Cocos.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Indian/Cocos.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Cocos(StaticTzInfo): + '''Indian/Cocos timezone definition. See datetime.tzinfo for details''' + zone = 'Indian/Cocos' + _utcoffset = timedelta(seconds=23400) + _tzname = 'CCT' + +Cocos = Cocos() + diff --git a/vendor/pytz/zoneinfo/Indian/Comoro.py b/vendor/pytz/zoneinfo/Indian/Comoro.py new file mode 100644 index 00000000..98c6948f --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Comoro.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Comoro.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Comoro(DstTzInfo): + '''Indian/Comoro timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Comoro' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,6,30,21,6,56), + ] + + _transition_info = [ +i(10380,0,'LMT'), +i(10800,0,'EAT'), + ] + +Comoro = Comoro() + diff --git a/vendor/pytz/zoneinfo/Indian/Kerguelen.py b/vendor/pytz/zoneinfo/Indian/Kerguelen.py new file mode 100644 index 00000000..edc6ab21 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Kerguelen.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Kerguelen.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kerguelen(DstTzInfo): + '''Indian/Kerguelen timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Kerguelen' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1950,1,1,0,0,0), + ] + + _transition_info = [ +i(0,0,'zzz'), +i(18000,0,'TFT'), + ] + +Kerguelen = Kerguelen() + diff --git a/vendor/pytz/zoneinfo/Indian/Mahe.py b/vendor/pytz/zoneinfo/Indian/Mahe.py new file mode 100644 index 00000000..0bd7ee36 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Mahe.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Mahe.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mahe(DstTzInfo): + '''Indian/Mahe timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Mahe' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,5,31,20,18,12), + ] + + _transition_info = [ +i(13320,0,'LMT'), +i(14400,0,'SCT'), + ] + +Mahe = Mahe() + diff --git a/vendor/pytz/zoneinfo/Indian/Maldives.py b/vendor/pytz/zoneinfo/Indian/Maldives.py new file mode 100644 index 00000000..3f84d43d --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Maldives.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Maldives.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Maldives(DstTzInfo): + '''Indian/Maldives timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Maldives' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1959,12,31,19,6,0), + ] + + _transition_info = [ +i(17640,0,'MMT'), +i(18000,0,'MVT'), + ] + +Maldives = Maldives() + diff --git a/vendor/pytz/zoneinfo/Indian/Mauritius.py b/vendor/pytz/zoneinfo/Indian/Mauritius.py new file mode 100644 index 00000000..0e170a6a --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Mauritius.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Mauritius.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mauritius(DstTzInfo): + '''Indian/Mauritius timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Mauritius' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1906,12,31,20,10,0), + ] + + _transition_info = [ +i(13800,0,'LMT'), +i(14400,0,'MUT'), + ] + +Mauritius = Mauritius() + diff --git a/vendor/pytz/zoneinfo/Indian/Mayotte.py b/vendor/pytz/zoneinfo/Indian/Mayotte.py new file mode 100644 index 00000000..20df3bb2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Mayotte.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Mayotte.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mayotte(DstTzInfo): + '''Indian/Mayotte timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Mayotte' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,6,30,20,59,4), + ] + + _transition_info = [ +i(10860,0,'LMT'), +i(10800,0,'EAT'), + ] + +Mayotte = Mayotte() + diff --git a/vendor/pytz/zoneinfo/Indian/Reunion.py b/vendor/pytz/zoneinfo/Indian/Reunion.py new file mode 100644 index 00000000..11fb08f8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Indian/Reunion.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Indian/Reunion.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Reunion(DstTzInfo): + '''Indian/Reunion timezone definition. See datetime.tzinfo for details''' + + zone = 'Indian/Reunion' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,5,31,20,18,8), + ] + + _transition_info = [ +i(13320,0,'LMT'), +i(14400,0,'RET'), + ] + +Reunion = Reunion() + diff --git a/vendor/pytz/zoneinfo/Indian/__init__.py b/vendor/pytz/zoneinfo/Indian/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Iran.py b/vendor/pytz/zoneinfo/Iran.py new file mode 100644 index 00000000..3ea0482c --- /dev/null +++ b/vendor/pytz/zoneinfo/Iran.py @@ -0,0 +1,100 @@ +'''tzinfo timezone information for Iran.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Iran(DstTzInfo): + '''Iran timezone definition. See datetime.tzinfo for details''' + + zone = 'Iran' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,12,31,20,34,16), +d(1945,12,31,20,34,16), +d(1977,10,31,20,30,0), +d(1978,3,20,20,0,0), +d(1978,10,20,19,0,0), +d(1978,12,31,20,0,0), +d(1979,3,20,20,30,0), +d(1979,9,18,19,30,0), +d(1980,3,20,20,30,0), +d(1980,9,22,19,30,0), +d(1991,5,2,20,30,0), +d(1991,9,21,19,30,0), +d(1992,3,21,20,30,0), +d(1992,9,21,19,30,0), +d(1993,3,21,20,30,0), +d(1993,9,21,19,30,0), +d(1994,3,21,20,30,0), +d(1994,9,21,19,30,0), +d(1995,3,21,20,30,0), +d(1995,9,21,19,30,0), +d(1996,3,20,20,30,0), +d(1996,9,20,19,30,0), +d(1997,3,21,20,30,0), +d(1997,9,21,19,30,0), +d(1998,3,21,20,30,0), +d(1998,9,21,19,30,0), +d(1999,3,21,20,30,0), +d(1999,9,21,19,30,0), +d(2000,3,20,20,30,0), +d(2000,9,20,19,30,0), +d(2001,3,21,20,30,0), +d(2001,9,21,19,30,0), +d(2002,3,21,20,30,0), +d(2002,9,21,19,30,0), +d(2003,3,21,20,30,0), +d(2003,9,21,19,30,0), +d(2004,3,20,20,30,0), +d(2004,9,20,19,30,0), +d(2005,3,21,20,30,0), +d(2005,9,21,19,30,0), + ] + + _transition_info = [ +i(12360,0,'LMT'), +i(12360,0,'TMT'), +i(12600,0,'IRST'), +i(14400,0,'IRST'), +i(18000,3600,'IRDT'), +i(14400,0,'IRST'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), +i(16200,3600,'IRDT'), +i(12600,0,'IRST'), + ] + +Iran = Iran() + diff --git a/vendor/pytz/zoneinfo/Israel.py b/vendor/pytz/zoneinfo/Israel.py new file mode 100644 index 00000000..14b0bbbb --- /dev/null +++ b/vendor/pytz/zoneinfo/Israel.py @@ -0,0 +1,304 @@ +'''tzinfo timezone information for Israel.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Israel(DstTzInfo): + '''Israel timezone definition. See datetime.tzinfo for details''' + + zone = 'Israel' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1917,12,31,21,39,20), +d(1940,5,31,22,0,0), +d(1942,10,31,21,0,0), +d(1943,4,1,0,0,0), +d(1943,10,31,21,0,0), +d(1944,3,31,22,0,0), +d(1944,10,31,21,0,0), +d(1945,4,15,22,0,0), +d(1945,10,31,23,0,0), +d(1946,4,16,0,0,0), +d(1946,10,31,21,0,0), +d(1948,5,22,22,0,0), +d(1948,8,31,20,0,0), +d(1948,10,31,23,0,0), +d(1949,4,30,22,0,0), +d(1949,10,31,23,0,0), +d(1950,4,15,22,0,0), +d(1950,9,15,0,0,0), +d(1951,3,31,22,0,0), +d(1951,11,11,0,0,0), +d(1952,4,20,0,0,0), +d(1952,10,19,0,0,0), +d(1953,4,12,0,0,0), +d(1953,9,13,0,0,0), +d(1954,6,12,22,0,0), +d(1954,9,11,21,0,0), +d(1955,6,11,0,0,0), +d(1955,9,10,21,0,0), +d(1956,6,2,22,0,0), +d(1956,9,30,0,0,0), +d(1957,4,29,0,0,0), +d(1957,9,21,21,0,0), +d(1974,7,6,22,0,0), +d(1974,10,12,21,0,0), +d(1975,4,19,22,0,0), +d(1975,8,30,21,0,0), +d(1985,4,13,22,0,0), +d(1985,9,14,21,0,0), +d(1986,5,17,22,0,0), +d(1986,9,6,21,0,0), +d(1987,4,14,22,0,0), +d(1987,9,12,21,0,0), +d(1988,4,8,22,0,0), +d(1988,9,2,21,0,0), +d(1989,4,29,22,0,0), +d(1989,9,2,21,0,0), +d(1990,3,24,22,0,0), +d(1990,8,25,21,0,0), +d(1991,3,23,22,0,0), +d(1991,8,31,21,0,0), +d(1992,3,28,22,0,0), +d(1992,9,5,21,0,0), +d(1993,4,1,22,0,0), +d(1993,9,4,21,0,0), +d(1994,3,31,22,0,0), +d(1994,8,27,21,0,0), +d(1995,3,30,22,0,0), +d(1995,9,2,21,0,0), +d(1996,3,14,22,0,0), +d(1996,9,15,21,0,0), +d(1997,3,20,22,0,0), +d(1997,9,13,21,0,0), +d(1998,3,19,22,0,0), +d(1998,9,5,21,0,0), +d(1999,4,2,0,0,0), +d(1999,9,2,23,0,0), +d(2000,4,14,0,0,0), +d(2000,10,5,22,0,0), +d(2001,4,8,23,0,0), +d(2001,9,23,22,0,0), +d(2002,3,28,23,0,0), +d(2002,10,6,22,0,0), +d(2003,3,27,23,0,0), +d(2003,10,2,22,0,0), +d(2004,4,6,23,0,0), +d(2004,9,21,22,0,0), +d(2005,4,1,0,0,0), +d(2005,10,8,23,0,0), +d(2006,3,31,0,0,0), +d(2006,9,30,23,0,0), +d(2007,3,30,0,0,0), +d(2007,9,15,23,0,0), +d(2008,3,28,0,0,0), +d(2008,10,4,23,0,0), +d(2009,3,27,0,0,0), +d(2009,9,26,23,0,0), +d(2010,3,26,0,0,0), +d(2010,9,11,23,0,0), +d(2011,4,1,0,0,0), +d(2011,10,1,23,0,0), +d(2012,3,30,0,0,0), +d(2012,9,22,23,0,0), +d(2013,3,29,0,0,0), +d(2013,9,7,23,0,0), +d(2014,3,28,0,0,0), +d(2014,9,27,23,0,0), +d(2015,3,27,0,0,0), +d(2015,9,19,23,0,0), +d(2016,4,1,0,0,0), +d(2016,10,8,23,0,0), +d(2017,3,31,0,0,0), +d(2017,9,23,23,0,0), +d(2018,3,30,0,0,0), +d(2018,9,15,23,0,0), +d(2019,3,29,0,0,0), +d(2019,10,5,23,0,0), +d(2020,3,27,0,0,0), +d(2020,9,26,23,0,0), +d(2021,3,26,0,0,0), +d(2021,9,11,23,0,0), +d(2022,4,1,0,0,0), +d(2022,10,1,23,0,0), +d(2023,3,31,0,0,0), +d(2023,9,23,23,0,0), +d(2024,3,29,0,0,0), +d(2024,10,5,23,0,0), +d(2025,3,28,0,0,0), +d(2025,9,27,23,0,0), +d(2026,3,27,0,0,0), +d(2026,9,19,23,0,0), +d(2027,3,26,0,0,0), +d(2027,10,9,23,0,0), +d(2028,3,31,0,0,0), +d(2028,9,23,23,0,0), +d(2029,3,30,0,0,0), +d(2029,9,15,23,0,0), +d(2030,3,29,0,0,0), +d(2030,10,5,23,0,0), +d(2031,3,28,0,0,0), +d(2031,9,20,23,0,0), +d(2032,3,26,0,0,0), +d(2032,9,11,23,0,0), +d(2033,4,1,0,0,0), +d(2033,10,1,23,0,0), +d(2034,3,31,0,0,0), +d(2034,9,16,23,0,0), +d(2035,3,30,0,0,0), +d(2035,10,6,23,0,0), +d(2036,3,28,0,0,0), +d(2036,9,27,23,0,0), +d(2037,3,27,0,0,0), +d(2037,9,12,23,0,0), + ] + + _transition_info = [ +i(8460,0,'JMT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(14400,7200,'IDDT'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), +i(10800,3600,'IDT'), +i(7200,0,'IST'), + ] + +Israel = Israel() + diff --git a/vendor/pytz/zoneinfo/Jamaica.py b/vendor/pytz/zoneinfo/Jamaica.py new file mode 100644 index 00000000..f166a375 --- /dev/null +++ b/vendor/pytz/zoneinfo/Jamaica.py @@ -0,0 +1,62 @@ +'''tzinfo timezone information for Jamaica.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Jamaica(DstTzInfo): + '''Jamaica timezone definition. See datetime.tzinfo for details''' + + zone = 'Jamaica' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,2,1,5,7,12), +d(1974,4,28,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), + ] + + _transition_info = [ +i(-18420,0,'KMT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Jamaica = Jamaica() + diff --git a/vendor/pytz/zoneinfo/Japan.py b/vendor/pytz/zoneinfo/Japan.py new file mode 100644 index 00000000..e3030074 --- /dev/null +++ b/vendor/pytz/zoneinfo/Japan.py @@ -0,0 +1,38 @@ +'''tzinfo timezone information for Japan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Japan(DstTzInfo): + '''Japan timezone definition. See datetime.tzinfo for details''' + + zone = 'Japan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1937,12,31,15,0,0), +d(1948,5,1,17,0,0), +d(1948,9,10,16,0,0), +d(1949,4,2,17,0,0), +d(1949,9,9,16,0,0), +d(1950,5,6,17,0,0), +d(1950,9,8,16,0,0), +d(1951,5,5,17,0,0), +d(1951,9,7,16,0,0), + ] + + _transition_info = [ +i(32400,0,'CJT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), +i(36000,3600,'JDT'), +i(32400,0,'JST'), + ] + +Japan = Japan() + diff --git a/vendor/pytz/zoneinfo/Kwajalein.py b/vendor/pytz/zoneinfo/Kwajalein.py new file mode 100644 index 00000000..edab84d1 --- /dev/null +++ b/vendor/pytz/zoneinfo/Kwajalein.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Kwajalein.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kwajalein(DstTzInfo): + '''Kwajalein timezone definition. See datetime.tzinfo for details''' + + zone = 'Kwajalein' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,9,30,13,0,0), +d(1993,8,20,12,0,0), + ] + + _transition_info = [ +i(39600,0,'MHT'), +i(-43200,0,'KWAT'), +i(43200,0,'MHT'), + ] + +Kwajalein = Kwajalein() + diff --git a/vendor/pytz/zoneinfo/Libya.py b/vendor/pytz/zoneinfo/Libya.py new file mode 100644 index 00000000..3ab8dbca --- /dev/null +++ b/vendor/pytz/zoneinfo/Libya.py @@ -0,0 +1,78 @@ +'''tzinfo timezone information for Libya.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Libya(DstTzInfo): + '''Libya timezone definition. See datetime.tzinfo for details''' + + zone = 'Libya' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1919,12,31,23,7,16), +d(1951,10,14,1,0,0), +d(1951,12,31,22,0,0), +d(1953,10,9,1,0,0), +d(1953,12,31,22,0,0), +d(1955,9,29,23,0,0), +d(1955,12,31,22,0,0), +d(1958,12,31,23,0,0), +d(1981,12,31,22,0,0), +d(1982,3,31,23,0,0), +d(1982,9,30,22,0,0), +d(1983,3,31,23,0,0), +d(1983,9,30,22,0,0), +d(1984,3,31,23,0,0), +d(1984,9,30,22,0,0), +d(1985,4,5,23,0,0), +d(1985,9,30,22,0,0), +d(1986,4,3,23,0,0), +d(1986,10,2,22,0,0), +d(1987,3,31,23,0,0), +d(1987,9,30,22,0,0), +d(1988,3,31,23,0,0), +d(1988,9,30,22,0,0), +d(1989,3,31,23,0,0), +d(1989,9,30,22,0,0), +d(1990,5,3,23,0,0), +d(1996,9,29,22,0,0), +d(1997,4,3,23,0,0), +d(1997,10,3,22,0,0), + ] + + _transition_info = [ +i(3180,0,'LMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,0,'EET'), + ] + +Libya = Libya() + diff --git a/vendor/pytz/zoneinfo/MET.py b/vendor/pytz/zoneinfo/MET.py new file mode 100644 index 00000000..09009209 --- /dev/null +++ b/vendor/pytz/zoneinfo/MET.py @@ -0,0 +1,288 @@ +'''tzinfo timezone information for MET.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class MET(DstTzInfo): + '''MET timezone definition. See datetime.tzinfo for details''' + + zone = 'MET' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1940,4,1,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,10,2,1,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), +i(7200,3600,'MEST'), +i(3600,0,'MET'), + ] + +MET = MET() + diff --git a/vendor/pytz/zoneinfo/MST.py b/vendor/pytz/zoneinfo/MST.py new file mode 100644 index 00000000..6a9cc946 --- /dev/null +++ b/vendor/pytz/zoneinfo/MST.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for MST.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class MST(StaticTzInfo): + '''MST timezone definition. See datetime.tzinfo for details''' + zone = 'MST' + _utcoffset = timedelta(seconds=-25200) + _tzname = 'MST' + +MST = MST() + diff --git a/vendor/pytz/zoneinfo/MST7MDT.py b/vendor/pytz/zoneinfo/MST7MDT.py new file mode 100644 index 00000000..baad8bec --- /dev/null +++ b/vendor/pytz/zoneinfo/MST7MDT.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for MST7MDT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class MST7MDT(DstTzInfo): + '''MST7MDT timezone definition. See datetime.tzinfo for details''' + + zone = 'MST7MDT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +MST7MDT = MST7MDT() + diff --git a/vendor/pytz/zoneinfo/Mexico/BajaNorte.py b/vendor/pytz/zoneinfo/Mexico/BajaNorte.py new file mode 100644 index 00000000..75dfe706 --- /dev/null +++ b/vendor/pytz/zoneinfo/Mexico/BajaNorte.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for Mexico/BajaNorte.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class BajaNorte(DstTzInfo): + '''Mexico/BajaNorte timezone definition. See datetime.tzinfo for details''' + + zone = 'Mexico/BajaNorte' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,8,0,0), +d(1924,1,1,7,0,0), +d(1927,6,11,7,0,0), +d(1930,11,15,7,0,0), +d(1931,4,1,8,0,0), +d(1931,9,30,7,0,0), +d(1942,4,24,8,0,0), +d(1945,8,14,23,0,0), +d(1945,11,12,7,0,0), +d(1948,4,5,8,0,0), +d(1949,1,14,7,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,4,1,10,0,0), +d(2007,10,28,9,0,0), +d(2008,4,6,10,0,0), +d(2008,10,26,9,0,0), +d(2009,4,5,10,0,0), +d(2009,10,25,9,0,0), +d(2010,4,4,10,0,0), +d(2010,10,31,9,0,0), +d(2011,4,3,10,0,0), +d(2011,10,30,9,0,0), +d(2012,4,1,10,0,0), +d(2012,10,28,9,0,0), +d(2013,4,7,10,0,0), +d(2013,10,27,9,0,0), +d(2014,4,6,10,0,0), +d(2014,10,26,9,0,0), +d(2015,4,5,10,0,0), +d(2015,10,25,9,0,0), +d(2016,4,3,10,0,0), +d(2016,10,30,9,0,0), +d(2017,4,2,10,0,0), +d(2017,10,29,9,0,0), +d(2018,4,1,10,0,0), +d(2018,10,28,9,0,0), +d(2019,4,7,10,0,0), +d(2019,10,27,9,0,0), +d(2020,4,5,10,0,0), +d(2020,10,25,9,0,0), +d(2021,4,4,10,0,0), +d(2021,10,31,9,0,0), +d(2022,4,3,10,0,0), +d(2022,10,30,9,0,0), +d(2023,4,2,10,0,0), +d(2023,10,29,9,0,0), +d(2024,4,7,10,0,0), +d(2024,10,27,9,0,0), +d(2025,4,6,10,0,0), +d(2025,10,26,9,0,0), +d(2026,4,5,10,0,0), +d(2026,10,25,9,0,0), +d(2027,4,4,10,0,0), +d(2027,10,31,9,0,0), +d(2028,4,2,10,0,0), +d(2028,10,29,9,0,0), +d(2029,4,1,10,0,0), +d(2029,10,28,9,0,0), +d(2030,4,7,10,0,0), +d(2030,10,27,9,0,0), +d(2031,4,6,10,0,0), +d(2031,10,26,9,0,0), +d(2032,4,4,10,0,0), +d(2032,10,31,9,0,0), +d(2033,4,3,10,0,0), +d(2033,10,30,9,0,0), +d(2034,4,2,10,0,0), +d(2034,10,29,9,0,0), +d(2035,4,1,10,0,0), +d(2035,10,28,9,0,0), +d(2036,4,6,10,0,0), +d(2036,10,26,9,0,0), +d(2037,4,5,10,0,0), +d(2037,10,25,9,0,0), + ] + + _transition_info = [ +i(-28080,0,'LMT'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +BajaNorte = BajaNorte() + diff --git a/vendor/pytz/zoneinfo/Mexico/BajaSur.py b/vendor/pytz/zoneinfo/Mexico/BajaSur.py new file mode 100644 index 00000000..22da0533 --- /dev/null +++ b/vendor/pytz/zoneinfo/Mexico/BajaSur.py @@ -0,0 +1,206 @@ +'''tzinfo timezone information for Mexico/BajaSur.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class BajaSur(DstTzInfo): + '''Mexico/BajaSur timezone definition. See datetime.tzinfo for details''' + + zone = 'Mexico/BajaSur' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1942,4,24,6,0,0), +d(1949,1,14,7,0,0), +d(1970,1,1,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,5,6,9,0,0), +d(2001,9,30,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,4,1,9,0,0), +d(2007,10,28,8,0,0), +d(2008,4,6,9,0,0), +d(2008,10,26,8,0,0), +d(2009,4,5,9,0,0), +d(2009,10,25,8,0,0), +d(2010,4,4,9,0,0), +d(2010,10,31,8,0,0), +d(2011,4,3,9,0,0), +d(2011,10,30,8,0,0), +d(2012,4,1,9,0,0), +d(2012,10,28,8,0,0), +d(2013,4,7,9,0,0), +d(2013,10,27,8,0,0), +d(2014,4,6,9,0,0), +d(2014,10,26,8,0,0), +d(2015,4,5,9,0,0), +d(2015,10,25,8,0,0), +d(2016,4,3,9,0,0), +d(2016,10,30,8,0,0), +d(2017,4,2,9,0,0), +d(2017,10,29,8,0,0), +d(2018,4,1,9,0,0), +d(2018,10,28,8,0,0), +d(2019,4,7,9,0,0), +d(2019,10,27,8,0,0), +d(2020,4,5,9,0,0), +d(2020,10,25,8,0,0), +d(2021,4,4,9,0,0), +d(2021,10,31,8,0,0), +d(2022,4,3,9,0,0), +d(2022,10,30,8,0,0), +d(2023,4,2,9,0,0), +d(2023,10,29,8,0,0), +d(2024,4,7,9,0,0), +d(2024,10,27,8,0,0), +d(2025,4,6,9,0,0), +d(2025,10,26,8,0,0), +d(2026,4,5,9,0,0), +d(2026,10,25,8,0,0), +d(2027,4,4,9,0,0), +d(2027,10,31,8,0,0), +d(2028,4,2,9,0,0), +d(2028,10,29,8,0,0), +d(2029,4,1,9,0,0), +d(2029,10,28,8,0,0), +d(2030,4,7,9,0,0), +d(2030,10,27,8,0,0), +d(2031,4,6,9,0,0), +d(2031,10,26,8,0,0), +d(2032,4,4,9,0,0), +d(2032,10,31,8,0,0), +d(2033,4,3,9,0,0), +d(2033,10,30,8,0,0), +d(2034,4,2,9,0,0), +d(2034,10,29,8,0,0), +d(2035,4,1,9,0,0), +d(2035,10,28,8,0,0), +d(2036,4,6,9,0,0), +d(2036,10,26,8,0,0), +d(2037,4,5,9,0,0), +d(2037,10,25,8,0,0), + ] + + _transition_info = [ +i(-25560,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-28800,0,'PST'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +BajaSur = BajaSur() + diff --git a/vendor/pytz/zoneinfo/Mexico/General.py b/vendor/pytz/zoneinfo/Mexico/General.py new file mode 100644 index 00000000..9a224612 --- /dev/null +++ b/vendor/pytz/zoneinfo/Mexico/General.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for Mexico/General.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class General(DstTzInfo): + '''Mexico/General timezone definition. See datetime.tzinfo for details''' + + zone = 'Mexico/General' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1922,1,1,7,0,0), +d(1927,6,11,6,0,0), +d(1930,11,15,6,0,0), +d(1931,5,2,6,0,0), +d(1931,10,1,6,0,0), +d(1932,4,1,7,0,0), +d(1939,2,5,6,0,0), +d(1939,6,25,5,0,0), +d(1940,12,9,6,0,0), +d(1941,4,1,5,0,0), +d(1943,12,16,6,0,0), +d(1944,5,1,5,0,0), +d(1950,2,12,6,0,0), +d(1950,7,30,5,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,5,6,8,0,0), +d(2001,9,30,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,4,1,8,0,0), +d(2007,10,28,7,0,0), +d(2008,4,6,8,0,0), +d(2008,10,26,7,0,0), +d(2009,4,5,8,0,0), +d(2009,10,25,7,0,0), +d(2010,4,4,8,0,0), +d(2010,10,31,7,0,0), +d(2011,4,3,8,0,0), +d(2011,10,30,7,0,0), +d(2012,4,1,8,0,0), +d(2012,10,28,7,0,0), +d(2013,4,7,8,0,0), +d(2013,10,27,7,0,0), +d(2014,4,6,8,0,0), +d(2014,10,26,7,0,0), +d(2015,4,5,8,0,0), +d(2015,10,25,7,0,0), +d(2016,4,3,8,0,0), +d(2016,10,30,7,0,0), +d(2017,4,2,8,0,0), +d(2017,10,29,7,0,0), +d(2018,4,1,8,0,0), +d(2018,10,28,7,0,0), +d(2019,4,7,8,0,0), +d(2019,10,27,7,0,0), +d(2020,4,5,8,0,0), +d(2020,10,25,7,0,0), +d(2021,4,4,8,0,0), +d(2021,10,31,7,0,0), +d(2022,4,3,8,0,0), +d(2022,10,30,7,0,0), +d(2023,4,2,8,0,0), +d(2023,10,29,7,0,0), +d(2024,4,7,8,0,0), +d(2024,10,27,7,0,0), +d(2025,4,6,8,0,0), +d(2025,10,26,7,0,0), +d(2026,4,5,8,0,0), +d(2026,10,25,7,0,0), +d(2027,4,4,8,0,0), +d(2027,10,31,7,0,0), +d(2028,4,2,8,0,0), +d(2028,10,29,7,0,0), +d(2029,4,1,8,0,0), +d(2029,10,28,7,0,0), +d(2030,4,7,8,0,0), +d(2030,10,27,7,0,0), +d(2031,4,6,8,0,0), +d(2031,10,26,7,0,0), +d(2032,4,4,8,0,0), +d(2032,10,31,7,0,0), +d(2033,4,3,8,0,0), +d(2033,10,30,7,0,0), +d(2034,4,2,8,0,0), +d(2034,10,29,7,0,0), +d(2035,4,1,8,0,0), +d(2035,10,28,7,0,0), +d(2036,4,6,8,0,0), +d(2036,10,26,7,0,0), +d(2037,4,5,8,0,0), +d(2037,10,25,7,0,0), + ] + + _transition_info = [ +i(-23820,0,'LMT'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-25200,0,'MST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +General = General() + diff --git a/vendor/pytz/zoneinfo/Mexico/__init__.py b/vendor/pytz/zoneinfo/Mexico/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/NZ.py b/vendor/pytz/zoneinfo/NZ.py new file mode 100644 index 00000000..8e80f819 --- /dev/null +++ b/vendor/pytz/zoneinfo/NZ.py @@ -0,0 +1,330 @@ +'''tzinfo timezone information for NZ.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class NZ(DstTzInfo): + '''NZ timezone definition. See datetime.tzinfo for details''' + + zone = 'NZ' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,11,5,14,30,0), +d(1928,3,3,13,30,0), +d(1928,10,13,14,30,0), +d(1929,3,16,14,0,0), +d(1929,10,12,14,30,0), +d(1930,3,15,14,0,0), +d(1930,10,11,14,30,0), +d(1931,3,14,14,0,0), +d(1931,10,10,14,30,0), +d(1932,3,19,14,0,0), +d(1932,10,8,14,30,0), +d(1933,3,18,14,0,0), +d(1933,10,7,14,30,0), +d(1934,4,28,14,0,0), +d(1934,9,29,14,30,0), +d(1935,4,27,14,0,0), +d(1935,9,28,14,30,0), +d(1936,4,25,14,0,0), +d(1936,9,26,14,30,0), +d(1937,4,24,14,0,0), +d(1937,9,25,14,30,0), +d(1938,4,23,14,0,0), +d(1938,9,24,14,30,0), +d(1939,4,29,14,0,0), +d(1939,9,23,14,30,0), +d(1940,4,27,14,0,0), +d(1940,9,28,14,30,0), +d(1945,12,31,12,0,0), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(41400,0,'NZMT'), +i(45000,3600,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), + ] + +NZ = NZ() + diff --git a/vendor/pytz/zoneinfo/NZ_minus_CHAT.py b/vendor/pytz/zoneinfo/NZ_minus_CHAT.py new file mode 100644 index 00000000..4cbbb3ee --- /dev/null +++ b/vendor/pytz/zoneinfo/NZ_minus_CHAT.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for NZ_minus_CHAT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class NZ_minus_CHAT(DstTzInfo): + '''NZ_minus_CHAT timezone definition. See datetime.tzinfo for details''' + + zone = 'NZ_minus_CHAT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1956,12,31,11,46,12), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(44040,0,'LMT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), + ] + +NZ_minus_CHAT = NZ_minus_CHAT() + diff --git a/vendor/pytz/zoneinfo/Navajo.py b/vendor/pytz/zoneinfo/Navajo.py new file mode 100644 index 00000000..793142ec --- /dev/null +++ b/vendor/pytz/zoneinfo/Navajo.py @@ -0,0 +1,334 @@ +'''tzinfo timezone information for Navajo.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Navajo(DstTzInfo): + '''Navajo timezone definition. See datetime.tzinfo for details''' + + zone = 'Navajo' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1920,3,28,9,0,0), +d(1920,10,31,8,0,0), +d(1921,3,27,9,0,0), +d(1921,5,22,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,8,0,0), +d(1966,4,24,9,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Navajo = Navajo() + diff --git a/vendor/pytz/zoneinfo/PRC.py b/vendor/pytz/zoneinfo/PRC.py new file mode 100644 index 00000000..872a94da --- /dev/null +++ b/vendor/pytz/zoneinfo/PRC.py @@ -0,0 +1,54 @@ +'''tzinfo timezone information for PRC.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class PRC(DstTzInfo): + '''PRC timezone definition. See datetime.tzinfo for details''' + + zone = 'PRC' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,12,31,15,54,8), +d(1940,6,2,16,0,0), +d(1940,9,30,15,0,0), +d(1941,3,15,16,0,0), +d(1941,9,30,15,0,0), +d(1986,5,3,16,0,0), +d(1986,9,13,15,0,0), +d(1987,4,11,16,0,0), +d(1987,9,12,15,0,0), +d(1988,4,9,16,0,0), +d(1988,9,10,15,0,0), +d(1989,4,15,16,0,0), +d(1989,9,16,15,0,0), +d(1990,4,14,16,0,0), +d(1990,9,15,15,0,0), +d(1991,4,13,16,0,0), +d(1991,9,14,15,0,0), + ] + + _transition_info = [ +i(29160,0,'LMT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +PRC = PRC() + diff --git a/vendor/pytz/zoneinfo/PST8PDT.py b/vendor/pytz/zoneinfo/PST8PDT.py new file mode 100644 index 00000000..b4ef54d6 --- /dev/null +++ b/vendor/pytz/zoneinfo/PST8PDT.py @@ -0,0 +1,318 @@ +'''tzinfo timezone information for PST8PDT.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class PST8PDT(DstTzInfo): + '''PST8PDT timezone definition. See datetime.tzinfo for details''' + + zone = 'PST8PDT' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,10,0,0), +d(1918,10,27,9,0,0), +d(1919,3,30,10,0,0), +d(1919,10,26,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,1,6,10,0,0), +d(1974,10,27,9,0,0), +d(1975,2,23,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +PST8PDT = PST8PDT() + diff --git a/vendor/pytz/zoneinfo/Pacific/Apia.py b/vendor/pytz/zoneinfo/Pacific/Apia.py new file mode 100644 index 00000000..05cb54a0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Apia.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Apia.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Apia(DstTzInfo): + '''Pacific/Apia timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Apia' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,1,1,11,26,56), +d(1950,1,1,11,30,0), + ] + + _transition_info = [ +i(-41220,0,'LMT'), +i(-41400,0,'SAMT'), +i(-39600,0,'WST'), + ] + +Apia = Apia() + diff --git a/vendor/pytz/zoneinfo/Pacific/Auckland.py b/vendor/pytz/zoneinfo/Pacific/Auckland.py new file mode 100644 index 00000000..a257d229 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Auckland.py @@ -0,0 +1,330 @@ +'''tzinfo timezone information for Pacific/Auckland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Auckland(DstTzInfo): + '''Pacific/Auckland timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Auckland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1927,11,5,14,30,0), +d(1928,3,3,13,30,0), +d(1928,10,13,14,30,0), +d(1929,3,16,14,0,0), +d(1929,10,12,14,30,0), +d(1930,3,15,14,0,0), +d(1930,10,11,14,30,0), +d(1931,3,14,14,0,0), +d(1931,10,10,14,30,0), +d(1932,3,19,14,0,0), +d(1932,10,8,14,30,0), +d(1933,3,18,14,0,0), +d(1933,10,7,14,30,0), +d(1934,4,28,14,0,0), +d(1934,9,29,14,30,0), +d(1935,4,27,14,0,0), +d(1935,9,28,14,30,0), +d(1936,4,25,14,0,0), +d(1936,9,26,14,30,0), +d(1937,4,24,14,0,0), +d(1937,9,25,14,30,0), +d(1938,4,23,14,0,0), +d(1938,9,24,14,30,0), +d(1939,4,29,14,0,0), +d(1939,9,23,14,30,0), +d(1940,4,27,14,0,0), +d(1940,9,28,14,30,0), +d(1945,12,31,12,0,0), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(41400,0,'NZMT'), +i(45000,3600,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(41400,0,'NZMT'), +i(43200,1800,'NZST'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), +i(43200,0,'NZST'), +i(46800,3600,'NZDT'), + ] + +Auckland = Auckland() + diff --git a/vendor/pytz/zoneinfo/Pacific/Chatham.py b/vendor/pytz/zoneinfo/Pacific/Chatham.py new file mode 100644 index 00000000..8b78fdd1 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Chatham.py @@ -0,0 +1,276 @@ +'''tzinfo timezone information for Pacific/Chatham.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Chatham(DstTzInfo): + '''Pacific/Chatham timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Chatham' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1956,12,31,11,46,12), +d(1974,11,2,14,0,0), +d(1975,2,22,14,0,0), +d(1975,10,25,14,0,0), +d(1976,3,6,14,0,0), +d(1976,10,30,14,0,0), +d(1977,3,5,14,0,0), +d(1977,10,29,14,0,0), +d(1978,3,4,14,0,0), +d(1978,10,28,14,0,0), +d(1979,3,3,14,0,0), +d(1979,10,27,14,0,0), +d(1980,3,1,14,0,0), +d(1980,10,25,14,0,0), +d(1981,2,28,14,0,0), +d(1981,10,24,14,0,0), +d(1982,3,6,14,0,0), +d(1982,10,30,14,0,0), +d(1983,3,5,14,0,0), +d(1983,10,29,14,0,0), +d(1984,3,3,14,0,0), +d(1984,10,27,14,0,0), +d(1985,3,2,14,0,0), +d(1985,10,26,14,0,0), +d(1986,3,1,14,0,0), +d(1986,10,25,14,0,0), +d(1987,2,28,14,0,0), +d(1987,10,24,14,0,0), +d(1988,3,5,14,0,0), +d(1988,10,29,14,0,0), +d(1989,3,4,14,0,0), +d(1989,10,7,14,0,0), +d(1990,3,17,14,0,0), +d(1990,10,6,14,0,0), +d(1991,3,16,14,0,0), +d(1991,10,5,14,0,0), +d(1992,3,14,14,0,0), +d(1992,10,3,14,0,0), +d(1993,3,20,14,0,0), +d(1993,10,2,14,0,0), +d(1994,3,19,14,0,0), +d(1994,10,1,14,0,0), +d(1995,3,18,14,0,0), +d(1995,9,30,14,0,0), +d(1996,3,16,14,0,0), +d(1996,10,5,14,0,0), +d(1997,3,15,14,0,0), +d(1997,10,4,14,0,0), +d(1998,3,14,14,0,0), +d(1998,10,3,14,0,0), +d(1999,3,20,14,0,0), +d(1999,10,2,14,0,0), +d(2000,3,18,14,0,0), +d(2000,9,30,14,0,0), +d(2001,3,17,14,0,0), +d(2001,10,6,14,0,0), +d(2002,3,16,14,0,0), +d(2002,10,5,14,0,0), +d(2003,3,15,14,0,0), +d(2003,10,4,14,0,0), +d(2004,3,20,14,0,0), +d(2004,10,2,14,0,0), +d(2005,3,19,14,0,0), +d(2005,10,1,14,0,0), +d(2006,3,18,14,0,0), +d(2006,9,30,14,0,0), +d(2007,3,17,14,0,0), +d(2007,10,6,14,0,0), +d(2008,3,15,14,0,0), +d(2008,10,4,14,0,0), +d(2009,3,14,14,0,0), +d(2009,10,3,14,0,0), +d(2010,3,20,14,0,0), +d(2010,10,2,14,0,0), +d(2011,3,19,14,0,0), +d(2011,10,1,14,0,0), +d(2012,3,17,14,0,0), +d(2012,10,6,14,0,0), +d(2013,3,16,14,0,0), +d(2013,10,5,14,0,0), +d(2014,3,15,14,0,0), +d(2014,10,4,14,0,0), +d(2015,3,14,14,0,0), +d(2015,10,3,14,0,0), +d(2016,3,19,14,0,0), +d(2016,10,1,14,0,0), +d(2017,3,18,14,0,0), +d(2017,9,30,14,0,0), +d(2018,3,17,14,0,0), +d(2018,10,6,14,0,0), +d(2019,3,16,14,0,0), +d(2019,10,5,14,0,0), +d(2020,3,14,14,0,0), +d(2020,10,3,14,0,0), +d(2021,3,20,14,0,0), +d(2021,10,2,14,0,0), +d(2022,3,19,14,0,0), +d(2022,10,1,14,0,0), +d(2023,3,18,14,0,0), +d(2023,9,30,14,0,0), +d(2024,3,16,14,0,0), +d(2024,10,5,14,0,0), +d(2025,3,15,14,0,0), +d(2025,10,4,14,0,0), +d(2026,3,14,14,0,0), +d(2026,10,3,14,0,0), +d(2027,3,20,14,0,0), +d(2027,10,2,14,0,0), +d(2028,3,18,14,0,0), +d(2028,9,30,14,0,0), +d(2029,3,17,14,0,0), +d(2029,10,6,14,0,0), +d(2030,3,16,14,0,0), +d(2030,10,5,14,0,0), +d(2031,3,15,14,0,0), +d(2031,10,4,14,0,0), +d(2032,3,20,14,0,0), +d(2032,10,2,14,0,0), +d(2033,3,19,14,0,0), +d(2033,10,1,14,0,0), +d(2034,3,18,14,0,0), +d(2034,9,30,14,0,0), +d(2035,3,17,14,0,0), +d(2035,10,6,14,0,0), +d(2036,3,15,14,0,0), +d(2036,10,4,14,0,0), +d(2037,3,14,14,0,0), +d(2037,10,3,14,0,0), + ] + + _transition_info = [ +i(44040,0,'LMT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), +i(45900,0,'CHAST'), +i(49500,3600,'CHADT'), + ] + +Chatham = Chatham() + diff --git a/vendor/pytz/zoneinfo/Pacific/Easter.py b/vendor/pytz/zoneinfo/Pacific/Easter.py new file mode 100644 index 00000000..b265b32a --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Easter.py @@ -0,0 +1,308 @@ +'''tzinfo timezone information for Pacific/Easter.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Easter(DstTzInfo): + '''Pacific/Easter timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Easter' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1932,9,1,7,17,28), +d(1942,6,1,4,0,0), +d(1942,8,1,5,0,0), +d(1946,9,1,3,0,0), +d(1968,11,3,4,0,0), +d(1969,3,30,3,0,0), +d(1969,11,23,4,0,0), +d(1970,3,29,3,0,0), +d(1970,10,11,4,0,0), +d(1971,3,14,3,0,0), +d(1971,10,10,4,0,0), +d(1972,3,12,3,0,0), +d(1972,10,15,4,0,0), +d(1973,3,11,3,0,0), +d(1973,9,30,4,0,0), +d(1974,3,10,3,0,0), +d(1974,10,13,4,0,0), +d(1975,3,9,3,0,0), +d(1975,10,12,4,0,0), +d(1976,3,14,3,0,0), +d(1976,10,10,4,0,0), +d(1977,3,13,3,0,0), +d(1977,10,9,4,0,0), +d(1978,3,12,3,0,0), +d(1978,10,15,4,0,0), +d(1979,3,11,3,0,0), +d(1979,10,14,4,0,0), +d(1980,3,9,3,0,0), +d(1980,10,12,4,0,0), +d(1981,3,15,3,0,0), +d(1981,10,11,4,0,0), +d(1982,1,19,3,0,0), +d(1982,3,14,3,0,0), +d(1982,10,10,4,0,0), +d(1983,3,13,3,0,0), +d(1983,10,9,4,0,0), +d(1984,3,11,3,0,0), +d(1984,10,14,4,0,0), +d(1985,3,10,3,0,0), +d(1985,10,13,4,0,0), +d(1986,3,9,3,0,0), +d(1986,10,12,4,0,0), +d(1987,4,12,3,0,0), +d(1987,10,11,4,0,0), +d(1988,3,13,3,0,0), +d(1988,10,2,4,0,0), +d(1989,3,12,3,0,0), +d(1989,10,15,4,0,0), +d(1990,3,18,3,0,0), +d(1990,9,16,4,0,0), +d(1991,3,10,3,0,0), +d(1991,10,13,4,0,0), +d(1992,3,15,3,0,0), +d(1992,10,11,4,0,0), +d(1993,3,14,3,0,0), +d(1993,10,10,4,0,0), +d(1994,3,13,3,0,0), +d(1994,10,9,4,0,0), +d(1995,3,12,3,0,0), +d(1995,10,15,4,0,0), +d(1996,3,10,3,0,0), +d(1996,10,13,4,0,0), +d(1997,3,30,3,0,0), +d(1997,10,12,4,0,0), +d(1998,3,15,3,0,0), +d(1998,9,27,4,0,0), +d(1999,4,4,3,0,0), +d(1999,10,10,4,0,0), +d(2000,3,12,3,0,0), +d(2000,10,15,4,0,0), +d(2001,3,11,3,0,0), +d(2001,10,14,4,0,0), +d(2002,3,10,3,0,0), +d(2002,10,13,4,0,0), +d(2003,3,9,3,0,0), +d(2003,10,12,4,0,0), +d(2004,3,14,3,0,0), +d(2004,10,10,4,0,0), +d(2005,3,13,3,0,0), +d(2005,10,9,4,0,0), +d(2006,3,12,3,0,0), +d(2006,10,15,4,0,0), +d(2007,3,11,3,0,0), +d(2007,10,14,4,0,0), +d(2008,3,9,3,0,0), +d(2008,10,12,4,0,0), +d(2009,3,15,3,0,0), +d(2009,10,11,4,0,0), +d(2010,3,14,3,0,0), +d(2010,10,10,4,0,0), +d(2011,3,13,3,0,0), +d(2011,10,9,4,0,0), +d(2012,3,11,3,0,0), +d(2012,10,14,4,0,0), +d(2013,3,10,3,0,0), +d(2013,10,13,4,0,0), +d(2014,3,9,3,0,0), +d(2014,10,12,4,0,0), +d(2015,3,15,3,0,0), +d(2015,10,11,4,0,0), +d(2016,3,13,3,0,0), +d(2016,10,9,4,0,0), +d(2017,3,12,3,0,0), +d(2017,10,15,4,0,0), +d(2018,3,11,3,0,0), +d(2018,10,14,4,0,0), +d(2019,3,10,3,0,0), +d(2019,10,13,4,0,0), +d(2020,3,15,3,0,0), +d(2020,10,11,4,0,0), +d(2021,3,14,3,0,0), +d(2021,10,10,4,0,0), +d(2022,3,13,3,0,0), +d(2022,10,9,4,0,0), +d(2023,3,12,3,0,0), +d(2023,10,15,4,0,0), +d(2024,3,10,3,0,0), +d(2024,10,13,4,0,0), +d(2025,3,9,3,0,0), +d(2025,10,12,4,0,0), +d(2026,3,15,3,0,0), +d(2026,10,11,4,0,0), +d(2027,3,14,3,0,0), +d(2027,10,10,4,0,0), +d(2028,3,12,3,0,0), +d(2028,10,15,4,0,0), +d(2029,3,11,3,0,0), +d(2029,10,14,4,0,0), +d(2030,3,10,3,0,0), +d(2030,10,13,4,0,0), +d(2031,3,9,3,0,0), +d(2031,10,12,4,0,0), +d(2032,3,14,3,0,0), +d(2032,10,10,4,0,0), +d(2033,3,13,3,0,0), +d(2033,10,9,4,0,0), +d(2034,3,12,3,0,0), +d(2034,10,15,4,0,0), +d(2035,3,11,3,0,0), +d(2035,10,14,4,0,0), +d(2036,3,9,3,0,0), +d(2036,10,12,4,0,0), +d(2037,3,15,3,0,0), +d(2037,10,11,4,0,0), + ] + + _transition_info = [ +i(-26220,0,'MMT'), +i(-21600,4620,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-25200,0,'EAST'), +i(-21600,3600,'EASST'), +i(-18000,7200,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), +i(-21600,0,'EAST'), +i(-18000,3600,'EASST'), + ] + +Easter = Easter() + diff --git a/vendor/pytz/zoneinfo/Pacific/Efate.py b/vendor/pytz/zoneinfo/Pacific/Efate.py new file mode 100644 index 00000000..51421914 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Efate.py @@ -0,0 +1,62 @@ +'''tzinfo timezone information for Pacific/Efate.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Efate(DstTzInfo): + '''Pacific/Efate timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Efate' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,12,12,46,44), +d(1983,9,24,13,0,0), +d(1984,3,24,12,0,0), +d(1984,10,22,13,0,0), +d(1985,3,23,12,0,0), +d(1985,9,28,13,0,0), +d(1986,3,22,12,0,0), +d(1986,9,27,13,0,0), +d(1987,3,28,12,0,0), +d(1987,9,26,13,0,0), +d(1988,3,26,12,0,0), +d(1988,9,24,13,0,0), +d(1989,3,25,12,0,0), +d(1989,9,23,13,0,0), +d(1990,3,24,12,0,0), +d(1990,9,22,13,0,0), +d(1991,3,23,12,0,0), +d(1991,9,28,13,0,0), +d(1992,1,25,12,0,0), +d(1992,10,24,13,0,0), +d(1993,1,23,12,0,0), + ] + + _transition_info = [ +i(40380,0,'LMT'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), +i(43200,3600,'VUST'), +i(39600,0,'VUT'), + ] + +Efate = Efate() + diff --git a/vendor/pytz/zoneinfo/Pacific/Enderbury.py b/vendor/pytz/zoneinfo/Pacific/Enderbury.py new file mode 100644 index 00000000..4c7d28f5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Enderbury.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Enderbury.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Enderbury(DstTzInfo): + '''Pacific/Enderbury timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Enderbury' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1979,10,1,12,0,0), +d(1995,1,1,11,0,0), + ] + + _transition_info = [ +i(-43200,0,'PHOT'), +i(-39600,0,'PHOT'), +i(46800,0,'PHOT'), + ] + +Enderbury = Enderbury() + diff --git a/vendor/pytz/zoneinfo/Pacific/Fakaofo.py b/vendor/pytz/zoneinfo/Pacific/Fakaofo.py new file mode 100644 index 00000000..6d39db7f --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Fakaofo.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Fakaofo.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Fakaofo(StaticTzInfo): + '''Pacific/Fakaofo timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Fakaofo' + _utcoffset = timedelta(seconds=-36000) + _tzname = 'TKT' + +Fakaofo = Fakaofo() + diff --git a/vendor/pytz/zoneinfo/Pacific/Fiji.py b/vendor/pytz/zoneinfo/Pacific/Fiji.py new file mode 100644 index 00000000..8f416d9e --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Fiji.py @@ -0,0 +1,30 @@ +'''tzinfo timezone information for Pacific/Fiji.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Fiji(DstTzInfo): + '''Pacific/Fiji timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Fiji' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,10,25,12,6,20), +d(1998,10,31,14,0,0), +d(1999,2,27,14,0,0), +d(1999,11,6,14,0,0), +d(2000,2,26,14,0,0), + ] + + _transition_info = [ +i(42840,0,'LMT'), +i(43200,0,'FJT'), +i(46800,3600,'FJST'), +i(43200,0,'FJT'), +i(46800,3600,'FJST'), +i(43200,0,'FJT'), + ] + +Fiji = Fiji() + diff --git a/vendor/pytz/zoneinfo/Pacific/Funafuti.py b/vendor/pytz/zoneinfo/Pacific/Funafuti.py new file mode 100644 index 00000000..9801538c --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Funafuti.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Funafuti.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Funafuti(StaticTzInfo): + '''Pacific/Funafuti timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Funafuti' + _utcoffset = timedelta(seconds=43200) + _tzname = 'TVT' + +Funafuti = Funafuti() + diff --git a/vendor/pytz/zoneinfo/Pacific/Galapagos.py b/vendor/pytz/zoneinfo/Pacific/Galapagos.py new file mode 100644 index 00000000..9102a8e8 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Galapagos.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Galapagos.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Galapagos(DstTzInfo): + '''Pacific/Galapagos timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Galapagos' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1931,1,1,5,58,24), +d(1986,1,1,5,0,0), + ] + + _transition_info = [ +i(-21480,0,'LMT'), +i(-18000,0,'ECT'), +i(-21600,0,'GALT'), + ] + +Galapagos = Galapagos() + diff --git a/vendor/pytz/zoneinfo/Pacific/Gambier.py b/vendor/pytz/zoneinfo/Pacific/Gambier.py new file mode 100644 index 00000000..fd04b894 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Gambier.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Gambier.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Gambier(DstTzInfo): + '''Pacific/Gambier timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Gambier' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,10,1,8,59,48), + ] + + _transition_info = [ +i(-32400,0,'LMT'), +i(-32400,0,'GAMT'), + ] + +Gambier = Gambier() + diff --git a/vendor/pytz/zoneinfo/Pacific/Guadalcanal.py b/vendor/pytz/zoneinfo/Pacific/Guadalcanal.py new file mode 100644 index 00000000..e88689c7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Guadalcanal.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Guadalcanal.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guadalcanal(DstTzInfo): + '''Pacific/Guadalcanal timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Guadalcanal' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,9,30,13,20,12), + ] + + _transition_info = [ +i(38400,0,'LMT'), +i(39600,0,'SBT'), + ] + +Guadalcanal = Guadalcanal() + diff --git a/vendor/pytz/zoneinfo/Pacific/Guam.py b/vendor/pytz/zoneinfo/Pacific/Guam.py new file mode 100644 index 00000000..7ea7b706 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Guam.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Guam.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Guam(DstTzInfo): + '''Pacific/Guam timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Guam' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(2000,12,22,14,0,0), + ] + + _transition_info = [ +i(36000,0,'GST'), +i(36000,0,'ChST'), + ] + +Guam = Guam() + diff --git a/vendor/pytz/zoneinfo/Pacific/Honolulu.py b/vendor/pytz/zoneinfo/Pacific/Honolulu.py new file mode 100644 index 00000000..e32cc01a --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Honolulu.py @@ -0,0 +1,32 @@ +'''tzinfo timezone information for Pacific/Honolulu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Honolulu(DstTzInfo): + '''Pacific/Honolulu timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Honolulu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1933,4,30,12,30,0), +d(1933,5,21,11,30,0), +d(1942,2,9,12,30,0), +d(1945,8,14,23,0,0), +d(1945,9,30,11,30,0), +d(1947,6,8,12,30,0), + ] + + _transition_info = [ +i(-37800,0,'HST'), +i(-34200,3600,'HDT'), +i(-37800,0,'HST'), +i(-34200,3600,'HWT'), +i(-34200,3600,'HPT'), +i(-37800,0,'HST'), +i(-36000,0,'HST'), + ] + +Honolulu = Honolulu() + diff --git a/vendor/pytz/zoneinfo/Pacific/Johnston.py b/vendor/pytz/zoneinfo/Pacific/Johnston.py new file mode 100644 index 00000000..a4a29579 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Johnston.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Johnston.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Johnston(StaticTzInfo): + '''Pacific/Johnston timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Johnston' + _utcoffset = timedelta(seconds=-36000) + _tzname = 'HST' + +Johnston = Johnston() + diff --git a/vendor/pytz/zoneinfo/Pacific/Kiritimati.py b/vendor/pytz/zoneinfo/Pacific/Kiritimati.py new file mode 100644 index 00000000..f1e45643 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Kiritimati.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Kiritimati.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kiritimati(DstTzInfo): + '''Pacific/Kiritimati timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Kiritimati' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1979,10,1,10,40,0), +d(1995,1,1,10,0,0), + ] + + _transition_info = [ +i(-38400,0,'LINT'), +i(-36000,0,'LINT'), +i(50400,0,'LINT'), + ] + +Kiritimati = Kiritimati() + diff --git a/vendor/pytz/zoneinfo/Pacific/Kosrae.py b/vendor/pytz/zoneinfo/Pacific/Kosrae.py new file mode 100644 index 00000000..76e694c9 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Kosrae.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Kosrae.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kosrae(DstTzInfo): + '''Pacific/Kosrae timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Kosrae' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,9,30,13,0,0), +d(1998,12,31,12,0,0), + ] + + _transition_info = [ +i(39600,0,'KOST'), +i(43200,0,'KOST'), +i(39600,0,'KOST'), + ] + +Kosrae = Kosrae() + diff --git a/vendor/pytz/zoneinfo/Pacific/Kwajalein.py b/vendor/pytz/zoneinfo/Pacific/Kwajalein.py new file mode 100644 index 00000000..65c4b031 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Kwajalein.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Kwajalein.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Kwajalein(DstTzInfo): + '''Pacific/Kwajalein timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Kwajalein' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,9,30,13,0,0), +d(1993,8,20,12,0,0), + ] + + _transition_info = [ +i(39600,0,'MHT'), +i(-43200,0,'KWAT'), +i(43200,0,'MHT'), + ] + +Kwajalein = Kwajalein() + diff --git a/vendor/pytz/zoneinfo/Pacific/Majuro.py b/vendor/pytz/zoneinfo/Pacific/Majuro.py new file mode 100644 index 00000000..e2c09901 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Majuro.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Majuro.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Majuro(DstTzInfo): + '''Pacific/Majuro timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Majuro' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,9,30,13,0,0), + ] + + _transition_info = [ +i(39600,0,'MHT'), +i(43200,0,'MHT'), + ] + +Majuro = Majuro() + diff --git a/vendor/pytz/zoneinfo/Pacific/Marquesas.py b/vendor/pytz/zoneinfo/Pacific/Marquesas.py new file mode 100644 index 00000000..943211a7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Marquesas.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Marquesas.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Marquesas(DstTzInfo): + '''Pacific/Marquesas timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Marquesas' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,10,1,9,18,0), + ] + + _transition_info = [ +i(-33480,0,'LMT'), +i(-34200,0,'MART'), + ] + +Marquesas = Marquesas() + diff --git a/vendor/pytz/zoneinfo/Pacific/Midway.py b/vendor/pytz/zoneinfo/Pacific/Midway.py new file mode 100644 index 00000000..04570f01 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Midway.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Pacific/Midway.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Midway(DstTzInfo): + '''Pacific/Midway timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Midway' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1956,6,3,11,0,0), +d(1956,9,2,10,0,0), +d(1967,4,1,11,0,0), +d(1983,11,30,11,0,0), + ] + + _transition_info = [ +i(-39600,0,'NST'), +i(-36000,3600,'NDT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-39600,0,'SST'), + ] + +Midway = Midway() + diff --git a/vendor/pytz/zoneinfo/Pacific/Nauru.py b/vendor/pytz/zoneinfo/Pacific/Nauru.py new file mode 100644 index 00000000..97ddde30 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Nauru.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Pacific/Nauru.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Nauru(DstTzInfo): + '''Pacific/Nauru timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Nauru' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1921,1,14,12,52,20), +d(1942,3,14,12,30,0), +d(1944,8,14,15,0,0), +d(1979,4,30,12,30,0), + ] + + _transition_info = [ +i(40080,0,'LMT'), +i(41400,0,'NRT'), +i(32400,0,'JST'), +i(41400,0,'NRT'), +i(43200,0,'NRT'), + ] + +Nauru = Nauru() + diff --git a/vendor/pytz/zoneinfo/Pacific/Niue.py b/vendor/pytz/zoneinfo/Pacific/Niue.py new file mode 100644 index 00000000..6449e84f --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Niue.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Niue.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Niue(DstTzInfo): + '''Pacific/Niue timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Niue' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1951,1,1,11,20,0), +d(1978,10,1,11,30,0), + ] + + _transition_info = [ +i(-40800,0,'NUT'), +i(-41400,0,'NUT'), +i(-39600,0,'NUT'), + ] + +Niue = Niue() + diff --git a/vendor/pytz/zoneinfo/Pacific/Norfolk.py b/vendor/pytz/zoneinfo/Pacific/Norfolk.py new file mode 100644 index 00000000..8eda51a2 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Norfolk.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Norfolk.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Norfolk(DstTzInfo): + '''Pacific/Norfolk timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Norfolk' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1950,12,31,12,48,0), + ] + + _transition_info = [ +i(40320,0,'NMT'), +i(41400,0,'NFT'), + ] + +Norfolk = Norfolk() + diff --git a/vendor/pytz/zoneinfo/Pacific/Noumea.py b/vendor/pytz/zoneinfo/Pacific/Noumea.py new file mode 100644 index 00000000..32efeea0 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Noumea.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Pacific/Noumea.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Noumea(DstTzInfo): + '''Pacific/Noumea timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Noumea' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,12,12,54,12), +d(1977,12,3,13,0,0), +d(1978,2,26,12,0,0), +d(1978,12,2,13,0,0), +d(1979,2,26,12,0,0), +d(1996,11,30,15,0,0), +d(1997,3,1,15,0,0), + ] + + _transition_info = [ +i(39960,0,'LMT'), +i(39600,0,'NCT'), +i(43200,3600,'NCST'), +i(39600,0,'NCT'), +i(43200,3600,'NCST'), +i(39600,0,'NCT'), +i(43200,3600,'NCST'), +i(39600,0,'NCT'), + ] + +Noumea = Noumea() + diff --git a/vendor/pytz/zoneinfo/Pacific/Pago_Pago.py b/vendor/pytz/zoneinfo/Pacific/Pago_Pago.py new file mode 100644 index 00000000..d0fa9c02 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Pago_Pago.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Pacific/Pago_Pago.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pago_Pago(DstTzInfo): + '''Pacific/Pago_Pago timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Pago_Pago' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,1,1,11,22,48), +d(1950,1,1,11,30,0), +d(1967,4,1,11,0,0), +d(1983,11,30,11,0,0), + ] + + _transition_info = [ +i(-40980,0,'LMT'), +i(-41400,0,'SAMT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-39600,0,'SST'), + ] + +Pago_Pago = Pago_Pago() + diff --git a/vendor/pytz/zoneinfo/Pacific/Palau.py b/vendor/pytz/zoneinfo/Pacific/Palau.py new file mode 100644 index 00000000..b873d880 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Palau.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Palau.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Palau(StaticTzInfo): + '''Pacific/Palau timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Palau' + _utcoffset = timedelta(seconds=32400) + _tzname = 'PWT' + +Palau = Palau() + diff --git a/vendor/pytz/zoneinfo/Pacific/Pitcairn.py b/vendor/pytz/zoneinfo/Pacific/Pitcairn.py new file mode 100644 index 00000000..125b8a8e --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Pitcairn.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Pitcairn.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pitcairn(DstTzInfo): + '''Pacific/Pitcairn timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Pitcairn' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1998,4,27,8,30,0), + ] + + _transition_info = [ +i(-30600,0,'PNT'), +i(-28800,0,'PST'), + ] + +Pitcairn = Pitcairn() + diff --git a/vendor/pytz/zoneinfo/Pacific/Ponape.py b/vendor/pytz/zoneinfo/Pacific/Ponape.py new file mode 100644 index 00000000..4cd6ad8e --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Ponape.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Ponape.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Ponape(StaticTzInfo): + '''Pacific/Ponape timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Ponape' + _utcoffset = timedelta(seconds=39600) + _tzname = 'PONT' + +Ponape = Ponape() + diff --git a/vendor/pytz/zoneinfo/Pacific/Port_Moresby.py b/vendor/pytz/zoneinfo/Pacific/Port_Moresby.py new file mode 100644 index 00000000..8510d854 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Port_Moresby.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Port_Moresby.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Port_Moresby(StaticTzInfo): + '''Pacific/Port_Moresby timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Port_Moresby' + _utcoffset = timedelta(seconds=36000) + _tzname = 'PGT' + +Port_Moresby = Port_Moresby() + diff --git a/vendor/pytz/zoneinfo/Pacific/Rarotonga.py b/vendor/pytz/zoneinfo/Pacific/Rarotonga.py new file mode 100644 index 00000000..d6106e9c --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Rarotonga.py @@ -0,0 +1,72 @@ +'''tzinfo timezone information for Pacific/Rarotonga.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Rarotonga(DstTzInfo): + '''Pacific/Rarotonga timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Rarotonga' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1978,11,12,10,30,0), +d(1979,3,4,9,30,0), +d(1979,10,28,10,0,0), +d(1980,3,2,9,30,0), +d(1980,10,26,10,0,0), +d(1981,3,1,9,30,0), +d(1981,10,25,10,0,0), +d(1982,3,7,9,30,0), +d(1982,10,31,10,0,0), +d(1983,3,6,9,30,0), +d(1983,10,30,10,0,0), +d(1984,3,4,9,30,0), +d(1984,10,28,10,0,0), +d(1985,3,3,9,30,0), +d(1985,10,27,10,0,0), +d(1986,3,2,9,30,0), +d(1986,10,26,10,0,0), +d(1987,3,1,9,30,0), +d(1987,10,25,10,0,0), +d(1988,3,6,9,30,0), +d(1988,10,30,10,0,0), +d(1989,3,5,9,30,0), +d(1989,10,29,10,0,0), +d(1990,3,4,9,30,0), +d(1990,10,28,10,0,0), +d(1991,3,3,9,30,0), + ] + + _transition_info = [ +i(-37800,0,'CKT'), +i(-34200,3600,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), +i(-34200,1800,'CKHST'), +i(-36000,0,'CKT'), + ] + +Rarotonga = Rarotonga() + diff --git a/vendor/pytz/zoneinfo/Pacific/Saipan.py b/vendor/pytz/zoneinfo/Pacific/Saipan.py new file mode 100644 index 00000000..9c1e93ec --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Saipan.py @@ -0,0 +1,24 @@ +'''tzinfo timezone information for Pacific/Saipan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Saipan(DstTzInfo): + '''Pacific/Saipan timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Saipan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1969,9,30,15,0,0), +d(2000,12,22,14,0,0), + ] + + _transition_info = [ +i(32400,0,'MPT'), +i(36000,0,'MPT'), +i(36000,0,'ChST'), + ] + +Saipan = Saipan() + diff --git a/vendor/pytz/zoneinfo/Pacific/Samoa.py b/vendor/pytz/zoneinfo/Pacific/Samoa.py new file mode 100644 index 00000000..91f1ab54 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Samoa.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for Pacific/Samoa.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Samoa(DstTzInfo): + '''Pacific/Samoa timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Samoa' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,1,1,11,22,48), +d(1950,1,1,11,30,0), +d(1967,4,1,11,0,0), +d(1983,11,30,11,0,0), + ] + + _transition_info = [ +i(-40980,0,'LMT'), +i(-41400,0,'SAMT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-39600,0,'SST'), + ] + +Samoa = Samoa() + diff --git a/vendor/pytz/zoneinfo/Pacific/Tahiti.py b/vendor/pytz/zoneinfo/Pacific/Tahiti.py new file mode 100644 index 00000000..e930a5bf --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Tahiti.py @@ -0,0 +1,22 @@ +'''tzinfo timezone information for Pacific/Tahiti.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tahiti(DstTzInfo): + '''Pacific/Tahiti timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Tahiti' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,10,1,9,58,16), + ] + + _transition_info = [ +i(-35880,0,'LMT'), +i(-36000,0,'TAHT'), + ] + +Tahiti = Tahiti() + diff --git a/vendor/pytz/zoneinfo/Pacific/Tarawa.py b/vendor/pytz/zoneinfo/Pacific/Tarawa.py new file mode 100644 index 00000000..70a1ea4c --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Tarawa.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Tarawa.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Tarawa(StaticTzInfo): + '''Pacific/Tarawa timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Tarawa' + _utcoffset = timedelta(seconds=43200) + _tzname = 'GILT' + +Tarawa = Tarawa() + diff --git a/vendor/pytz/zoneinfo/Pacific/Tongatapu.py b/vendor/pytz/zoneinfo/Pacific/Tongatapu.py new file mode 100644 index 00000000..85e3d258 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Tongatapu.py @@ -0,0 +1,34 @@ +'''tzinfo timezone information for Pacific/Tongatapu.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Tongatapu(DstTzInfo): + '''Pacific/Tongatapu timezone definition. See datetime.tzinfo for details''' + + zone = 'Pacific/Tongatapu' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1940,12,31,11,40,0), +d(1999,10,6,13,0,0), +d(2000,3,18,13,0,0), +d(2000,11,4,13,0,0), +d(2001,1,27,12,0,0), +d(2001,11,3,13,0,0), +d(2002,1,26,12,0,0), + ] + + _transition_info = [ +i(44400,0,'TOT'), +i(46800,0,'TOT'), +i(50400,3600,'TOST'), +i(46800,0,'TOT'), +i(50400,3600,'TOST'), +i(46800,0,'TOT'), +i(50400,3600,'TOST'), +i(46800,0,'TOT'), + ] + +Tongatapu = Tongatapu() + diff --git a/vendor/pytz/zoneinfo/Pacific/Truk.py b/vendor/pytz/zoneinfo/Pacific/Truk.py new file mode 100644 index 00000000..e6631a2b --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Truk.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Truk.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Truk(StaticTzInfo): + '''Pacific/Truk timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Truk' + _utcoffset = timedelta(seconds=36000) + _tzname = 'TRUT' + +Truk = Truk() + diff --git a/vendor/pytz/zoneinfo/Pacific/Wake.py b/vendor/pytz/zoneinfo/Pacific/Wake.py new file mode 100644 index 00000000..a7e296c7 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Wake.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Wake.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Wake(StaticTzInfo): + '''Pacific/Wake timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Wake' + _utcoffset = timedelta(seconds=43200) + _tzname = 'WAKT' + +Wake = Wake() + diff --git a/vendor/pytz/zoneinfo/Pacific/Wallis.py b/vendor/pytz/zoneinfo/Pacific/Wallis.py new file mode 100644 index 00000000..76f52519 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Wallis.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Wallis.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Wallis(StaticTzInfo): + '''Pacific/Wallis timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Wallis' + _utcoffset = timedelta(seconds=43200) + _tzname = 'WFT' + +Wallis = Wallis() + diff --git a/vendor/pytz/zoneinfo/Pacific/Yap.py b/vendor/pytz/zoneinfo/Pacific/Yap.py new file mode 100644 index 00000000..98152b50 --- /dev/null +++ b/vendor/pytz/zoneinfo/Pacific/Yap.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Pacific/Yap.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Yap(StaticTzInfo): + '''Pacific/Yap timezone definition. See datetime.tzinfo for details''' + zone = 'Pacific/Yap' + _utcoffset = timedelta(seconds=36000) + _tzname = 'TRUT' + +Yap = Yap() + diff --git a/vendor/pytz/zoneinfo/Pacific/__init__.py b/vendor/pytz/zoneinfo/Pacific/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/Poland.py b/vendor/pytz/zoneinfo/Poland.py new file mode 100644 index 00000000..f3b95d38 --- /dev/null +++ b/vendor/pytz/zoneinfo/Poland.py @@ -0,0 +1,354 @@ +'''tzinfo timezone information for Poland.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Poland(DstTzInfo): + '''Poland timezone definition. See datetime.tzinfo for details''' + + zone = 'Poland' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1915,8,4,22,36,0), +d(1916,4,30,22,0,0), +d(1916,9,30,23,0,0), +d(1917,4,16,1,0,0), +d(1917,9,17,1,0,0), +d(1918,4,15,1,0,0), +d(1918,9,16,1,0,0), +d(1919,4,15,0,0,0), +d(1919,9,16,0,0,0), +d(1922,5,31,22,0,0), +d(1940,6,23,1,0,0), +d(1942,11,2,1,0,0), +d(1943,3,29,1,0,0), +d(1943,10,4,1,0,0), +d(1944,4,3,1,0,0), +d(1944,9,30,22,0,0), +d(1944,10,4,0,0,0), +d(1945,4,28,23,0,0), +d(1945,10,31,22,0,0), +d(1946,4,13,23,0,0), +d(1946,10,7,1,0,0), +d(1947,5,4,1,0,0), +d(1947,10,5,1,0,0), +d(1948,4,18,1,0,0), +d(1948,10,3,1,0,0), +d(1949,4,10,1,0,0), +d(1949,10,2,1,0,0), +d(1957,6,2,0,0,0), +d(1957,9,29,0,0,0), +d(1958,3,30,0,0,0), +d(1958,9,28,0,0,0), +d(1959,5,31,0,0,0), +d(1959,10,4,0,0,0), +d(1960,4,3,0,0,0), +d(1960,10,2,0,0,0), +d(1961,5,28,0,0,0), +d(1961,10,1,0,0,0), +d(1962,5,27,0,0,0), +d(1962,9,30,0,0,0), +d(1963,5,26,0,0,0), +d(1963,9,29,0,0,0), +d(1964,5,31,0,0,0), +d(1964,9,27,0,0,0), +d(1976,12,31,23,0,0), +d(1977,4,3,0,0,0), +d(1977,9,25,0,0,0), +d(1978,4,2,0,0,0), +d(1978,10,1,0,0,0), +d(1979,4,1,0,0,0), +d(1979,9,30,0,0,0), +d(1980,4,6,0,0,0), +d(1980,9,28,0,0,0), +d(1981,3,29,0,0,0), +d(1981,9,27,0,0,0), +d(1982,3,28,0,0,0), +d(1982,9,26,0,0,0), +d(1983,3,27,0,0,0), +d(1983,9,25,0,0,0), +d(1984,3,25,0,0,0), +d(1984,9,30,0,0,0), +d(1985,3,31,0,0,0), +d(1985,9,29,0,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1987,12,31,23,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(5040,0,'WMT'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), + ] + +Poland = Poland() + diff --git a/vendor/pytz/zoneinfo/Portugal.py b/vendor/pytz/zoneinfo/Portugal.py new file mode 100644 index 00000000..24cb4801 --- /dev/null +++ b/vendor/pytz/zoneinfo/Portugal.py @@ -0,0 +1,462 @@ +'''tzinfo timezone information for Portugal.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Portugal(DstTzInfo): + '''Portugal timezone definition. See datetime.tzinfo for details''' + + zone = 'Portugal' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1912,1,1,0,36,32), +d(1916,6,17,23,0,0), +d(1916,11,1,0,0,0), +d(1917,2,28,23,0,0), +d(1917,10,14,23,0,0), +d(1918,3,1,23,0,0), +d(1918,10,14,23,0,0), +d(1919,2,28,23,0,0), +d(1919,10,14,23,0,0), +d(1920,2,29,23,0,0), +d(1920,10,14,23,0,0), +d(1921,2,28,23,0,0), +d(1921,10,14,23,0,0), +d(1924,4,16,23,0,0), +d(1924,10,14,23,0,0), +d(1926,4,17,23,0,0), +d(1926,10,2,23,0,0), +d(1927,4,9,23,0,0), +d(1927,10,1,23,0,0), +d(1928,4,14,23,0,0), +d(1928,10,6,23,0,0), +d(1929,4,20,23,0,0), +d(1929,10,5,23,0,0), +d(1931,4,18,23,0,0), +d(1931,10,3,23,0,0), +d(1932,4,2,23,0,0), +d(1932,10,1,23,0,0), +d(1934,4,7,23,0,0), +d(1934,10,6,23,0,0), +d(1935,3,30,23,0,0), +d(1935,10,5,23,0,0), +d(1936,4,18,23,0,0), +d(1936,10,3,23,0,0), +d(1937,4,3,23,0,0), +d(1937,10,2,23,0,0), +d(1938,3,26,23,0,0), +d(1938,10,1,23,0,0), +d(1939,4,15,23,0,0), +d(1939,11,18,23,0,0), +d(1940,2,24,23,0,0), +d(1940,10,5,23,0,0), +d(1941,4,5,23,0,0), +d(1941,10,5,23,0,0), +d(1942,3,14,23,0,0), +d(1942,4,25,22,0,0), +d(1942,8,15,22,0,0), +d(1942,10,24,23,0,0), +d(1943,3,13,23,0,0), +d(1943,4,17,22,0,0), +d(1943,8,28,22,0,0), +d(1943,10,30,23,0,0), +d(1944,3,11,23,0,0), +d(1944,4,22,22,0,0), +d(1944,8,26,22,0,0), +d(1944,10,28,23,0,0), +d(1945,3,10,23,0,0), +d(1945,4,21,22,0,0), +d(1945,8,25,22,0,0), +d(1945,10,27,23,0,0), +d(1946,4,6,23,0,0), +d(1946,10,5,23,0,0), +d(1947,4,6,2,0,0), +d(1947,10,5,2,0,0), +d(1948,4,4,2,0,0), +d(1948,10,3,2,0,0), +d(1949,4,3,2,0,0), +d(1949,10,2,2,0,0), +d(1951,4,1,2,0,0), +d(1951,10,7,2,0,0), +d(1952,4,6,2,0,0), +d(1952,10,5,2,0,0), +d(1953,4,5,2,0,0), +d(1953,10,4,2,0,0), +d(1954,4,4,2,0,0), +d(1954,10,3,2,0,0), +d(1955,4,3,2,0,0), +d(1955,10,2,2,0,0), +d(1956,4,1,2,0,0), +d(1956,10,7,2,0,0), +d(1957,4,7,2,0,0), +d(1957,10,6,2,0,0), +d(1958,4,6,2,0,0), +d(1958,10,5,2,0,0), +d(1959,4,5,2,0,0), +d(1959,10,4,2,0,0), +d(1960,4,3,2,0,0), +d(1960,10,2,2,0,0), +d(1961,4,2,2,0,0), +d(1961,10,1,2,0,0), +d(1962,4,1,2,0,0), +d(1962,10,7,2,0,0), +d(1963,4,7,2,0,0), +d(1963,10,6,2,0,0), +d(1964,4,5,2,0,0), +d(1964,10,4,2,0,0), +d(1965,4,4,2,0,0), +d(1965,10,3,2,0,0), +d(1966,4,3,2,0,0), +d(1976,9,26,0,0,0), +d(1977,3,27,0,0,0), +d(1977,9,25,0,0,0), +d(1978,4,2,0,0,0), +d(1978,10,1,0,0,0), +d(1979,4,1,0,0,0), +d(1979,9,30,1,0,0), +d(1980,3,30,0,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,2,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(-2220,0,'LMT'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(7200,7200,'WEMT'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,0,'CET'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(7200,3600,'CEST'), +i(3600,0,'CET'), +i(3600,0,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +Portugal = Portugal() + diff --git a/vendor/pytz/zoneinfo/ROC.py b/vendor/pytz/zoneinfo/ROC.py new file mode 100644 index 00000000..6aad5b5d --- /dev/null +++ b/vendor/pytz/zoneinfo/ROC.py @@ -0,0 +1,100 @@ +'''tzinfo timezone information for ROC.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class ROC(DstTzInfo): + '''ROC timezone definition. See datetime.tzinfo for details''' + + zone = 'ROC' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1945,4,30,16,0,0), +d(1945,9,30,15,0,0), +d(1946,4,30,16,0,0), +d(1946,9,30,15,0,0), +d(1947,4,30,16,0,0), +d(1947,9,30,15,0,0), +d(1948,4,30,16,0,0), +d(1948,9,30,15,0,0), +d(1949,4,30,16,0,0), +d(1949,9,30,15,0,0), +d(1950,4,30,16,0,0), +d(1950,9,30,15,0,0), +d(1951,4,30,16,0,0), +d(1951,9,30,15,0,0), +d(1952,2,29,16,0,0), +d(1952,10,31,15,0,0), +d(1953,3,31,16,0,0), +d(1953,10,31,15,0,0), +d(1954,3,31,16,0,0), +d(1954,10,31,15,0,0), +d(1955,3,31,16,0,0), +d(1955,9,30,15,0,0), +d(1956,3,31,16,0,0), +d(1956,9,30,15,0,0), +d(1957,3,31,16,0,0), +d(1957,9,30,15,0,0), +d(1958,3,31,16,0,0), +d(1958,9,30,15,0,0), +d(1959,3,31,16,0,0), +d(1959,9,30,15,0,0), +d(1960,5,31,16,0,0), +d(1960,9,30,15,0,0), +d(1961,5,31,16,0,0), +d(1961,9,30,15,0,0), +d(1974,3,31,16,0,0), +d(1974,9,30,15,0,0), +d(1975,3,31,16,0,0), +d(1975,9,30,15,0,0), +d(1980,6,29,16,0,0), +d(1980,9,29,15,0,0), + ] + + _transition_info = [ +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), +i(32400,3600,'CDT'), +i(28800,0,'CST'), + ] + +ROC = ROC() + diff --git a/vendor/pytz/zoneinfo/ROK.py b/vendor/pytz/zoneinfo/ROK.py new file mode 100644 index 00000000..6c867718 --- /dev/null +++ b/vendor/pytz/zoneinfo/ROK.py @@ -0,0 +1,44 @@ +'''tzinfo timezone information for ROK.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class ROK(DstTzInfo): + '''ROK timezone definition. See datetime.tzinfo for details''' + + zone = 'ROK' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1904,11,30,15,30,0), +d(1927,12,31,15,0,0), +d(1931,12,31,15,30,0), +d(1954,3,20,15,0,0), +d(1960,5,14,16,0,0), +d(1960,9,12,15,0,0), +d(1961,8,9,16,0,0), +d(1968,9,30,15,30,0), +d(1987,5,9,15,0,0), +d(1987,10,10,14,0,0), +d(1988,5,7,15,0,0), +d(1988,10,8,14,0,0), + ] + + _transition_info = [ +i(30600,0,'KST'), +i(32400,0,'KST'), +i(30600,0,'KST'), +i(32400,0,'KST'), +i(28800,0,'KST'), +i(32400,3600,'KDT'), +i(28800,0,'KST'), +i(30600,0,'KST'), +i(32400,0,'KST'), +i(36000,3600,'KDT'), +i(32400,0,'KST'), +i(36000,3600,'KDT'), +i(32400,0,'KST'), + ] + +ROK = ROK() + diff --git a/vendor/pytz/zoneinfo/Singapore.py b/vendor/pytz/zoneinfo/Singapore.py new file mode 100644 index 00000000..a5780315 --- /dev/null +++ b/vendor/pytz/zoneinfo/Singapore.py @@ -0,0 +1,36 @@ +'''tzinfo timezone information for Singapore.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Singapore(DstTzInfo): + '''Singapore timezone definition. See datetime.tzinfo for details''' + + zone = 'Singapore' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,5,31,17,4,35), +d(1932,12,31,17,0,0), +d(1935,12,31,16,40,0), +d(1941,8,31,16,40,0), +d(1942,2,15,16,30,0), +d(1945,9,11,15,0,0), +d(1965,8,8,16,30,0), +d(1981,12,31,16,30,0), + ] + + _transition_info = [ +i(24900,0,'SMT'), +i(25200,0,'MALT'), +i(26400,1200,'MALST'), +i(26400,0,'MALT'), +i(27000,0,'MALT'), +i(32400,0,'JST'), +i(27000,0,'MALT'), +i(27000,0,'SGT'), +i(28800,0,'SGT'), + ] + +Singapore = Singapore() + diff --git a/vendor/pytz/zoneinfo/Turkey.py b/vendor/pytz/zoneinfo/Turkey.py new file mode 100644 index 00000000..70303e34 --- /dev/null +++ b/vendor/pytz/zoneinfo/Turkey.py @@ -0,0 +1,362 @@ +'''tzinfo timezone information for Turkey.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Turkey(DstTzInfo): + '''Turkey timezone definition. See datetime.tzinfo for details''' + + zone = 'Turkey' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1910,9,30,22,3,4), +d(1916,4,30,22,0,0), +d(1916,9,30,21,0,0), +d(1920,3,27,22,0,0), +d(1920,10,24,21,0,0), +d(1921,4,2,22,0,0), +d(1921,10,2,21,0,0), +d(1922,3,25,22,0,0), +d(1922,10,7,21,0,0), +d(1924,5,12,22,0,0), +d(1924,9,30,21,0,0), +d(1925,4,30,22,0,0), +d(1925,9,30,21,0,0), +d(1940,6,29,22,0,0), +d(1940,10,4,21,0,0), +d(1940,11,30,22,0,0), +d(1941,9,20,21,0,0), +d(1942,3,31,22,0,0), +d(1942,10,31,21,0,0), +d(1945,4,1,22,0,0), +d(1945,10,7,21,0,0), +d(1946,5,31,22,0,0), +d(1946,9,30,21,0,0), +d(1947,4,19,22,0,0), +d(1947,10,4,21,0,0), +d(1948,4,17,22,0,0), +d(1948,10,2,21,0,0), +d(1949,4,9,22,0,0), +d(1949,10,1,21,0,0), +d(1950,4,18,22,0,0), +d(1950,10,7,21,0,0), +d(1951,4,21,22,0,0), +d(1951,10,7,21,0,0), +d(1962,7,14,22,0,0), +d(1962,10,7,21,0,0), +d(1964,5,14,22,0,0), +d(1964,9,30,21,0,0), +d(1970,5,2,22,0,0), +d(1970,10,3,21,0,0), +d(1971,5,1,22,0,0), +d(1971,10,2,21,0,0), +d(1972,5,6,22,0,0), +d(1972,10,7,21,0,0), +d(1973,6,2,23,0,0), +d(1973,11,4,0,0,0), +d(1974,3,31,0,0,0), +d(1974,11,3,2,0,0), +d(1975,3,29,22,0,0), +d(1975,10,25,21,0,0), +d(1976,5,31,22,0,0), +d(1976,10,30,21,0,0), +d(1977,4,2,22,0,0), +d(1977,10,15,21,0,0), +d(1978,4,1,22,0,0), +d(1978,10,14,21,0,0), +d(1979,10,14,20,0,0), +d(1980,4,6,0,0,0), +d(1980,10,12,20,0,0), +d(1981,3,29,0,0,0), +d(1981,10,11,20,0,0), +d(1982,3,28,0,0,0), +d(1982,10,10,20,0,0), +d(1983,7,30,21,0,0), +d(1983,10,1,20,0,0), +d(1985,4,19,21,0,0), +d(1985,9,27,21,0,0), +d(1986,3,30,0,0,0), +d(1986,9,28,0,0,0), +d(1987,3,29,0,0,0), +d(1987,9,27,0,0,0), +d(1988,3,27,0,0,0), +d(1988,9,25,0,0,0), +d(1989,3,26,0,0,0), +d(1989,9,24,0,0,0), +d(1990,3,25,0,0,0), +d(1990,9,30,0,0,0), +d(1990,12,31,22,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(7020,0,'IMT'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(14400,7200,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(14400,3600,'TRST'), +i(10800,0,'TRT'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), +i(10800,3600,'EEST'), +i(7200,0,'EET'), + ] + +Turkey = Turkey() + diff --git a/vendor/pytz/zoneinfo/UCT.py b/vendor/pytz/zoneinfo/UCT.py new file mode 100644 index 00000000..1d62aff0 --- /dev/null +++ b/vendor/pytz/zoneinfo/UCT.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for UCT.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class UCT(StaticTzInfo): + '''UCT timezone definition. See datetime.tzinfo for details''' + zone = 'UCT' + _utcoffset = timedelta(seconds=0) + _tzname = 'UCT' + +UCT = UCT() + diff --git a/vendor/pytz/zoneinfo/US/Alaska.py b/vendor/pytz/zoneinfo/US/Alaska.py new file mode 100644 index 00000000..c004f981 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Alaska.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for US/Alaska.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Alaska(DstTzInfo): + '''US/Alaska timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Alaska' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,12,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,11,0,0), +d(1967,4,1,10,0,0), +d(1969,4,27,12,0,0), +d(1969,10,26,11,0,0), +d(1970,4,26,12,0,0), +d(1970,10,25,11,0,0), +d(1971,4,25,12,0,0), +d(1971,10,31,11,0,0), +d(1972,4,30,12,0,0), +d(1972,10,29,11,0,0), +d(1973,4,29,12,0,0), +d(1973,10,28,11,0,0), +d(1974,1,6,12,0,0), +d(1974,10,27,11,0,0), +d(1975,2,23,12,0,0), +d(1975,10,26,11,0,0), +d(1976,4,25,12,0,0), +d(1976,10,31,11,0,0), +d(1977,4,24,12,0,0), +d(1977,10,30,11,0,0), +d(1978,4,30,12,0,0), +d(1978,10,29,11,0,0), +d(1979,4,29,12,0,0), +d(1979,10,28,11,0,0), +d(1980,4,27,12,0,0), +d(1980,10,26,11,0,0), +d(1981,4,26,12,0,0), +d(1981,10,25,11,0,0), +d(1982,4,25,12,0,0), +d(1982,10,31,11,0,0), +d(1983,4,24,12,0,0), +d(1983,10,30,11,0,0), +d(1983,11,30,9,0,0), +d(1984,4,29,11,0,0), +d(1984,10,28,10,0,0), +d(1985,4,28,11,0,0), +d(1985,10,27,10,0,0), +d(1986,4,27,11,0,0), +d(1986,10,26,10,0,0), +d(1987,4,5,11,0,0), +d(1987,10,25,10,0,0), +d(1988,4,3,11,0,0), +d(1988,10,30,10,0,0), +d(1989,4,2,11,0,0), +d(1989,10,29,10,0,0), +d(1990,4,1,11,0,0), +d(1990,10,28,10,0,0), +d(1991,4,7,11,0,0), +d(1991,10,27,10,0,0), +d(1992,4,5,11,0,0), +d(1992,10,25,10,0,0), +d(1993,4,4,11,0,0), +d(1993,10,31,10,0,0), +d(1994,4,3,11,0,0), +d(1994,10,30,10,0,0), +d(1995,4,2,11,0,0), +d(1995,10,29,10,0,0), +d(1996,4,7,11,0,0), +d(1996,10,27,10,0,0), +d(1997,4,6,11,0,0), +d(1997,10,26,10,0,0), +d(1998,4,5,11,0,0), +d(1998,10,25,10,0,0), +d(1999,4,4,11,0,0), +d(1999,10,31,10,0,0), +d(2000,4,2,11,0,0), +d(2000,10,29,10,0,0), +d(2001,4,1,11,0,0), +d(2001,10,28,10,0,0), +d(2002,4,7,11,0,0), +d(2002,10,27,10,0,0), +d(2003,4,6,11,0,0), +d(2003,10,26,10,0,0), +d(2004,4,4,11,0,0), +d(2004,10,31,10,0,0), +d(2005,4,3,11,0,0), +d(2005,10,30,10,0,0), +d(2006,4,2,11,0,0), +d(2006,10,29,10,0,0), +d(2007,3,11,11,0,0), +d(2007,11,4,10,0,0), +d(2008,3,9,11,0,0), +d(2008,11,2,10,0,0), +d(2009,3,8,11,0,0), +d(2009,11,1,10,0,0), +d(2010,3,14,11,0,0), +d(2010,11,7,10,0,0), +d(2011,3,13,11,0,0), +d(2011,11,6,10,0,0), +d(2012,3,11,11,0,0), +d(2012,11,4,10,0,0), +d(2013,3,10,11,0,0), +d(2013,11,3,10,0,0), +d(2014,3,9,11,0,0), +d(2014,11,2,10,0,0), +d(2015,3,8,11,0,0), +d(2015,11,1,10,0,0), +d(2016,3,13,11,0,0), +d(2016,11,6,10,0,0), +d(2017,3,12,11,0,0), +d(2017,11,5,10,0,0), +d(2018,3,11,11,0,0), +d(2018,11,4,10,0,0), +d(2019,3,10,11,0,0), +d(2019,11,3,10,0,0), +d(2020,3,8,11,0,0), +d(2020,11,1,10,0,0), +d(2021,3,14,11,0,0), +d(2021,11,7,10,0,0), +d(2022,3,13,11,0,0), +d(2022,11,6,10,0,0), +d(2023,3,12,11,0,0), +d(2023,11,5,10,0,0), +d(2024,3,10,11,0,0), +d(2024,11,3,10,0,0), +d(2025,3,9,11,0,0), +d(2025,11,2,10,0,0), +d(2026,3,8,11,0,0), +d(2026,11,1,10,0,0), +d(2027,3,14,11,0,0), +d(2027,11,7,10,0,0), +d(2028,3,12,11,0,0), +d(2028,11,5,10,0,0), +d(2029,3,11,11,0,0), +d(2029,11,4,10,0,0), +d(2030,3,10,11,0,0), +d(2030,11,3,10,0,0), +d(2031,3,9,11,0,0), +d(2031,11,2,10,0,0), +d(2032,3,14,11,0,0), +d(2032,11,7,10,0,0), +d(2033,3,13,11,0,0), +d(2033,11,6,10,0,0), +d(2034,3,12,11,0,0), +d(2034,11,5,10,0,0), +d(2035,3,11,11,0,0), +d(2035,11,4,10,0,0), +d(2036,3,9,11,0,0), +d(2036,11,2,10,0,0), +d(2037,3,8,11,0,0), +d(2037,11,1,10,0,0), + ] + + _transition_info = [ +i(-36000,0,'CAT'), +i(-32400,3600,'CAWT'), +i(-32400,3600,'CAPT'), +i(-36000,0,'CAT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-36000,0,'AHST'), +i(-32400,3600,'AHDT'), +i(-32400,0,'YST'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), +i(-28800,3600,'AKDT'), +i(-32400,0,'AKST'), + ] + +Alaska = Alaska() + diff --git a/vendor/pytz/zoneinfo/US/Aleutian.py b/vendor/pytz/zoneinfo/US/Aleutian.py new file mode 100644 index 00000000..64f7fdc0 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Aleutian.py @@ -0,0 +1,306 @@ +'''tzinfo timezone information for US/Aleutian.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Aleutian(DstTzInfo): + '''US/Aleutian timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Aleutian' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1942,2,9,13,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,12,0,0), +d(1967,4,1,11,0,0), +d(1969,4,27,13,0,0), +d(1969,10,26,12,0,0), +d(1970,4,26,13,0,0), +d(1970,10,25,12,0,0), +d(1971,4,25,13,0,0), +d(1971,10,31,12,0,0), +d(1972,4,30,13,0,0), +d(1972,10,29,12,0,0), +d(1973,4,29,13,0,0), +d(1973,10,28,12,0,0), +d(1974,1,6,13,0,0), +d(1974,10,27,12,0,0), +d(1975,2,23,13,0,0), +d(1975,10,26,12,0,0), +d(1976,4,25,13,0,0), +d(1976,10,31,12,0,0), +d(1977,4,24,13,0,0), +d(1977,10,30,12,0,0), +d(1978,4,30,13,0,0), +d(1978,10,29,12,0,0), +d(1979,4,29,13,0,0), +d(1979,10,28,12,0,0), +d(1980,4,27,13,0,0), +d(1980,10,26,12,0,0), +d(1981,4,26,13,0,0), +d(1981,10,25,12,0,0), +d(1982,4,25,13,0,0), +d(1982,10,31,12,0,0), +d(1983,4,24,13,0,0), +d(1983,10,30,12,0,0), +d(1983,11,30,10,0,0), +d(1984,4,29,12,0,0), +d(1984,10,28,11,0,0), +d(1985,4,28,12,0,0), +d(1985,10,27,11,0,0), +d(1986,4,27,12,0,0), +d(1986,10,26,11,0,0), +d(1987,4,5,12,0,0), +d(1987,10,25,11,0,0), +d(1988,4,3,12,0,0), +d(1988,10,30,11,0,0), +d(1989,4,2,12,0,0), +d(1989,10,29,11,0,0), +d(1990,4,1,12,0,0), +d(1990,10,28,11,0,0), +d(1991,4,7,12,0,0), +d(1991,10,27,11,0,0), +d(1992,4,5,12,0,0), +d(1992,10,25,11,0,0), +d(1993,4,4,12,0,0), +d(1993,10,31,11,0,0), +d(1994,4,3,12,0,0), +d(1994,10,30,11,0,0), +d(1995,4,2,12,0,0), +d(1995,10,29,11,0,0), +d(1996,4,7,12,0,0), +d(1996,10,27,11,0,0), +d(1997,4,6,12,0,0), +d(1997,10,26,11,0,0), +d(1998,4,5,12,0,0), +d(1998,10,25,11,0,0), +d(1999,4,4,12,0,0), +d(1999,10,31,11,0,0), +d(2000,4,2,12,0,0), +d(2000,10,29,11,0,0), +d(2001,4,1,12,0,0), +d(2001,10,28,11,0,0), +d(2002,4,7,12,0,0), +d(2002,10,27,11,0,0), +d(2003,4,6,12,0,0), +d(2003,10,26,11,0,0), +d(2004,4,4,12,0,0), +d(2004,10,31,11,0,0), +d(2005,4,3,12,0,0), +d(2005,10,30,11,0,0), +d(2006,4,2,12,0,0), +d(2006,10,29,11,0,0), +d(2007,3,11,12,0,0), +d(2007,11,4,11,0,0), +d(2008,3,9,12,0,0), +d(2008,11,2,11,0,0), +d(2009,3,8,12,0,0), +d(2009,11,1,11,0,0), +d(2010,3,14,12,0,0), +d(2010,11,7,11,0,0), +d(2011,3,13,12,0,0), +d(2011,11,6,11,0,0), +d(2012,3,11,12,0,0), +d(2012,11,4,11,0,0), +d(2013,3,10,12,0,0), +d(2013,11,3,11,0,0), +d(2014,3,9,12,0,0), +d(2014,11,2,11,0,0), +d(2015,3,8,12,0,0), +d(2015,11,1,11,0,0), +d(2016,3,13,12,0,0), +d(2016,11,6,11,0,0), +d(2017,3,12,12,0,0), +d(2017,11,5,11,0,0), +d(2018,3,11,12,0,0), +d(2018,11,4,11,0,0), +d(2019,3,10,12,0,0), +d(2019,11,3,11,0,0), +d(2020,3,8,12,0,0), +d(2020,11,1,11,0,0), +d(2021,3,14,12,0,0), +d(2021,11,7,11,0,0), +d(2022,3,13,12,0,0), +d(2022,11,6,11,0,0), +d(2023,3,12,12,0,0), +d(2023,11,5,11,0,0), +d(2024,3,10,12,0,0), +d(2024,11,3,11,0,0), +d(2025,3,9,12,0,0), +d(2025,11,2,11,0,0), +d(2026,3,8,12,0,0), +d(2026,11,1,11,0,0), +d(2027,3,14,12,0,0), +d(2027,11,7,11,0,0), +d(2028,3,12,12,0,0), +d(2028,11,5,11,0,0), +d(2029,3,11,12,0,0), +d(2029,11,4,11,0,0), +d(2030,3,10,12,0,0), +d(2030,11,3,11,0,0), +d(2031,3,9,12,0,0), +d(2031,11,2,11,0,0), +d(2032,3,14,12,0,0), +d(2032,11,7,11,0,0), +d(2033,3,13,12,0,0), +d(2033,11,6,11,0,0), +d(2034,3,12,12,0,0), +d(2034,11,5,11,0,0), +d(2035,3,11,12,0,0), +d(2035,11,4,11,0,0), +d(2036,3,9,12,0,0), +d(2036,11,2,11,0,0), +d(2037,3,8,12,0,0), +d(2037,11,1,11,0,0), + ] + + _transition_info = [ +i(-39600,0,'NST'), +i(-36000,3600,'NWT'), +i(-36000,3600,'NPT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-39600,0,'BST'), +i(-36000,3600,'BDT'), +i(-36000,0,'AHST'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), +i(-32400,3600,'HADT'), +i(-36000,0,'HAST'), + ] + +Aleutian = Aleutian() + diff --git a/vendor/pytz/zoneinfo/US/Arizona.py b/vendor/pytz/zoneinfo/US/Arizona.py new file mode 100644 index 00000000..d4ffa5a7 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Arizona.py @@ -0,0 +1,40 @@ +'''tzinfo timezone information for US/Arizona.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Arizona(DstTzInfo): + '''US/Arizona timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Arizona' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1942,2,9,9,0,0), +d(1944,1,1,6,1,0), +d(1944,4,1,7,1,0), +d(1944,10,1,6,1,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Arizona = Arizona() + diff --git a/vendor/pytz/zoneinfo/US/Central.py b/vendor/pytz/zoneinfo/US/Central.py new file mode 100644 index 00000000..b7776bef --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Central.py @@ -0,0 +1,490 @@ +'''tzinfo timezone information for US/Central.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Central(DstTzInfo): + '''US/Central timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Central' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1920,6,13,8,0,0), +d(1920,10,31,7,0,0), +d(1921,3,27,8,0,0), +d(1921,10,30,7,0,0), +d(1922,4,30,8,0,0), +d(1922,9,24,7,0,0), +d(1923,4,29,8,0,0), +d(1923,9,30,7,0,0), +d(1924,4,27,8,0,0), +d(1924,9,28,7,0,0), +d(1925,4,26,8,0,0), +d(1925,9,27,7,0,0), +d(1926,4,25,8,0,0), +d(1926,9,26,7,0,0), +d(1927,4,24,8,0,0), +d(1927,9,25,7,0,0), +d(1928,4,29,8,0,0), +d(1928,9,30,7,0,0), +d(1929,4,28,8,0,0), +d(1929,9,29,7,0,0), +d(1930,4,27,8,0,0), +d(1930,9,28,7,0,0), +d(1931,4,26,8,0,0), +d(1931,9,27,7,0,0), +d(1932,4,24,8,0,0), +d(1932,9,25,7,0,0), +d(1933,4,30,8,0,0), +d(1933,9,24,7,0,0), +d(1934,4,29,8,0,0), +d(1934,9,30,7,0,0), +d(1935,4,28,8,0,0), +d(1935,9,29,7,0,0), +d(1936,3,1,8,0,0), +d(1936,11,15,7,0,0), +d(1937,4,25,8,0,0), +d(1937,9,26,7,0,0), +d(1938,4,24,8,0,0), +d(1938,9,25,7,0,0), +d(1939,4,30,8,0,0), +d(1939,9,24,7,0,0), +d(1940,4,28,8,0,0), +d(1940,9,29,7,0,0), +d(1941,4,27,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,10,30,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,10,27,7,0,0), +d(1958,4,27,8,0,0), +d(1958,10,26,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1962,10,28,7,0,0), +d(1963,4,28,8,0,0), +d(1963,10,27,7,0,0), +d(1964,4,26,8,0,0), +d(1964,10,25,7,0,0), +d(1965,4,25,8,0,0), +d(1965,10,31,7,0,0), +d(1966,4,24,8,0,0), +d(1966,10,30,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(1992,4,5,8,0,0), +d(1992,10,25,7,0,0), +d(1993,4,4,8,0,0), +d(1993,10,31,7,0,0), +d(1994,4,3,8,0,0), +d(1994,10,30,7,0,0), +d(1995,4,2,8,0,0), +d(1995,10,29,7,0,0), +d(1996,4,7,8,0,0), +d(1996,10,27,7,0,0), +d(1997,4,6,8,0,0), +d(1997,10,26,7,0,0), +d(1998,4,5,8,0,0), +d(1998,10,25,7,0,0), +d(1999,4,4,8,0,0), +d(1999,10,31,7,0,0), +d(2000,4,2,8,0,0), +d(2000,10,29,7,0,0), +d(2001,4,1,8,0,0), +d(2001,10,28,7,0,0), +d(2002,4,7,8,0,0), +d(2002,10,27,7,0,0), +d(2003,4,6,8,0,0), +d(2003,10,26,7,0,0), +d(2004,4,4,8,0,0), +d(2004,10,31,7,0,0), +d(2005,4,3,8,0,0), +d(2005,10,30,7,0,0), +d(2006,4,2,8,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Central = Central() + diff --git a/vendor/pytz/zoneinfo/US/East_minus_Indiana.py b/vendor/pytz/zoneinfo/US/East_minus_Indiana.py new file mode 100644 index 00000000..f1d6c37d --- /dev/null +++ b/vendor/pytz/zoneinfo/US/East_minus_Indiana.py @@ -0,0 +1,216 @@ +'''tzinfo timezone information for US/East_minus_Indiana.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class East_minus_Indiana(DstTzInfo): + '''US/East_minus_Indiana timezone definition. See datetime.tzinfo for details''' + + zone = 'US/East_minus_Indiana' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1941,6,22,8,0,0), +d(1941,9,28,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1946,4,28,8,0,0), +d(1946,9,29,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +East_minus_Indiana = East_minus_Indiana() + diff --git a/vendor/pytz/zoneinfo/US/Eastern.py b/vendor/pytz/zoneinfo/US/Eastern.py new file mode 100644 index 00000000..7399d286 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Eastern.py @@ -0,0 +1,490 @@ +'''tzinfo timezone information for US/Eastern.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Eastern(DstTzInfo): + '''US/Eastern timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Eastern' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,7,0,0), +d(1918,10,27,6,0,0), +d(1919,3,30,7,0,0), +d(1919,10,26,6,0,0), +d(1920,3,28,7,0,0), +d(1920,10,31,6,0,0), +d(1921,4,24,7,0,0), +d(1921,9,25,6,0,0), +d(1922,4,30,7,0,0), +d(1922,9,24,6,0,0), +d(1923,4,29,7,0,0), +d(1923,9,30,6,0,0), +d(1924,4,27,7,0,0), +d(1924,9,28,6,0,0), +d(1925,4,26,7,0,0), +d(1925,9,27,6,0,0), +d(1926,4,25,7,0,0), +d(1926,9,26,6,0,0), +d(1927,4,24,7,0,0), +d(1927,9,25,6,0,0), +d(1928,4,29,7,0,0), +d(1928,9,30,6,0,0), +d(1929,4,28,7,0,0), +d(1929,9,29,6,0,0), +d(1930,4,27,7,0,0), +d(1930,9,28,6,0,0), +d(1931,4,26,7,0,0), +d(1931,9,27,6,0,0), +d(1932,4,24,7,0,0), +d(1932,9,25,6,0,0), +d(1933,4,30,7,0,0), +d(1933,9,24,6,0,0), +d(1934,4,29,7,0,0), +d(1934,9,30,6,0,0), +d(1935,4,28,7,0,0), +d(1935,9,29,6,0,0), +d(1936,4,26,7,0,0), +d(1936,9,27,6,0,0), +d(1937,4,25,7,0,0), +d(1937,9,26,6,0,0), +d(1938,4,24,7,0,0), +d(1938,9,25,6,0,0), +d(1939,4,30,7,0,0), +d(1939,9,24,6,0,0), +d(1940,4,28,7,0,0), +d(1940,9,29,6,0,0), +d(1941,4,27,7,0,0), +d(1941,9,28,6,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,7,0,0), +d(1947,9,28,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1949,4,24,7,0,0), +d(1949,9,25,6,0,0), +d(1950,4,30,7,0,0), +d(1950,9,24,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,10,30,6,0,0), +d(1956,4,29,7,0,0), +d(1956,10,28,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Eastern = Eastern() + diff --git a/vendor/pytz/zoneinfo/US/Hawaii.py b/vendor/pytz/zoneinfo/US/Hawaii.py new file mode 100644 index 00000000..626ac1bb --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Hawaii.py @@ -0,0 +1,32 @@ +'''tzinfo timezone information for US/Hawaii.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Hawaii(DstTzInfo): + '''US/Hawaii timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Hawaii' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1933,4,30,12,30,0), +d(1933,5,21,11,30,0), +d(1942,2,9,12,30,0), +d(1945,8,14,23,0,0), +d(1945,9,30,11,30,0), +d(1947,6,8,12,30,0), + ] + + _transition_info = [ +i(-37800,0,'HST'), +i(-34200,3600,'HDT'), +i(-37800,0,'HST'), +i(-34200,3600,'HWT'), +i(-34200,3600,'HPT'), +i(-37800,0,'HST'), +i(-36000,0,'HST'), + ] + +Hawaii = Hawaii() + diff --git a/vendor/pytz/zoneinfo/US/Indiana_minus_Starke.py b/vendor/pytz/zoneinfo/US/Indiana_minus_Starke.py new file mode 100644 index 00000000..76464431 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Indiana_minus_Starke.py @@ -0,0 +1,326 @@ +'''tzinfo timezone information for US/Indiana_minus_Starke.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Indiana_minus_Starke(DstTzInfo): + '''US/Indiana_minus_Starke timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Indiana_minus_Starke' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,8,0,0), +d(1918,10,27,7,0,0), +d(1919,3,30,8,0,0), +d(1919,10,26,7,0,0), +d(1942,2,9,8,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,7,0,0), +d(1947,4,27,8,0,0), +d(1947,9,28,7,0,0), +d(1948,4,25,8,0,0), +d(1948,9,26,7,0,0), +d(1949,4,24,8,0,0), +d(1949,9,25,7,0,0), +d(1950,4,30,8,0,0), +d(1950,9,24,7,0,0), +d(1951,4,29,8,0,0), +d(1951,9,30,7,0,0), +d(1952,4,27,8,0,0), +d(1952,9,28,7,0,0), +d(1953,4,26,8,0,0), +d(1953,9,27,7,0,0), +d(1954,4,25,8,0,0), +d(1954,9,26,7,0,0), +d(1955,4,24,8,0,0), +d(1955,10,30,7,0,0), +d(1956,4,29,8,0,0), +d(1956,10,28,7,0,0), +d(1957,4,28,8,0,0), +d(1957,9,29,7,0,0), +d(1958,4,27,8,0,0), +d(1958,9,28,7,0,0), +d(1959,4,26,8,0,0), +d(1959,10,25,7,0,0), +d(1960,4,24,8,0,0), +d(1960,10,30,7,0,0), +d(1961,4,30,8,0,0), +d(1961,10,29,7,0,0), +d(1962,4,29,8,0,0), +d(1963,10,27,7,0,0), +d(1967,4,30,8,0,0), +d(1967,10,29,7,0,0), +d(1968,4,28,8,0,0), +d(1968,10,27,7,0,0), +d(1969,4,27,8,0,0), +d(1969,10,26,7,0,0), +d(1970,4,26,8,0,0), +d(1970,10,25,7,0,0), +d(1971,4,25,8,0,0), +d(1971,10,31,7,0,0), +d(1972,4,30,8,0,0), +d(1972,10,29,7,0,0), +d(1973,4,29,8,0,0), +d(1973,10,28,7,0,0), +d(1974,1,6,8,0,0), +d(1974,10,27,7,0,0), +d(1975,2,23,8,0,0), +d(1975,10,26,7,0,0), +d(1976,4,25,8,0,0), +d(1976,10,31,7,0,0), +d(1977,4,24,8,0,0), +d(1977,10,30,7,0,0), +d(1978,4,30,8,0,0), +d(1978,10,29,7,0,0), +d(1979,4,29,8,0,0), +d(1979,10,28,7,0,0), +d(1980,4,27,8,0,0), +d(1980,10,26,7,0,0), +d(1981,4,26,8,0,0), +d(1981,10,25,7,0,0), +d(1982,4,25,8,0,0), +d(1982,10,31,7,0,0), +d(1983,4,24,8,0,0), +d(1983,10,30,7,0,0), +d(1984,4,29,8,0,0), +d(1984,10,28,7,0,0), +d(1985,4,28,8,0,0), +d(1985,10,27,7,0,0), +d(1986,4,27,8,0,0), +d(1986,10,26,7,0,0), +d(1987,4,5,8,0,0), +d(1987,10,25,7,0,0), +d(1988,4,3,8,0,0), +d(1988,10,30,7,0,0), +d(1989,4,2,8,0,0), +d(1989,10,29,7,0,0), +d(1990,4,1,8,0,0), +d(1990,10,28,7,0,0), +d(1991,4,7,8,0,0), +d(1991,10,27,7,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,7,0,0), +d(2007,3,11,8,0,0), +d(2007,11,4,7,0,0), +d(2008,3,9,8,0,0), +d(2008,11,2,7,0,0), +d(2009,3,8,8,0,0), +d(2009,11,1,7,0,0), +d(2010,3,14,8,0,0), +d(2010,11,7,7,0,0), +d(2011,3,13,8,0,0), +d(2011,11,6,7,0,0), +d(2012,3,11,8,0,0), +d(2012,11,4,7,0,0), +d(2013,3,10,8,0,0), +d(2013,11,3,7,0,0), +d(2014,3,9,8,0,0), +d(2014,11,2,7,0,0), +d(2015,3,8,8,0,0), +d(2015,11,1,7,0,0), +d(2016,3,13,8,0,0), +d(2016,11,6,7,0,0), +d(2017,3,12,8,0,0), +d(2017,11,5,7,0,0), +d(2018,3,11,8,0,0), +d(2018,11,4,7,0,0), +d(2019,3,10,8,0,0), +d(2019,11,3,7,0,0), +d(2020,3,8,8,0,0), +d(2020,11,1,7,0,0), +d(2021,3,14,8,0,0), +d(2021,11,7,7,0,0), +d(2022,3,13,8,0,0), +d(2022,11,6,7,0,0), +d(2023,3,12,8,0,0), +d(2023,11,5,7,0,0), +d(2024,3,10,8,0,0), +d(2024,11,3,7,0,0), +d(2025,3,9,8,0,0), +d(2025,11,2,7,0,0), +d(2026,3,8,8,0,0), +d(2026,11,1,7,0,0), +d(2027,3,14,8,0,0), +d(2027,11,7,7,0,0), +d(2028,3,12,8,0,0), +d(2028,11,5,7,0,0), +d(2029,3,11,8,0,0), +d(2029,11,4,7,0,0), +d(2030,3,10,8,0,0), +d(2030,11,3,7,0,0), +d(2031,3,9,8,0,0), +d(2031,11,2,7,0,0), +d(2032,3,14,8,0,0), +d(2032,11,7,7,0,0), +d(2033,3,13,8,0,0), +d(2033,11,6,7,0,0), +d(2034,3,12,8,0,0), +d(2034,11,5,7,0,0), +d(2035,3,11,8,0,0), +d(2035,11,4,7,0,0), +d(2036,3,9,8,0,0), +d(2036,11,2,7,0,0), +d(2037,3,8,8,0,0), +d(2037,11,1,7,0,0), + ] + + _transition_info = [ +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CWT'), +i(-18000,3600,'CPT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-18000,0,'EST'), +i(-18000,0,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), +i(-18000,3600,'CDT'), +i(-21600,0,'CST'), + ] + +Indiana_minus_Starke = Indiana_minus_Starke() + diff --git a/vendor/pytz/zoneinfo/US/Michigan.py b/vendor/pytz/zoneinfo/US/Michigan.py new file mode 100644 index 00000000..e4126b52 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Michigan.py @@ -0,0 +1,298 @@ +'''tzinfo timezone information for US/Michigan.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Michigan(DstTzInfo): + '''US/Michigan timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Michigan' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1905,1,1,5,32,11), +d(1915,5,15,8,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1967,6,14,7,0,0), +d(1967,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,4,27,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-19920,0,'LMT'), +i(-21600,0,'CST'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +Michigan = Michigan() + diff --git a/vendor/pytz/zoneinfo/US/Mountain.py b/vendor/pytz/zoneinfo/US/Mountain.py new file mode 100644 index 00000000..ab6b1b68 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Mountain.py @@ -0,0 +1,334 @@ +'''tzinfo timezone information for US/Mountain.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Mountain(DstTzInfo): + '''US/Mountain timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Mountain' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,9,0,0), +d(1918,10,27,8,0,0), +d(1919,3,30,9,0,0), +d(1919,10,26,8,0,0), +d(1920,3,28,9,0,0), +d(1920,10,31,8,0,0), +d(1921,3,27,9,0,0), +d(1921,5,22,8,0,0), +d(1942,2,9,9,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,8,0,0), +d(1965,4,25,9,0,0), +d(1965,10,31,8,0,0), +d(1966,4,24,9,0,0), +d(1966,10,30,8,0,0), +d(1967,4,30,9,0,0), +d(1967,10,29,8,0,0), +d(1968,4,28,9,0,0), +d(1968,10,27,8,0,0), +d(1969,4,27,9,0,0), +d(1969,10,26,8,0,0), +d(1970,4,26,9,0,0), +d(1970,10,25,8,0,0), +d(1971,4,25,9,0,0), +d(1971,10,31,8,0,0), +d(1972,4,30,9,0,0), +d(1972,10,29,8,0,0), +d(1973,4,29,9,0,0), +d(1973,10,28,8,0,0), +d(1974,1,6,9,0,0), +d(1974,10,27,8,0,0), +d(1975,2,23,9,0,0), +d(1975,10,26,8,0,0), +d(1976,4,25,9,0,0), +d(1976,10,31,8,0,0), +d(1977,4,24,9,0,0), +d(1977,10,30,8,0,0), +d(1978,4,30,9,0,0), +d(1978,10,29,8,0,0), +d(1979,4,29,9,0,0), +d(1979,10,28,8,0,0), +d(1980,4,27,9,0,0), +d(1980,10,26,8,0,0), +d(1981,4,26,9,0,0), +d(1981,10,25,8,0,0), +d(1982,4,25,9,0,0), +d(1982,10,31,8,0,0), +d(1983,4,24,9,0,0), +d(1983,10,30,8,0,0), +d(1984,4,29,9,0,0), +d(1984,10,28,8,0,0), +d(1985,4,28,9,0,0), +d(1985,10,27,8,0,0), +d(1986,4,27,9,0,0), +d(1986,10,26,8,0,0), +d(1987,4,5,9,0,0), +d(1987,10,25,8,0,0), +d(1988,4,3,9,0,0), +d(1988,10,30,8,0,0), +d(1989,4,2,9,0,0), +d(1989,10,29,8,0,0), +d(1990,4,1,9,0,0), +d(1990,10,28,8,0,0), +d(1991,4,7,9,0,0), +d(1991,10,27,8,0,0), +d(1992,4,5,9,0,0), +d(1992,10,25,8,0,0), +d(1993,4,4,9,0,0), +d(1993,10,31,8,0,0), +d(1994,4,3,9,0,0), +d(1994,10,30,8,0,0), +d(1995,4,2,9,0,0), +d(1995,10,29,8,0,0), +d(1996,4,7,9,0,0), +d(1996,10,27,8,0,0), +d(1997,4,6,9,0,0), +d(1997,10,26,8,0,0), +d(1998,4,5,9,0,0), +d(1998,10,25,8,0,0), +d(1999,4,4,9,0,0), +d(1999,10,31,8,0,0), +d(2000,4,2,9,0,0), +d(2000,10,29,8,0,0), +d(2001,4,1,9,0,0), +d(2001,10,28,8,0,0), +d(2002,4,7,9,0,0), +d(2002,10,27,8,0,0), +d(2003,4,6,9,0,0), +d(2003,10,26,8,0,0), +d(2004,4,4,9,0,0), +d(2004,10,31,8,0,0), +d(2005,4,3,9,0,0), +d(2005,10,30,8,0,0), +d(2006,4,2,9,0,0), +d(2006,10,29,8,0,0), +d(2007,3,11,9,0,0), +d(2007,11,4,8,0,0), +d(2008,3,9,9,0,0), +d(2008,11,2,8,0,0), +d(2009,3,8,9,0,0), +d(2009,11,1,8,0,0), +d(2010,3,14,9,0,0), +d(2010,11,7,8,0,0), +d(2011,3,13,9,0,0), +d(2011,11,6,8,0,0), +d(2012,3,11,9,0,0), +d(2012,11,4,8,0,0), +d(2013,3,10,9,0,0), +d(2013,11,3,8,0,0), +d(2014,3,9,9,0,0), +d(2014,11,2,8,0,0), +d(2015,3,8,9,0,0), +d(2015,11,1,8,0,0), +d(2016,3,13,9,0,0), +d(2016,11,6,8,0,0), +d(2017,3,12,9,0,0), +d(2017,11,5,8,0,0), +d(2018,3,11,9,0,0), +d(2018,11,4,8,0,0), +d(2019,3,10,9,0,0), +d(2019,11,3,8,0,0), +d(2020,3,8,9,0,0), +d(2020,11,1,8,0,0), +d(2021,3,14,9,0,0), +d(2021,11,7,8,0,0), +d(2022,3,13,9,0,0), +d(2022,11,6,8,0,0), +d(2023,3,12,9,0,0), +d(2023,11,5,8,0,0), +d(2024,3,10,9,0,0), +d(2024,11,3,8,0,0), +d(2025,3,9,9,0,0), +d(2025,11,2,8,0,0), +d(2026,3,8,9,0,0), +d(2026,11,1,8,0,0), +d(2027,3,14,9,0,0), +d(2027,11,7,8,0,0), +d(2028,3,12,9,0,0), +d(2028,11,5,8,0,0), +d(2029,3,11,9,0,0), +d(2029,11,4,8,0,0), +d(2030,3,10,9,0,0), +d(2030,11,3,8,0,0), +d(2031,3,9,9,0,0), +d(2031,11,2,8,0,0), +d(2032,3,14,9,0,0), +d(2032,11,7,8,0,0), +d(2033,3,13,9,0,0), +d(2033,11,6,8,0,0), +d(2034,3,12,9,0,0), +d(2034,11,5,8,0,0), +d(2035,3,11,9,0,0), +d(2035,11,4,8,0,0), +d(2036,3,9,9,0,0), +d(2036,11,2,8,0,0), +d(2037,3,8,9,0,0), +d(2037,11,1,8,0,0), + ] + + _transition_info = [ +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MWT'), +i(-21600,3600,'MPT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), +i(-21600,3600,'MDT'), +i(-25200,0,'MST'), + ] + +Mountain = Mountain() + diff --git a/vendor/pytz/zoneinfo/US/Pacific.py b/vendor/pytz/zoneinfo/US/Pacific.py new file mode 100644 index 00000000..f41984bd --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Pacific.py @@ -0,0 +1,390 @@ +'''tzinfo timezone information for US/Pacific.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pacific(DstTzInfo): + '''US/Pacific timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Pacific' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,10,0,0), +d(1918,10,27,9,0,0), +d(1919,3,30,10,0,0), +d(1919,10,26,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1948,3,14,10,0,0), +d(1949,1,1,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,1,6,10,0,0), +d(1974,10,27,9,0,0), +d(1975,2,23,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Pacific = Pacific() + diff --git a/vendor/pytz/zoneinfo/US/Pacific_minus_New.py b/vendor/pytz/zoneinfo/US/Pacific_minus_New.py new file mode 100644 index 00000000..38c25efe --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Pacific_minus_New.py @@ -0,0 +1,390 @@ +'''tzinfo timezone information for US/Pacific_minus_New.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Pacific_minus_New(DstTzInfo): + '''US/Pacific_minus_New timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Pacific_minus_New' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,10,0,0), +d(1918,10,27,9,0,0), +d(1919,3,30,10,0,0), +d(1919,10,26,9,0,0), +d(1942,2,9,10,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,9,0,0), +d(1948,3,14,10,0,0), +d(1949,1,1,9,0,0), +d(1950,4,30,10,0,0), +d(1950,9,24,9,0,0), +d(1951,4,29,10,0,0), +d(1951,9,30,9,0,0), +d(1952,4,27,10,0,0), +d(1952,9,28,9,0,0), +d(1953,4,26,10,0,0), +d(1953,9,27,9,0,0), +d(1954,4,25,10,0,0), +d(1954,9,26,9,0,0), +d(1955,4,24,10,0,0), +d(1955,9,25,9,0,0), +d(1956,4,29,10,0,0), +d(1956,9,30,9,0,0), +d(1957,4,28,10,0,0), +d(1957,9,29,9,0,0), +d(1958,4,27,10,0,0), +d(1958,9,28,9,0,0), +d(1959,4,26,10,0,0), +d(1959,9,27,9,0,0), +d(1960,4,24,10,0,0), +d(1960,9,25,9,0,0), +d(1961,4,30,10,0,0), +d(1961,9,24,9,0,0), +d(1962,4,29,10,0,0), +d(1962,10,28,9,0,0), +d(1963,4,28,10,0,0), +d(1963,10,27,9,0,0), +d(1964,4,26,10,0,0), +d(1964,10,25,9,0,0), +d(1965,4,25,10,0,0), +d(1965,10,31,9,0,0), +d(1966,4,24,10,0,0), +d(1966,10,30,9,0,0), +d(1967,4,30,10,0,0), +d(1967,10,29,9,0,0), +d(1968,4,28,10,0,0), +d(1968,10,27,9,0,0), +d(1969,4,27,10,0,0), +d(1969,10,26,9,0,0), +d(1970,4,26,10,0,0), +d(1970,10,25,9,0,0), +d(1971,4,25,10,0,0), +d(1971,10,31,9,0,0), +d(1972,4,30,10,0,0), +d(1972,10,29,9,0,0), +d(1973,4,29,10,0,0), +d(1973,10,28,9,0,0), +d(1974,1,6,10,0,0), +d(1974,10,27,9,0,0), +d(1975,2,23,10,0,0), +d(1975,10,26,9,0,0), +d(1976,4,25,10,0,0), +d(1976,10,31,9,0,0), +d(1977,4,24,10,0,0), +d(1977,10,30,9,0,0), +d(1978,4,30,10,0,0), +d(1978,10,29,9,0,0), +d(1979,4,29,10,0,0), +d(1979,10,28,9,0,0), +d(1980,4,27,10,0,0), +d(1980,10,26,9,0,0), +d(1981,4,26,10,0,0), +d(1981,10,25,9,0,0), +d(1982,4,25,10,0,0), +d(1982,10,31,9,0,0), +d(1983,4,24,10,0,0), +d(1983,10,30,9,0,0), +d(1984,4,29,10,0,0), +d(1984,10,28,9,0,0), +d(1985,4,28,10,0,0), +d(1985,10,27,9,0,0), +d(1986,4,27,10,0,0), +d(1986,10,26,9,0,0), +d(1987,4,5,10,0,0), +d(1987,10,25,9,0,0), +d(1988,4,3,10,0,0), +d(1988,10,30,9,0,0), +d(1989,4,2,10,0,0), +d(1989,10,29,9,0,0), +d(1990,4,1,10,0,0), +d(1990,10,28,9,0,0), +d(1991,4,7,10,0,0), +d(1991,10,27,9,0,0), +d(1992,4,5,10,0,0), +d(1992,10,25,9,0,0), +d(1993,4,4,10,0,0), +d(1993,10,31,9,0,0), +d(1994,4,3,10,0,0), +d(1994,10,30,9,0,0), +d(1995,4,2,10,0,0), +d(1995,10,29,9,0,0), +d(1996,4,7,10,0,0), +d(1996,10,27,9,0,0), +d(1997,4,6,10,0,0), +d(1997,10,26,9,0,0), +d(1998,4,5,10,0,0), +d(1998,10,25,9,0,0), +d(1999,4,4,10,0,0), +d(1999,10,31,9,0,0), +d(2000,4,2,10,0,0), +d(2000,10,29,9,0,0), +d(2001,4,1,10,0,0), +d(2001,10,28,9,0,0), +d(2002,4,7,10,0,0), +d(2002,10,27,9,0,0), +d(2003,4,6,10,0,0), +d(2003,10,26,9,0,0), +d(2004,4,4,10,0,0), +d(2004,10,31,9,0,0), +d(2005,4,3,10,0,0), +d(2005,10,30,9,0,0), +d(2006,4,2,10,0,0), +d(2006,10,29,9,0,0), +d(2007,3,11,10,0,0), +d(2007,11,4,9,0,0), +d(2008,3,9,10,0,0), +d(2008,11,2,9,0,0), +d(2009,3,8,10,0,0), +d(2009,11,1,9,0,0), +d(2010,3,14,10,0,0), +d(2010,11,7,9,0,0), +d(2011,3,13,10,0,0), +d(2011,11,6,9,0,0), +d(2012,3,11,10,0,0), +d(2012,11,4,9,0,0), +d(2013,3,10,10,0,0), +d(2013,11,3,9,0,0), +d(2014,3,9,10,0,0), +d(2014,11,2,9,0,0), +d(2015,3,8,10,0,0), +d(2015,11,1,9,0,0), +d(2016,3,13,10,0,0), +d(2016,11,6,9,0,0), +d(2017,3,12,10,0,0), +d(2017,11,5,9,0,0), +d(2018,3,11,10,0,0), +d(2018,11,4,9,0,0), +d(2019,3,10,10,0,0), +d(2019,11,3,9,0,0), +d(2020,3,8,10,0,0), +d(2020,11,1,9,0,0), +d(2021,3,14,10,0,0), +d(2021,11,7,9,0,0), +d(2022,3,13,10,0,0), +d(2022,11,6,9,0,0), +d(2023,3,12,10,0,0), +d(2023,11,5,9,0,0), +d(2024,3,10,10,0,0), +d(2024,11,3,9,0,0), +d(2025,3,9,10,0,0), +d(2025,11,2,9,0,0), +d(2026,3,8,10,0,0), +d(2026,11,1,9,0,0), +d(2027,3,14,10,0,0), +d(2027,11,7,9,0,0), +d(2028,3,12,10,0,0), +d(2028,11,5,9,0,0), +d(2029,3,11,10,0,0), +d(2029,11,4,9,0,0), +d(2030,3,10,10,0,0), +d(2030,11,3,9,0,0), +d(2031,3,9,10,0,0), +d(2031,11,2,9,0,0), +d(2032,3,14,10,0,0), +d(2032,11,7,9,0,0), +d(2033,3,13,10,0,0), +d(2033,11,6,9,0,0), +d(2034,3,12,10,0,0), +d(2034,11,5,9,0,0), +d(2035,3,11,10,0,0), +d(2035,11,4,9,0,0), +d(2036,3,9,10,0,0), +d(2036,11,2,9,0,0), +d(2037,3,8,10,0,0), +d(2037,11,1,9,0,0), + ] + + _transition_info = [ +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PWT'), +i(-25200,3600,'PPT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), +i(-25200,3600,'PDT'), +i(-28800,0,'PST'), + ] + +Pacific_minus_New = Pacific_minus_New() + diff --git a/vendor/pytz/zoneinfo/US/Samoa.py b/vendor/pytz/zoneinfo/US/Samoa.py new file mode 100644 index 00000000..66c6b091 --- /dev/null +++ b/vendor/pytz/zoneinfo/US/Samoa.py @@ -0,0 +1,28 @@ +'''tzinfo timezone information for US/Samoa.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class Samoa(DstTzInfo): + '''US/Samoa timezone definition. See datetime.tzinfo for details''' + + zone = 'US/Samoa' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1911,1,1,11,22,48), +d(1950,1,1,11,30,0), +d(1967,4,1,11,0,0), +d(1983,11,30,11,0,0), + ] + + _transition_info = [ +i(-40980,0,'LMT'), +i(-41400,0,'SAMT'), +i(-39600,0,'NST'), +i(-39600,0,'BST'), +i(-39600,0,'SST'), + ] + +Samoa = Samoa() + diff --git a/vendor/pytz/zoneinfo/US/__init__.py b/vendor/pytz/zoneinfo/US/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/UTC.py b/vendor/pytz/zoneinfo/UTC.py new file mode 100644 index 00000000..fdb84339 --- /dev/null +++ b/vendor/pytz/zoneinfo/UTC.py @@ -0,0 +1,2 @@ +'''tzinfo timezone information for UTC.''' +from pytz import UTC diff --git a/vendor/pytz/zoneinfo/Universal.py b/vendor/pytz/zoneinfo/Universal.py new file mode 100644 index 00000000..0ed335fd --- /dev/null +++ b/vendor/pytz/zoneinfo/Universal.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Universal.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Universal(StaticTzInfo): + '''Universal timezone definition. See datetime.tzinfo for details''' + zone = 'Universal' + _utcoffset = timedelta(seconds=0) + _tzname = 'UTC' + +Universal = Universal() + diff --git a/vendor/pytz/zoneinfo/WET.py b/vendor/pytz/zoneinfo/WET.py new file mode 100644 index 00000000..a721990d --- /dev/null +++ b/vendor/pytz/zoneinfo/WET.py @@ -0,0 +1,264 @@ +'''tzinfo timezone information for WET.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class WET(DstTzInfo): + '''WET timezone definition. See datetime.tzinfo for details''' + + zone = 'WET' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1977,4,3,1,0,0), +d(1977,9,25,1,0,0), +d(1978,4,2,1,0,0), +d(1978,10,1,1,0,0), +d(1979,4,1,1,0,0), +d(1979,9,30,1,0,0), +d(1980,4,6,1,0,0), +d(1980,9,28,1,0,0), +d(1981,3,29,1,0,0), +d(1981,9,27,1,0,0), +d(1982,3,28,1,0,0), +d(1982,9,26,1,0,0), +d(1983,3,27,1,0,0), +d(1983,9,25,1,0,0), +d(1984,3,25,1,0,0), +d(1984,9,30,1,0,0), +d(1985,3,31,1,0,0), +d(1985,9,29,1,0,0), +d(1986,3,30,1,0,0), +d(1986,9,28,1,0,0), +d(1987,3,29,1,0,0), +d(1987,9,27,1,0,0), +d(1988,3,27,1,0,0), +d(1988,9,25,1,0,0), +d(1989,3,26,1,0,0), +d(1989,9,24,1,0,0), +d(1990,3,25,1,0,0), +d(1990,9,30,1,0,0), +d(1991,3,31,1,0,0), +d(1991,9,29,1,0,0), +d(1992,3,29,1,0,0), +d(1992,9,27,1,0,0), +d(1993,3,28,1,0,0), +d(1993,9,26,1,0,0), +d(1994,3,27,1,0,0), +d(1994,9,25,1,0,0), +d(1995,3,26,1,0,0), +d(1995,9,24,1,0,0), +d(1996,3,31,1,0,0), +d(1996,10,27,1,0,0), +d(1997,3,30,1,0,0), +d(1997,10,26,1,0,0), +d(1998,3,29,1,0,0), +d(1998,10,25,1,0,0), +d(1999,3,28,1,0,0), +d(1999,10,31,1,0,0), +d(2000,3,26,1,0,0), +d(2000,10,29,1,0,0), +d(2001,3,25,1,0,0), +d(2001,10,28,1,0,0), +d(2002,3,31,1,0,0), +d(2002,10,27,1,0,0), +d(2003,3,30,1,0,0), +d(2003,10,26,1,0,0), +d(2004,3,28,1,0,0), +d(2004,10,31,1,0,0), +d(2005,3,27,1,0,0), +d(2005,10,30,1,0,0), +d(2006,3,26,1,0,0), +d(2006,10,29,1,0,0), +d(2007,3,25,1,0,0), +d(2007,10,28,1,0,0), +d(2008,3,30,1,0,0), +d(2008,10,26,1,0,0), +d(2009,3,29,1,0,0), +d(2009,10,25,1,0,0), +d(2010,3,28,1,0,0), +d(2010,10,31,1,0,0), +d(2011,3,27,1,0,0), +d(2011,10,30,1,0,0), +d(2012,3,25,1,0,0), +d(2012,10,28,1,0,0), +d(2013,3,31,1,0,0), +d(2013,10,27,1,0,0), +d(2014,3,30,1,0,0), +d(2014,10,26,1,0,0), +d(2015,3,29,1,0,0), +d(2015,10,25,1,0,0), +d(2016,3,27,1,0,0), +d(2016,10,30,1,0,0), +d(2017,3,26,1,0,0), +d(2017,10,29,1,0,0), +d(2018,3,25,1,0,0), +d(2018,10,28,1,0,0), +d(2019,3,31,1,0,0), +d(2019,10,27,1,0,0), +d(2020,3,29,1,0,0), +d(2020,10,25,1,0,0), +d(2021,3,28,1,0,0), +d(2021,10,31,1,0,0), +d(2022,3,27,1,0,0), +d(2022,10,30,1,0,0), +d(2023,3,26,1,0,0), +d(2023,10,29,1,0,0), +d(2024,3,31,1,0,0), +d(2024,10,27,1,0,0), +d(2025,3,30,1,0,0), +d(2025,10,26,1,0,0), +d(2026,3,29,1,0,0), +d(2026,10,25,1,0,0), +d(2027,3,28,1,0,0), +d(2027,10,31,1,0,0), +d(2028,3,26,1,0,0), +d(2028,10,29,1,0,0), +d(2029,3,25,1,0,0), +d(2029,10,28,1,0,0), +d(2030,3,31,1,0,0), +d(2030,10,27,1,0,0), +d(2031,3,30,1,0,0), +d(2031,10,26,1,0,0), +d(2032,3,28,1,0,0), +d(2032,10,31,1,0,0), +d(2033,3,27,1,0,0), +d(2033,10,30,1,0,0), +d(2034,3,26,1,0,0), +d(2034,10,29,1,0,0), +d(2035,3,25,1,0,0), +d(2035,10,28,1,0,0), +d(2036,3,30,1,0,0), +d(2036,10,26,1,0,0), +d(2037,3,29,1,0,0), +d(2037,10,25,1,0,0), + ] + + _transition_info = [ +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), +i(3600,3600,'WEST'), +i(0,0,'WET'), + ] + +WET = WET() + diff --git a/vendor/pytz/zoneinfo/W_minus_SU.py b/vendor/pytz/zoneinfo/W_minus_SU.py new file mode 100644 index 00000000..a897cbde --- /dev/null +++ b/vendor/pytz/zoneinfo/W_minus_SU.py @@ -0,0 +1,278 @@ +'''tzinfo timezone information for W_minus_SU.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class W_minus_SU(DstTzInfo): + '''W_minus_SU timezone definition. See datetime.tzinfo for details''' + + zone = 'W_minus_SU' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1916,7,2,21,30,0), +d(1917,7,1,20,29,12), +d(1917,12,27,20,29,12), +d(1918,5,31,19,29,12), +d(1918,9,15,20,29,12), +d(1919,5,31,19,29,12), +d(1919,6,30,21,29,12), +d(1919,8,15,20,0,0), +d(1921,2,14,20,0,0), +d(1921,3,20,19,0,0), +d(1921,8,31,19,0,0), +d(1921,9,30,20,0,0), +d(1922,9,30,21,0,0), +d(1930,6,20,22,0,0), +d(1981,3,31,21,0,0), +d(1981,9,30,20,0,0), +d(1982,3,31,21,0,0), +d(1982,9,30,20,0,0), +d(1983,3,31,21,0,0), +d(1983,9,30,20,0,0), +d(1984,3,31,21,0,0), +d(1984,9,29,23,0,0), +d(1985,3,30,23,0,0), +d(1985,9,28,23,0,0), +d(1986,3,29,23,0,0), +d(1986,9,27,23,0,0), +d(1987,3,28,23,0,0), +d(1987,9,26,23,0,0), +d(1988,3,26,23,0,0), +d(1988,9,24,23,0,0), +d(1989,3,25,23,0,0), +d(1989,9,23,23,0,0), +d(1990,3,24,23,0,0), +d(1990,9,29,23,0,0), +d(1991,3,30,23,0,0), +d(1991,9,29,0,0,0), +d(1992,1,19,0,0,0), +d(1992,3,28,20,0,0), +d(1992,9,26,19,0,0), +d(1993,3,27,23,0,0), +d(1993,9,25,23,0,0), +d(1994,3,26,23,0,0), +d(1994,9,24,23,0,0), +d(1995,3,25,23,0,0), +d(1995,9,23,23,0,0), +d(1996,3,30,23,0,0), +d(1996,10,26,23,0,0), +d(1997,3,29,23,0,0), +d(1997,10,25,23,0,0), +d(1998,3,28,23,0,0), +d(1998,10,24,23,0,0), +d(1999,3,27,23,0,0), +d(1999,10,30,23,0,0), +d(2000,3,25,23,0,0), +d(2000,10,28,23,0,0), +d(2001,3,24,23,0,0), +d(2001,10,27,23,0,0), +d(2002,3,30,23,0,0), +d(2002,10,26,23,0,0), +d(2003,3,29,23,0,0), +d(2003,10,25,23,0,0), +d(2004,3,27,23,0,0), +d(2004,10,30,23,0,0), +d(2005,3,26,23,0,0), +d(2005,10,29,23,0,0), +d(2006,3,25,23,0,0), +d(2006,10,28,23,0,0), +d(2007,3,24,23,0,0), +d(2007,10,27,23,0,0), +d(2008,3,29,23,0,0), +d(2008,10,25,23,0,0), +d(2009,3,28,23,0,0), +d(2009,10,24,23,0,0), +d(2010,3,27,23,0,0), +d(2010,10,30,23,0,0), +d(2011,3,26,23,0,0), +d(2011,10,29,23,0,0), +d(2012,3,24,23,0,0), +d(2012,10,27,23,0,0), +d(2013,3,30,23,0,0), +d(2013,10,26,23,0,0), +d(2014,3,29,23,0,0), +d(2014,10,25,23,0,0), +d(2015,3,28,23,0,0), +d(2015,10,24,23,0,0), +d(2016,3,26,23,0,0), +d(2016,10,29,23,0,0), +d(2017,3,25,23,0,0), +d(2017,10,28,23,0,0), +d(2018,3,24,23,0,0), +d(2018,10,27,23,0,0), +d(2019,3,30,23,0,0), +d(2019,10,26,23,0,0), +d(2020,3,28,23,0,0), +d(2020,10,24,23,0,0), +d(2021,3,27,23,0,0), +d(2021,10,30,23,0,0), +d(2022,3,26,23,0,0), +d(2022,10,29,23,0,0), +d(2023,3,25,23,0,0), +d(2023,10,28,23,0,0), +d(2024,3,30,23,0,0), +d(2024,10,26,23,0,0), +d(2025,3,29,23,0,0), +d(2025,10,25,23,0,0), +d(2026,3,28,23,0,0), +d(2026,10,24,23,0,0), +d(2027,3,27,23,0,0), +d(2027,10,30,23,0,0), +d(2028,3,25,23,0,0), +d(2028,10,28,23,0,0), +d(2029,3,24,23,0,0), +d(2029,10,27,23,0,0), +d(2030,3,30,23,0,0), +d(2030,10,26,23,0,0), +d(2031,3,29,23,0,0), +d(2031,10,25,23,0,0), +d(2032,3,27,23,0,0), +d(2032,10,30,23,0,0), +d(2033,3,26,23,0,0), +d(2033,10,29,23,0,0), +d(2034,3,25,23,0,0), +d(2034,10,28,23,0,0), +d(2035,3,24,23,0,0), +d(2035,10,27,23,0,0), +d(2036,3,29,23,0,0), +d(2036,10,25,23,0,0), +d(2037,3,28,23,0,0), +d(2037,10,24,23,0,0), + ] + + _transition_info = [ +i(9000,0,'MMT'), +i(9060,0,'MMT'), +i(12660,3600,'MST'), +i(9060,0,'MMT'), +i(16260,7200,'MDST'), +i(12660,3600,'MST'), +i(16260,7200,'MDST'), +i(14400,5340,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(18000,7200,'MSD'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(10800,0,'EEST'), +i(7200,0,'EET'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), +i(14400,3600,'MSD'), +i(10800,0,'MSK'), + ] + +W_minus_SU = W_minus_SU() + diff --git a/vendor/pytz/zoneinfo/Zulu.py b/vendor/pytz/zoneinfo/Zulu.py new file mode 100644 index 00000000..4d6142a5 --- /dev/null +++ b/vendor/pytz/zoneinfo/Zulu.py @@ -0,0 +1,12 @@ +'''tzinfo timezone information for Zulu.''' +from pytz.tzinfo import StaticTzInfo +from pytz.tzinfo import memorized_timedelta as timedelta + +class Zulu(StaticTzInfo): + '''Zulu timezone definition. See datetime.tzinfo for details''' + zone = 'Zulu' + _utcoffset = timedelta(seconds=0) + _tzname = 'UTC' + +Zulu = Zulu() + diff --git a/vendor/pytz/zoneinfo/__init__.py b/vendor/pytz/zoneinfo/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/pytz/zoneinfo/posixrules.py b/vendor/pytz/zoneinfo/posixrules.py new file mode 100644 index 00000000..dd34e6e1 --- /dev/null +++ b/vendor/pytz/zoneinfo/posixrules.py @@ -0,0 +1,490 @@ +'''tzinfo timezone information for posixrules.''' +from pytz.tzinfo import DstTzInfo +from pytz.tzinfo import memorized_datetime as d +from pytz.tzinfo import memorized_ttinfo as i + +class posixrules(DstTzInfo): + '''posixrules timezone definition. See datetime.tzinfo for details''' + + zone = 'posixrules' + + _utc_transition_times = [ +d(1,1,1,0,0,0), +d(1918,3,31,7,0,0), +d(1918,10,27,6,0,0), +d(1919,3,30,7,0,0), +d(1919,10,26,6,0,0), +d(1920,3,28,7,0,0), +d(1920,10,31,6,0,0), +d(1921,4,24,7,0,0), +d(1921,9,25,6,0,0), +d(1922,4,30,7,0,0), +d(1922,9,24,6,0,0), +d(1923,4,29,7,0,0), +d(1923,9,30,6,0,0), +d(1924,4,27,7,0,0), +d(1924,9,28,6,0,0), +d(1925,4,26,7,0,0), +d(1925,9,27,6,0,0), +d(1926,4,25,7,0,0), +d(1926,9,26,6,0,0), +d(1927,4,24,7,0,0), +d(1927,9,25,6,0,0), +d(1928,4,29,7,0,0), +d(1928,9,30,6,0,0), +d(1929,4,28,7,0,0), +d(1929,9,29,6,0,0), +d(1930,4,27,7,0,0), +d(1930,9,28,6,0,0), +d(1931,4,26,7,0,0), +d(1931,9,27,6,0,0), +d(1932,4,24,7,0,0), +d(1932,9,25,6,0,0), +d(1933,4,30,7,0,0), +d(1933,9,24,6,0,0), +d(1934,4,29,7,0,0), +d(1934,9,30,6,0,0), +d(1935,4,28,7,0,0), +d(1935,9,29,6,0,0), +d(1936,4,26,7,0,0), +d(1936,9,27,6,0,0), +d(1937,4,25,7,0,0), +d(1937,9,26,6,0,0), +d(1938,4,24,7,0,0), +d(1938,9,25,6,0,0), +d(1939,4,30,7,0,0), +d(1939,9,24,6,0,0), +d(1940,4,28,7,0,0), +d(1940,9,29,6,0,0), +d(1941,4,27,7,0,0), +d(1941,9,28,6,0,0), +d(1942,2,9,7,0,0), +d(1945,8,14,23,0,0), +d(1945,9,30,6,0,0), +d(1946,4,28,7,0,0), +d(1946,9,29,6,0,0), +d(1947,4,27,7,0,0), +d(1947,9,28,6,0,0), +d(1948,4,25,7,0,0), +d(1948,9,26,6,0,0), +d(1949,4,24,7,0,0), +d(1949,9,25,6,0,0), +d(1950,4,30,7,0,0), +d(1950,9,24,6,0,0), +d(1951,4,29,7,0,0), +d(1951,9,30,6,0,0), +d(1952,4,27,7,0,0), +d(1952,9,28,6,0,0), +d(1953,4,26,7,0,0), +d(1953,9,27,6,0,0), +d(1954,4,25,7,0,0), +d(1954,9,26,6,0,0), +d(1955,4,24,7,0,0), +d(1955,10,30,6,0,0), +d(1956,4,29,7,0,0), +d(1956,10,28,6,0,0), +d(1957,4,28,7,0,0), +d(1957,10,27,6,0,0), +d(1958,4,27,7,0,0), +d(1958,10,26,6,0,0), +d(1959,4,26,7,0,0), +d(1959,10,25,6,0,0), +d(1960,4,24,7,0,0), +d(1960,10,30,6,0,0), +d(1961,4,30,7,0,0), +d(1961,10,29,6,0,0), +d(1962,4,29,7,0,0), +d(1962,10,28,6,0,0), +d(1963,4,28,7,0,0), +d(1963,10,27,6,0,0), +d(1964,4,26,7,0,0), +d(1964,10,25,6,0,0), +d(1965,4,25,7,0,0), +d(1965,10,31,6,0,0), +d(1966,4,24,7,0,0), +d(1966,10,30,6,0,0), +d(1967,4,30,7,0,0), +d(1967,10,29,6,0,0), +d(1968,4,28,7,0,0), +d(1968,10,27,6,0,0), +d(1969,4,27,7,0,0), +d(1969,10,26,6,0,0), +d(1970,4,26,7,0,0), +d(1970,10,25,6,0,0), +d(1971,4,25,7,0,0), +d(1971,10,31,6,0,0), +d(1972,4,30,7,0,0), +d(1972,10,29,6,0,0), +d(1973,4,29,7,0,0), +d(1973,10,28,6,0,0), +d(1974,1,6,7,0,0), +d(1974,10,27,6,0,0), +d(1975,2,23,7,0,0), +d(1975,10,26,6,0,0), +d(1976,4,25,7,0,0), +d(1976,10,31,6,0,0), +d(1977,4,24,7,0,0), +d(1977,10,30,6,0,0), +d(1978,4,30,7,0,0), +d(1978,10,29,6,0,0), +d(1979,4,29,7,0,0), +d(1979,10,28,6,0,0), +d(1980,4,27,7,0,0), +d(1980,10,26,6,0,0), +d(1981,4,26,7,0,0), +d(1981,10,25,6,0,0), +d(1982,4,25,7,0,0), +d(1982,10,31,6,0,0), +d(1983,4,24,7,0,0), +d(1983,10,30,6,0,0), +d(1984,4,29,7,0,0), +d(1984,10,28,6,0,0), +d(1985,4,28,7,0,0), +d(1985,10,27,6,0,0), +d(1986,4,27,7,0,0), +d(1986,10,26,6,0,0), +d(1987,4,5,7,0,0), +d(1987,10,25,6,0,0), +d(1988,4,3,7,0,0), +d(1988,10,30,6,0,0), +d(1989,4,2,7,0,0), +d(1989,10,29,6,0,0), +d(1990,4,1,7,0,0), +d(1990,10,28,6,0,0), +d(1991,4,7,7,0,0), +d(1991,10,27,6,0,0), +d(1992,4,5,7,0,0), +d(1992,10,25,6,0,0), +d(1993,4,4,7,0,0), +d(1993,10,31,6,0,0), +d(1994,4,3,7,0,0), +d(1994,10,30,6,0,0), +d(1995,4,2,7,0,0), +d(1995,10,29,6,0,0), +d(1996,4,7,7,0,0), +d(1996,10,27,6,0,0), +d(1997,4,6,7,0,0), +d(1997,10,26,6,0,0), +d(1998,4,5,7,0,0), +d(1998,10,25,6,0,0), +d(1999,4,4,7,0,0), +d(1999,10,31,6,0,0), +d(2000,4,2,7,0,0), +d(2000,10,29,6,0,0), +d(2001,4,1,7,0,0), +d(2001,10,28,6,0,0), +d(2002,4,7,7,0,0), +d(2002,10,27,6,0,0), +d(2003,4,6,7,0,0), +d(2003,10,26,6,0,0), +d(2004,4,4,7,0,0), +d(2004,10,31,6,0,0), +d(2005,4,3,7,0,0), +d(2005,10,30,6,0,0), +d(2006,4,2,7,0,0), +d(2006,10,29,6,0,0), +d(2007,3,11,7,0,0), +d(2007,11,4,6,0,0), +d(2008,3,9,7,0,0), +d(2008,11,2,6,0,0), +d(2009,3,8,7,0,0), +d(2009,11,1,6,0,0), +d(2010,3,14,7,0,0), +d(2010,11,7,6,0,0), +d(2011,3,13,7,0,0), +d(2011,11,6,6,0,0), +d(2012,3,11,7,0,0), +d(2012,11,4,6,0,0), +d(2013,3,10,7,0,0), +d(2013,11,3,6,0,0), +d(2014,3,9,7,0,0), +d(2014,11,2,6,0,0), +d(2015,3,8,7,0,0), +d(2015,11,1,6,0,0), +d(2016,3,13,7,0,0), +d(2016,11,6,6,0,0), +d(2017,3,12,7,0,0), +d(2017,11,5,6,0,0), +d(2018,3,11,7,0,0), +d(2018,11,4,6,0,0), +d(2019,3,10,7,0,0), +d(2019,11,3,6,0,0), +d(2020,3,8,7,0,0), +d(2020,11,1,6,0,0), +d(2021,3,14,7,0,0), +d(2021,11,7,6,0,0), +d(2022,3,13,7,0,0), +d(2022,11,6,6,0,0), +d(2023,3,12,7,0,0), +d(2023,11,5,6,0,0), +d(2024,3,10,7,0,0), +d(2024,11,3,6,0,0), +d(2025,3,9,7,0,0), +d(2025,11,2,6,0,0), +d(2026,3,8,7,0,0), +d(2026,11,1,6,0,0), +d(2027,3,14,7,0,0), +d(2027,11,7,6,0,0), +d(2028,3,12,7,0,0), +d(2028,11,5,6,0,0), +d(2029,3,11,7,0,0), +d(2029,11,4,6,0,0), +d(2030,3,10,7,0,0), +d(2030,11,3,6,0,0), +d(2031,3,9,7,0,0), +d(2031,11,2,6,0,0), +d(2032,3,14,7,0,0), +d(2032,11,7,6,0,0), +d(2033,3,13,7,0,0), +d(2033,11,6,6,0,0), +d(2034,3,12,7,0,0), +d(2034,11,5,6,0,0), +d(2035,3,11,7,0,0), +d(2035,11,4,6,0,0), +d(2036,3,9,7,0,0), +d(2036,11,2,6,0,0), +d(2037,3,8,7,0,0), +d(2037,11,1,6,0,0), + ] + + _transition_info = [ +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EWT'), +i(-14400,3600,'EPT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), +i(-14400,3600,'EDT'), +i(-18000,0,'EST'), + ] + +posixrules = posixrules() + diff --git a/vendor/requests/LICENSE b/vendor/requests/LICENSE new file mode 100644 index 00000000..8c1dd448 --- /dev/null +++ b/vendor/requests/LICENSE @@ -0,0 +1,13 @@ +Copyright 2016 Kenneth Reitz + + 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. diff --git a/vendor/requests/__init__.py b/vendor/requests/__init__.py index d5d258e8..9c3b7695 100644 --- a/vendor/requests/__init__.py +++ b/vendor/requests/__init__.py @@ -6,14 +6,14 @@ # / """ -requests HTTP library +Requests HTTP library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests - >>> r = requests.get('http://python.org') + >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content @@ -22,7 +22,7 @@ usage: ... or POST: >>> payload = dict(key1='value1', key2='value2') - >>> r = requests.post("http://httpbin.org/post", data=payload) + >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... @@ -36,17 +36,16 @@ usage: The other HTTP methods are supported - see `requests.api`. Full documentation is at . -:copyright: (c) 2013 by Kenneth Reitz. +:copyright: (c) 2016 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. - """ __title__ = 'requests' -__version__ = '2.1.0' -__build__ = 0x020100 +__version__ = '2.11.1' +__build__ = 0x021101 __author__ = 'Kenneth Reitz' __license__ = 'Apache 2.0' -__copyright__ = 'Copyright 2013 Kenneth Reitz' +__copyright__ = 'Copyright 2016 Kenneth Reitz' # Attempt to enable urllib3's SNI support, if possible try: @@ -55,6 +54,12 @@ try: except ImportError: pass +import warnings + +# urllib3's DependencyWarnings should be silenced. +from .packages.urllib3.exceptions import DependencyWarning +warnings.simplefilter('ignore', DependencyWarning) + from . import utils from .models import Request, Response, PreparedRequest from .api import request, get, head, post, patch, put, delete, options @@ -62,7 +67,8 @@ from .sessions import session, Session from .status_codes import codes from .exceptions import ( RequestException, Timeout, URLRequired, - TooManyRedirects, HTTPError, ConnectionError + TooManyRedirects, HTTPError, ConnectionError, + FileModeWarning, ConnectTimeout, ReadTimeout ) # Set default logging handler to avoid "No handler found" warnings. @@ -75,3 +81,6 @@ except ImportError: pass logging.getLogger(__name__).addHandler(NullHandler()) + +# FileModeWarnings go off per the default. +warnings.simplefilter('default', FileModeWarning, append=True) diff --git a/vendor/requests/adapters.py b/vendor/requests/adapters.py index b62f64c8..4a4c4e0e 100644 --- a/vendor/requests/adapters.py +++ b/vendor/requests/adapters.py @@ -8,28 +8,44 @@ This module contains the transport adapters that Requests uses to define and maintain connections. """ +import os.path import socket from .models import Response from .packages.urllib3.poolmanager import PoolManager, proxy_from_url from .packages.urllib3.response import HTTPResponse from .packages.urllib3.util import Timeout as TimeoutSauce -from .compat import urlparse, basestring, urldefrag, unquote +from .packages.urllib3.util.retry import Retry +from .compat import urlparse, basestring from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, - except_on_missing_scheme, get_auth_from_url) + prepend_scheme_if_needed, get_auth_from_url, urldefragauth, + select_proxy, to_native_string) from .structures import CaseInsensitiveDict -from .packages.urllib3.exceptions import MaxRetryError -from .packages.urllib3.exceptions import TimeoutError -from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import ClosedPoolError +from .packages.urllib3.exceptions import ConnectTimeoutError from .packages.urllib3.exceptions import HTTPError as _HTTPError +from .packages.urllib3.exceptions import MaxRetryError +from .packages.urllib3.exceptions import NewConnectionError from .packages.urllib3.exceptions import ProxyError as _ProxyError +from .packages.urllib3.exceptions import ProtocolError +from .packages.urllib3.exceptions import ReadTimeoutError +from .packages.urllib3.exceptions import SSLError as _SSLError +from .packages.urllib3.exceptions import ResponseError from .cookies import extract_cookies_to_jar -from .exceptions import ConnectionError, Timeout, SSLError, ProxyError +from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, + ProxyError, RetryError, InvalidSchema) from .auth import _basic_auth_str +try: + from .packages.urllib3.contrib.socks import SOCKSProxyManager +except ImportError: + def SOCKSProxyManager(*args, **kwargs): + raise InvalidSchema("Missing dependencies for SOCKS support.") + DEFAULT_POOLBLOCK = False DEFAULT_POOLSIZE = 10 DEFAULT_RETRIES = 0 +DEFAULT_POOL_TIMEOUT = None class BaseAdapter(object): @@ -38,10 +54,24 @@ class BaseAdapter(object): def __init__(self): super(BaseAdapter, self).__init__() - def send(self): + def send(self, request, stream=False, timeout=None, verify=True, + cert=None, proxies=None): + """Sends PreparedRequest object. Returns Response object. + + :param request: The :class:`PreparedRequest ` being sent. + :param stream: (optional) Whether to stream the request content. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param verify: (optional) Whether to verify SSL certificates. + :param cert: (optional) Any user-provided SSL certificate to be trusted. + :param proxies: (optional) The proxies dictionary to apply to the request. + """ raise NotImplementedError def close(self): + """Cleans up adapter specific items.""" raise NotImplementedError @@ -55,14 +85,20 @@ class HTTPAdapter(BaseAdapter): :param pool_connections: The number of urllib3 connection pools to cache. :param pool_maxsize: The maximum number of connections to save in the pool. - :param max_retries: The maximum number of retries each connection should attempt. + :param max_retries: The maximum number of retries each connection + should attempt. Note, this applies only to failed DNS lookups, socket + connections and connection timeouts, never to requests where data has + made it to the server. By default, Requests does not retry failed + connections. If you need granular control over the conditions under + which we retry a request, import urllib3's ``Retry`` class and pass + that instead. :param pool_block: Whether the connection pool should block for connections. Usage:: >>> import requests >>> s = requests.Session() - >>> a = requests.adapters.HTTPAdapter() + >>> a = requests.adapters.HTTPAdapter(max_retries=3) >>> s.mount('http://', a) """ __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', @@ -71,7 +107,10 @@ class HTTPAdapter(BaseAdapter): def __init__(self, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, pool_block=DEFAULT_POOLBLOCK): - self.max_retries = max_retries + if max_retries == DEFAULT_RETRIES: + self.max_retries = Retry(0, read=False) + else: + self.max_retries = Retry.from_int(max_retries) self.config = {} self.proxy_manager = {} @@ -88,20 +127,28 @@ class HTTPAdapter(BaseAdapter): self.__attrs__) def __setstate__(self, state): + # Can't handle by adding 'proxy_manager' to self.__attrs__ because + # self.poolmanager uses a lambda function, which isn't pickleable. + self.proxy_manager = {} + self.config = {} + for attr, value in state.items(): setattr(self, attr, value) self.init_poolmanager(self._pool_connections, self._pool_maxsize, block=self._pool_block) - def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK): - """Initializes a urllib3 PoolManager. This method should not be called - from user code, and is only exposed for use when subclassing the + def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): + """Initializes a urllib3 PoolManager. + + This method should not be called from user code, and is only + exposed for use when subclassing the :class:`HTTPAdapter `. :param connections: The number of urllib3 connection pools to cache. :param maxsize: The maximum number of connections to save in the pool. :param block: Block when no free connections are available. + :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. """ # save these values for pickling self._pool_connections = connections @@ -109,7 +156,44 @@ class HTTPAdapter(BaseAdapter): self._pool_block = block self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, - block=block) + block=block, strict=True, **pool_kwargs) + + def proxy_manager_for(self, proxy, **proxy_kwargs): + """Return urllib3 ProxyManager for the given proxy. + + This method should not be called from user code, and is only + exposed for use when subclassing the + :class:`HTTPAdapter `. + + :param proxy: The proxy to return a urllib3 ProxyManager for. + :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. + :returns: ProxyManager + :rtype: requests.packages.urllib3.ProxyManager + """ + if proxy in self.proxy_manager: + manager = self.proxy_manager[proxy] + elif proxy.lower().startswith('socks'): + username, password = get_auth_from_url(proxy) + manager = self.proxy_manager[proxy] = SOCKSProxyManager( + proxy, + username=username, + password=password, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs + ) + else: + proxy_headers = self.proxy_headers(proxy) + manager = self.proxy_manager[proxy] = proxy_from_url( + proxy, + proxy_headers=proxy_headers, + num_pools=self._pool_connections, + maxsize=self._pool_maxsize, + block=self._pool_block, + **proxy_kwargs) + + return manager def cert_verify(self, conn, url, verify, cert): """Verify a SSL certificate. This method should not be called from user @@ -136,10 +220,15 @@ class HTTPAdapter(BaseAdapter): raise Exception("Could not find a suitable SSL CA certificate bundle.") conn.cert_reqs = 'CERT_REQUIRED' - conn.ca_certs = cert_loc + + if not os.path.isdir(cert_loc): + conn.ca_certs = cert_loc + else: + conn.ca_cert_dir = cert_loc else: conn.cert_reqs = 'CERT_NONE' conn.ca_certs = None + conn.ca_cert_dir = None if cert: if not isinstance(cert, basestring): @@ -156,6 +245,7 @@ class HTTPAdapter(BaseAdapter): :param req: The :class:`PreparedRequest ` used to generate the response. :param resp: The urllib3 response object. + :rtype: requests.Response """ response = Response() @@ -191,20 +281,14 @@ class HTTPAdapter(BaseAdapter): :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. + :rtype: requests.packages.urllib3.ConnectionPool """ - proxies = proxies or {} - proxy = proxies.get(urlparse(url.lower()).scheme) + proxy = select_proxy(url, proxies) if proxy: - except_on_missing_scheme(proxy) - proxy_headers = self.proxy_headers(proxy) - - if not proxy in self.proxy_manager: - self.proxy_manager[proxy] = proxy_from_url( - proxy, - proxy_headers=proxy_headers) - - conn = self.proxy_manager[proxy].connection_from_url(url) + proxy = prepend_scheme_if_needed(proxy, 'http') + proxy_manager = self.proxy_manager_for(proxy) + conn = proxy_manager.connection_from_url(url) else: # Only scheme should be lower case parsed = urlparse(url) @@ -216,10 +300,12 @@ class HTTPAdapter(BaseAdapter): def close(self): """Disposes of any internal state. - Currently, this just closes the PoolManager, which closes pooled - connections. + Currently, this closes the PoolManager and any active ProxyManager, + which closes any pooled connections. """ self.poolmanager.clear() + for proxy in self.proxy_manager.values(): + proxy.clear() def request_url(self, request, proxies): """Obtain the url to use when making the final request. @@ -232,16 +318,21 @@ class HTTPAdapter(BaseAdapter): :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` being sent. - :param proxies: A dictionary of schemes to proxy URLs. + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs. + :rtype: str """ - proxies = proxies or {} + proxy = select_proxy(request.url, proxies) scheme = urlparse(request.url).scheme - proxy = proxies.get(scheme) - if proxy and scheme != 'https': - url, _ = urldefrag(request.url) - else: - url = request.path_url + is_proxied_http_request = (proxy and scheme != 'https') + using_socks_proxy = False + if proxy: + proxy_scheme = urlparse(proxy).scheme.lower() + using_socks_proxy = proxy_scheme.startswith('socks') + + url = request.path_url + if is_proxied_http_request and not using_socks_proxy: + url = urldefragauth(request.url) return url @@ -270,16 +361,12 @@ class HTTPAdapter(BaseAdapter): :class:`HTTPAdapter `. :param proxies: The url of the proxy being used for this request. - :param kwargs: Optional additional keyword arguments. + :rtype: dict """ headers = {} username, password = get_auth_from_url(proxy) if username and password: - # Proxy auth usernames and passwords will be urlencoded, we need - # to decode them. - username = unquote(username) - password = unquote(password) headers['Proxy-Authorization'] = _basic_auth_str(username, password) @@ -290,10 +377,14 @@ class HTTPAdapter(BaseAdapter): :param request: The :class:`PreparedRequest ` being sent. :param stream: (optional) Whether to stream the request content. - :param timeout: (optional) The timeout on the request. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple :param verify: (optional) Whether to verify SSL certificates. :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. + :rtype: requests.Response """ conn = self.get_connection(request.url, proxies) @@ -304,8 +395,16 @@ class HTTPAdapter(BaseAdapter): chunked = not (request.body is None or 'Content-Length' in request.headers) - if stream: - timeout = TimeoutSauce(connect=timeout) + if isinstance(timeout, tuple): + try: + connect, read = timeout + timeout = TimeoutSauce(connect=connect, read=read) + except ValueError as e: + # this may raise a string formatting error. + err = ("Invalid timeout {0}. Pass a (connect, read) " + "timeout tuple, or a single float to set " + "both timeouts to the same value".format(timeout)) + raise ValueError(err) else: timeout = TimeoutSauce(connect=timeout, read=timeout) @@ -329,7 +428,7 @@ class HTTPAdapter(BaseAdapter): if hasattr(conn, 'proxy_pool'): conn = conn.proxy_pool - low_conn = conn._get_conn(timeout=timeout) + low_conn = conn._get_conn(timeout=DEFAULT_POOL_TIMEOUT) try: low_conn.putrequest(request.method, @@ -348,7 +447,15 @@ class HTTPAdapter(BaseAdapter): low_conn.send(b'\r\n') low_conn.send(b'0\r\n\r\n') - r = low_conn.getresponse() + # Receive the response from the server + try: + # For Python 2.7+ versions, use buffering of HTTP + # responses + r = low_conn.getresponse(buffering=True) + except TypeError: + # For compatibility with Python 2.6 versions and back + r = low_conn.getresponse() + resp = HTTPResponse.from_httplib( r, pool=conn, @@ -361,30 +468,36 @@ class HTTPAdapter(BaseAdapter): # Then, reraise so that we can handle the actual exception. low_conn.close() raise - else: - # All is well, return the connection to the pool. - conn._put_conn(low_conn) - except socket.error as sockerr: - raise ConnectionError(sockerr) + except (ProtocolError, socket.error) as err: + raise ConnectionError(err, request=request) except MaxRetryError as e: - raise ConnectionError(e) + if isinstance(e.reason, ConnectTimeoutError): + # TODO: Remove this in 3.0.0: see #2811 + if not isinstance(e.reason, NewConnectionError): + raise ConnectTimeout(e, request=request) + + if isinstance(e.reason, ResponseError): + raise RetryError(e, request=request) + + if isinstance(e.reason, _ProxyError): + raise ProxyError(e, request=request) + + raise ConnectionError(e, request=request) + + except ClosedPoolError as e: + raise ConnectionError(e, request=request) except _ProxyError as e: raise ProxyError(e) except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): - raise SSLError(e) - elif isinstance(e, TimeoutError): - raise Timeout(e) + raise SSLError(e, request=request) + elif isinstance(e, ReadTimeoutError): + raise ReadTimeout(e, request=request) else: raise - r = self.build_response(request, resp) - - if not stream: - r.content - - return r + return self.build_response(request, resp) diff --git a/vendor/requests/api.py b/vendor/requests/api.py index baf43dd6..580b3f35 100644 --- a/vendor/requests/api.py +++ b/vendor/requests/api.py @@ -8,7 +8,6 @@ This module implements the Requests API. :copyright: (c) 2012 by Kenneth Reitz. :license: Apache2, see LICENSE for more details. - """ from . import sessions @@ -16,22 +15,32 @@ from . import sessions def request(method, url, **kwargs): """Constructs and sends a :class:`Request `. - Returns :class:`Response ` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'name': file-like-objects (or {'name': ('filename', fileobj)}) for multipart encoding upload. + :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': file-tuple}``) for multipart encoding upload. + ``file-tuple`` can be a 2-tuple ``('filename', fileobj)``, 3-tuple ``('filename', fileobj, 'content_type')`` + or a 4-tuple ``('filename', fileobj, 'content_type', custom_headers)``, where ``'content-type'`` is a string + defining the content type of the given file and ``custom_headers`` a dict-like object containing additional headers + to add for the file. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the request. + :param timeout: (optional) How long to wait for the server to send data + before giving up, as a float, or a :ref:`(connect timeout, read + timeout) ` tuple. + :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. + :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. - :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. + :param verify: (optional) whether the SSL cert will be verified. A CA_BUNDLE path can also be provided. Defaults to ``True``. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :return: :class:`Response ` object + :rtype: requests.Response Usage:: @@ -40,26 +49,34 @@ def request(method, url, **kwargs): """ - session = sessions.Session() - return session.request(method=method, url=url, **kwargs) + # By using the 'with' statement we are sure the session is closed, thus we + # avoid leaving sockets open which can trigger a ResourceWarning in some + # cases, and look like a memory leak in others. + with sessions.Session() as session: + return session.request(method=method, url=url, **kwargs) -def get(url, **kwargs): - """Sends a GET request. Returns :class:`Response` object. +def get(url, params=None, **kwargs): + """Sends a GET request. :param url: URL for the new :class:`Request` object. + :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) - return request('get', url, **kwargs) + return request('get', url, params=params, **kwargs) def options(url, **kwargs): - """Sends a OPTIONS request. Returns :class:`Response` object. + """Sends a OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) @@ -67,54 +84,65 @@ def options(url, **kwargs): def head(url, **kwargs): - """Sends a HEAD request. Returns :class:`Response` object. + """Sends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', False) return request('head', url, **kwargs) -def post(url, data=None, **kwargs): - """Sends a POST request. Returns :class:`Response` object. +def post(url, data=None, json=None, **kwargs): + """Sends a POST request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ - return request('post', url, data=data, **kwargs) + return request('post', url, data=data, json=json, **kwargs) def put(url, data=None, **kwargs): - """Sends a PUT request. Returns :class:`Response` object. + """Sends a PUT request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ return request('put', url, data=data, **kwargs) def patch(url, data=None, **kwargs): - """Sends a PATCH request. Returns :class:`Response` object. + """Sends a PATCH request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ return request('patch', url, data=data, **kwargs) def delete(url, **kwargs): - """Sends a DELETE request. Returns :class:`Response` object. + """Sends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :return: :class:`Response ` object + :rtype: requests.Response """ return request('delete', url, **kwargs) diff --git a/vendor/requests/auth.py b/vendor/requests/auth.py index 6664cd80..49bcb24a 100644 --- a/vendor/requests/auth.py +++ b/vendor/requests/auth.py @@ -11,15 +11,14 @@ import os import re import time import hashlib -import logging +import threading from base64 import b64encode from .compat import urlparse, str from .cookies import extract_cookies_to_jar -from .utils import parse_dict_header - -log = logging.getLogger(__name__) +from .utils import parse_dict_header, to_native_string +from .status_codes import codes CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' @@ -28,7 +27,11 @@ CONTENT_TYPE_MULTI_PART = 'multipart/form-data' def _basic_auth_str(username, password): """Returns a Basic Auth string.""" - return 'Basic ' + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip().decode('latin1') + authstr = 'Basic ' + to_native_string( + b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() + ) + + return authstr class AuthBase(object): @@ -40,10 +43,20 @@ class AuthBase(object): class HTTPBasicAuth(AuthBase): """Attaches HTTP Basic Authentication to the given Request object.""" + def __init__(self, username, password): self.username = username self.password = password + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other + def __call__(self, r): r.headers['Authorization'] = _basic_auth_str(self.username, self.password) return r @@ -51,6 +64,7 @@ class HTTPBasicAuth(AuthBase): class HTTPProxyAuth(HTTPBasicAuth): """Attaches HTTP Proxy Authentication to a given Request object.""" + def __call__(self, r): r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) return r @@ -58,21 +72,34 @@ class HTTPProxyAuth(HTTPBasicAuth): class HTTPDigestAuth(AuthBase): """Attaches HTTP Digest Authentication to the given Request object.""" + def __init__(self, username, password): self.username = username self.password = password - self.last_nonce = '' - self.nonce_count = 0 - self.chal = {} - self.pos = None + # Keep state in per-thread local storage + self._thread_local = threading.local() + + def init_per_thread_state(self): + # Ensure state is initialized just once per-thread + if not hasattr(self._thread_local, 'init'): + self._thread_local.init = True + self._thread_local.last_nonce = '' + self._thread_local.nonce_count = 0 + self._thread_local.chal = {} + self._thread_local.pos = None + self._thread_local.num_401_calls = None def build_digest_header(self, method, url): + """ + :rtype: str + """ - realm = self.chal['realm'] - nonce = self.chal['nonce'] - qop = self.chal.get('qop') - algorithm = self.chal.get('algorithm') - opaque = self.chal.get('opaque') + realm = self._thread_local.chal['realm'] + nonce = self._thread_local.chal['nonce'] + qop = self._thread_local.chal.get('qop') + algorithm = self._thread_local.chal.get('algorithm') + opaque = self._thread_local.chal.get('opaque') + hash_utf8 = None if algorithm is None: _algorithm = 'MD5' @@ -100,7 +127,8 @@ class HTTPDigestAuth(AuthBase): # XXX not implemented yet entdig = None p_parsed = urlparse(url) - path = p_parsed.path + #: path is request-uri defined in RFC 2616 which should not be empty + path = p_parsed.path or "/" if p_parsed.query: path += '?' + p_parsed.query @@ -110,30 +138,32 @@ class HTTPDigestAuth(AuthBase): HA1 = hash_utf8(A1) HA2 = hash_utf8(A2) - if nonce == self.last_nonce: - self.nonce_count += 1 + if nonce == self._thread_local.last_nonce: + self._thread_local.nonce_count += 1 else: - self.nonce_count = 1 - ncvalue = '%08x' % self.nonce_count - s = str(self.nonce_count).encode('utf-8') + self._thread_local.nonce_count = 1 + ncvalue = '%08x' % self._thread_local.nonce_count + s = str(self._thread_local.nonce_count).encode('utf-8') s += nonce.encode('utf-8') s += time.ctime().encode('utf-8') s += os.urandom(8) cnonce = (hashlib.sha1(s).hexdigest()[:16]) - noncebit = "%s:%s:%s:%s:%s" % (nonce, ncvalue, cnonce, qop, HA2) if _algorithm == 'MD5-SESS': HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) - if qop is None: + if not qop: respdig = KD(HA1, "%s:%s" % (nonce, HA2)) elif qop == 'auth' or 'auth' in qop.split(','): + noncebit = "%s:%s:%s:%s:%s" % ( + nonce, ncvalue, cnonce, 'auth', HA2 + ) respdig = KD(HA1, noncebit) else: # XXX handle auth-int. return None - self.last_nonce = nonce + self._thread_local.last_nonce = nonce # XXX should the partial digests be encoded too? base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ @@ -149,26 +179,34 @@ class HTTPDigestAuth(AuthBase): return 'Digest %s' % (base) - def handle_401(self, r, **kwargs): - """Takes the given response and tries digest-auth, if needed.""" + def handle_redirect(self, r, **kwargs): + """Reset num_401_calls counter on redirects.""" + if r.is_redirect: + self._thread_local.num_401_calls = 1 - if self.pos is not None: + def handle_401(self, r, **kwargs): + """ + Takes the given response and tries digest-auth, if needed. + + :rtype: requests.Response + """ + + if self._thread_local.pos is not None: # Rewind the file position indicator of the body to where # it was to resend the request. - r.request.body.seek(self.pos) - num_401_calls = getattr(self, 'num_401_calls', 1) + r.request.body.seek(self._thread_local.pos) s_auth = r.headers.get('www-authenticate', '') - if 'digest' in s_auth.lower() and num_401_calls < 2: + if 'digest' in s_auth.lower() and self._thread_local.num_401_calls < 2: - setattr(self, 'num_401_calls', num_401_calls + 1) + self._thread_local.num_401_calls += 1 pat = re.compile(r'digest ', flags=re.IGNORECASE) - self.chal = parse_dict_header(pat.sub('', s_auth, count=1)) + self._thread_local.chal = parse_dict_header(pat.sub('', s_auth, count=1)) # Consume content and release the original connection # to allow our new request to reuse the same one. r.content - r.raw.release_conn() + r.close() prep = r.request.copy() extract_cookies_to_jar(prep._cookies, r.request, r.raw) prep.prepare_cookies(prep._cookies) @@ -181,16 +219,34 @@ class HTTPDigestAuth(AuthBase): return _r - setattr(self, 'num_401_calls', 1) + self._thread_local.num_401_calls = 1 return r def __call__(self, r): + # Initialize per-thread state, if needed + self.init_per_thread_state() # If we have a saved nonce, skip the 401 - if self.last_nonce: + if self._thread_local.last_nonce: r.headers['Authorization'] = self.build_digest_header(r.method, r.url) try: - self.pos = r.body.tell() + self._thread_local.pos = r.body.tell() except AttributeError: - pass + # In the case of HTTPDigestAuth being reused and the body of + # the previous request was a file-like object, pos has the + # file position of the previous body. Ensure it's set to + # None. + self._thread_local.pos = None r.register_hook('response', self.handle_401) + r.register_hook('response', self.handle_redirect) + self._thread_local.num_401_calls = 1 + return r + + def __eq__(self, other): + return all([ + self.username == getattr(other, 'username', None), + self.password == getattr(other, 'password', None) + ]) + + def __ne__(self, other): + return not self == other diff --git a/vendor/requests/cacert.pem b/vendor/requests/cacert.pem index 729fe15d..6a66daa9 100644 --- a/vendor/requests/cacert.pem +++ b/vendor/requests/cacert.pem @@ -1,83 +1,3 @@ -# This Source Code Form is subject to the terms of the Mozilla Public -# License, v. 2.0. If a copy of the MPL was not distributed with this -# file, You can obtain one at http://mozilla.org/MPL/2.0/. - -# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. -# Label: "GTE CyberTrust Global Root" -# Serial: 421 -# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db -# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 -# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- - -# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Server CA" -# Serial: 1 -# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d -# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c -# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- - -# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division -# Label: "Thawte Premium Server CA" -# Serial: 1 -# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a -# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a -# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- # Issuer: O=Equifax OU=Equifax Secure Certificate Authority # Subject: O=Equifax OU=Equifax Secure Certificate Authority @@ -106,55 +26,6 @@ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 -----END CERTIFICATE----- -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 149843929435818692848040365716851702463 -# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 -# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 -# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- - -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network -# Label: "Verisign Class 3 Public Primary Certification Authority - G2" -# Serial: 167285380242319648451154478808036881606 -# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 -# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f -# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- - # Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA # Label: "GlobalSign Root CA" @@ -214,84 +85,6 @@ AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== -----END CERTIFICATE----- -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority -# Label: "ValiCert Class 1 VA" -# Serial: 1 -# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb -# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e -# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority -# Label: "ValiCert Class 2 VA" -# Serial: 1 -# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 -# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 -# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- - -# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority -# Label: "RSA Root Certificate 1" -# Serial: 1 -# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 -# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb -# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- - # Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only # Label: "Verisign Class 3 Public Primary Certification Authority - G3" @@ -356,42 +149,6 @@ fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== -----END CERTIFICATE----- -# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited -# Label: "Entrust.net Secure Server CA" -# Serial: 927650371 -# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee -# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 -# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- - # Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited # Label: "Entrust.net Premium 2048 Secure Server CA" @@ -454,54 +211,6 @@ ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp -----END CERTIFICATE----- -# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure Global eBusiness CA" -# Serial: 1 -# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc -# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 -# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- - -# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. -# Label: "Equifax Secure eBusiness CA 1" -# Serial: 4 -# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d -# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 -# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- - # Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network # Label: "AddTrust Low-Value Services Root" @@ -831,77 +540,6 @@ OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS -----END CERTIFICATE----- -# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc. -# Label: "America Online Root Certification Authority 1" -# Serial: 1 -# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e -# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a -# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3 ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- - -# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc. -# Label: "America Online Root Certification Authority 2" -# Serial: 1 -# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf -# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84 -# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- - # Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association # Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association # Label: "Visa eCommerce Root" @@ -1272,39 +910,6 @@ u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== -----END CERTIFICATE----- -# Issuer: O=TDC Internet OU=TDC Internet Root CA -# Subject: O=TDC Internet OU=TDC Internet Root CA -# Label: "TDC Internet Root CA" -# Serial: 986490188 -# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e -# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a -# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7 ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- - # Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com # Label: "UTN DATACorp SGC Root CA" @@ -1490,84 +1095,6 @@ f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK 8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI -----END CERTIFICATE----- -# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Business (Class B) Root" -# Serial: 105 -# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 -# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af -# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- - -# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok -# Label: "NetLock Express (Class C) Root" -# Serial: 104 -# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 -# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b -# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- - # Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com # Label: "XRamp Global CA Root" @@ -1757,40 +1284,6 @@ LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl pYYsfPQS -----END CERTIFICATE----- -# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068 -# Label: "Firmaprofesional Root CA" -# Serial: 1 -# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df -# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c -# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05 ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= ------END CERTIFICATE----- - # Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services # Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services # Label: "Swisscom Root CA 1" @@ -2014,38 +1507,6 @@ rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= -----END CERTIFICATE----- -# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. -# Label: "TURKTRUST Certificate Services Provider Root 1" -# Serial: 1 -# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5 -# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9 -# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0 ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- - # Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 # Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005 # Label: "TURKTRUST Certificate Services Provider Root 2" @@ -2617,152 +2078,6 @@ t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== -----END CERTIFICATE----- -# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A. -# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A." -# Serial: 38908203973182606954752843738508300 -# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6 -# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36 -# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c ------BEGIN CERTIFICATE----- -MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx -CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp -ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa -QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw -NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft -ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu -QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq -hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG -qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL -fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ -Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4 -Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ -54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b -MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j -ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej -YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt -A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF -rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ -pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE -AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB -lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy -YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50 -7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs -YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6 -xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc -unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/ -Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp -ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42 -gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0 -jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+ -XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD -W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/ -RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r -MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk -BYn8eNZcLCZDqQ== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA -# Label: "TC TrustCenter Class 2 CA II" -# Serial: 941389028203453866782103406992443 -# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23 -# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e -# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4 ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf -tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg -uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J -XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK -8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99 -5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3 -kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS -GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt -ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8 -au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV -hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI -dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA -# Label: "TC TrustCenter Class 3 CA II" -# Serial: 1506523511417715638772220530020799 -# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e -# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5 -# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e ------BEGIN CERTIFICATE----- -MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV -BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0 -Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1 -OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i -SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc -VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW -Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q -Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2 -1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq -ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1 -Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud -EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX -XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy -dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6 -Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz -JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290 -Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u -TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN -irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8 -TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6 -g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB -95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj -S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A== ------END CERTIFICATE----- - -# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA -# Label: "TC TrustCenter Universal CA I" -# Serial: 601024842042189035295619584734726 -# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c -# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3 -# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7 ------BEGIN CERTIFICATE----- -MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL -MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV -BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1 -c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx -MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg -R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD -VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR -JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T -fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu -jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z -wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ -fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD -VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO -BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G -CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1 -7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn -8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs -ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT -ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/ -2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY ------END CERTIFICATE----- - # Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center # Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center # Label: "Deutsche Telekom Root CA 2" @@ -2793,36 +2108,6 @@ xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU Cm26OWMohpLzGITY+9HPBVZkVw== -----END CERTIFICATE----- -# Issuer: CN=ComSign Secured CA O=ComSign -# Subject: CN=ComSign Secured CA O=ComSign -# Label: "ComSign Secured CA" -# Serial: 264725503855295744117309814499492384489 -# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5 -# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a -# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2 ------BEGIN CERTIFICATE----- -MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw -PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu -MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx -GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL -MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf -HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh -gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW -v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue -Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr -9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt -6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7 -MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl -Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58 -ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq -hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p -iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC -dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL -kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL -hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz -OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw== ------END CERTIFICATE----- - # Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc # Subject: CN=Cybertrust Global Root O=Cybertrust, Inc # Label: "Cybertrust Global Root" @@ -2960,34 +2245,6 @@ h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho -----END CERTIFICATE----- -# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327 -# Label: "Buypass Class 3 CA 1" -# Serial: 2 -# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b -# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71 -# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24 ------BEGIN CERTIFICATE----- -MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd -MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg -Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL -MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD -VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg -isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z -NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI -+MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R -hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+ -mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD -AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP -Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s -EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2 -mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC -e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow -dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915 ------END CERTIFICATE----- - # Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. # Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. # Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1" @@ -3535,28 +2792,6 @@ r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK Z05phkOTOPu220+DkdRgfks+KzgHVZhepA== -----END CERTIFICATE----- -# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority -# Label: "Verisign Class 3 Public Primary Certification Authority" -# Serial: 80507572722862485515306429940691309246 -# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 -# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b -# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i -2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ -2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ ------END CERTIFICATE----- - # Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd. # Label: "Microsec e-Szigno Root CA 2009" @@ -3589,36 +2824,6 @@ tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW -----END CERTIFICATE----- -# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S. -# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi" -# Serial: 91184789765598910059173000485363494069 -# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b -# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34 -# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98 ------BEGIN CERTIFICATE----- -MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1 -MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp -Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp -a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx -MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg -R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg -U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD -ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU -MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT -L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H -5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC -90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1 -c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/ -BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE -VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP -qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S -/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj -/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X -KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq -fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX ------END CERTIFICATE----- - # Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3 # Label: "GlobalSign Root CA - R3" @@ -5024,3 +4229,1388 @@ wa19hAM8EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWz aGHQRiapIVJpLesux+t3zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmy KwbQBM0= -----END CERTIFICATE----- + +# Issuer: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Subject: CN=TeliaSonera Root CA v1 O=TeliaSonera +# Label: "TeliaSonera Root CA v1" +# Serial: 199041966741090107964904287217786801558 +# MD5 Fingerprint: 37:41:49:1b:18:56:9a:26:f5:ad:c2:66:fb:40:a5:4c +# SHA1 Fingerprint: 43:13:bb:96:f1:d5:86:9b:c1:4e:6a:92:f6:cf:f6:34:69:87:82:37 +# SHA256 Fingerprint: dd:69:36:fe:21:f8:f0:77:c1:23:a1:a5:21:c1:22:24:f7:22:55:b7:3e:03:a7:26:06:93:e8:a2:4b:0f:a3:89 +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAw +NzEUMBIGA1UECgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJv +b3QgQ0EgdjEwHhcNMDcxMDE4MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYD +VQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwWVGVsaWFTb25lcmEgUm9vdCBDQSB2 +MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+6yfwIaPzaSZVfp3F +VRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA3GV1 +7CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+X +Z75Ljo1kB1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+ +/jXh7VB7qTCNGdMJjmhnXb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs +81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxHoLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkm +dtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3F0fUTPHSiXk+TT2YqGHe +Oh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJoWjiUIMu +sDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4 +pgd7gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fs +slESl1MpWtTwEhDcTwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQ +arMCpgKIv7NHfirZ1fpoeDVNAgMBAAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYD +VR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qWDNXr+nuqF+gTEjANBgkqhkiG +9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNmzqjMDfz1mgbl +dxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1Tj +TQpgcmLNkQfWpb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBed +Y2gea+zDTYa4EzAvXUYNR0PVG6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7 +Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpcc41teyWRyu5FrgZLAMzTsVlQ2jqI +OylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOTJsjrDNYmiLbAJM+7 +vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2qReW +t88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcn +HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx +SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +# Issuer: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Subject: CN=E-Tugra Certification Authority O=E-Tuğra EBG Bilişim Teknolojileri ve Hizmetleri A.Ş. OU=E-Tugra Sertifikasyon Merkezi +# Label: "E-Tugra Certification Authority" +# Serial: 7667447206703254355 +# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 +# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 +# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV +BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC +aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV +BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 +Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz +MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ +BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp +em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY +B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH +D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF +Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo +q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D +k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH +fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut +dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM +ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 +zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX +U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 +Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 +XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF +Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR +HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY +GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c +77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 ++GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK +vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 +FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl +yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P +AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD +y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d +NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +# Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center +# Label: "T-TeleSec GlobalRoot Class 2" +# Serial: 1 +# MD5 Fingerprint: 2b:9b:9e:e4:7b:6c:1f:00:72:1a:cc:c1:77:79:df:6a +# SHA1 Fingerprint: 59:0d:2d:7d:88:4f:40:2e:61:7e:a5:62:32:17:65:cf:17:d8:94:e9 +# SHA256 Fingerprint: 91:e2:f5:78:8d:58:10:eb:a7:ba:58:73:7d:e1:54:8a:8e:ca:cd:01:45:98:bc:0b:14:3e:04:1b:17:05:25:52 +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx +KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd +BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl +YyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgxMDAxMTA0MDE0WhcNMzMxMDAxMjM1 +OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy +aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50 +ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUd +AqSzm1nzHoqvNK38DcLZSBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiC +FoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/FvudocP05l03Sx5iRUKrERLMjfTlH6VJi +1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx9702cu+fjOlbpSD8DT6Iavq +jnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGVWOHAD3bZ +wI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGj +QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/ +WSA2AHmgoCJrjNXyYdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhy +NsZt+U2e+iKo4YFWz827n+qrkRk4r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPAC +uvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNfvNoBYimipidx5joifsFvHZVw +IEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR3p1m0IvVVGb6 +g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlP +BSeOE6Fuwg== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot 2011 O=Atos +# Subject: CN=Atos TrustedRoot 2011 O=Atos +# Label: "Atos TrustedRoot 2011" +# Serial: 6643877497813316402 +# MD5 Fingerprint: ae:b9:c4:32:4b:ac:7f:5d:66:cc:77:94:bb:2a:77:56 +# SHA1 Fingerprint: 2b:b1:f5:3e:55:0c:1d:c5:f1:d4:e6:b7:6a:46:4b:55:06:02:ac:21 +# SHA256 Fingerprint: f3:56:be:a2:44:b7:a9:1e:b3:5d:53:ca:9a:d7:86:4a:ce:01:8e:2d:35:d5:f8:f9:6d:df:68:a6:f4:1a:a4:74 +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UE +AwwVQXRvcyBUcnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQG +EwJERTAeFw0xMTA3MDcxNDU4MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMM +FUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsGA1UECgwEQXRvczELMAkGA1UEBhMC +REUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCVhTuXbyo7LjvPpvMp +Nb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr54rM +VD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+ +SZFhyBH+DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ +4J7sVaE3IqKHBAUsR320HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0L +cp2AMBYHlT8oDv3FdU9T1nSatCQujgKRz3bFmx5VdJx4IbHwLfELn8LVlhgf8FQi +eowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7Rl+lwrrw7GWzbITAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZbNshMBgG +A1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3 +DQEBCwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8j +vZfza1zv7v1Apt+hk6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kP +DpFrdRbhIfzYJsdHt6bPWHJxfrrhTZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pc +maHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a961qn8FYiqTxlVMYVqL2Gns2D +lmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G3mB/ufNPRJLv +KrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 1 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 1 G3" +# Serial: 687049649626669250736271037606554624078720034195 +# MD5 Fingerprint: a4:bc:5b:3f:fe:37:9a:fa:64:f0:e2:fa:05:3d:0b:ab +# SHA1 Fingerprint: 1b:8e:ea:57:96:29:1a:c9:39:ea:b8:0a:81:1a:73:73:c0:93:79:67 +# SHA256 Fingerprint: 8a:86:6f:d1:b2:76:b5:7e:57:8e:92:1c:65:82:8a:2b:ed:58:e9:f2:f2:88:05:41:34:b7:f1:f4:bf:c9:cc:74 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00 +MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakEPBtV +wedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWe +rNrwU8lmPNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF341 +68Xfuw6cwI2H44g4hWf6Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh +4Pw5qlPafX7PGglTvF0FBM+hSo+LdoINofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXp +UhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/lg6AnhF4EwfWQvTA9xO+o +abw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV7qJZjqlc +3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/G +KubX9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSt +hfbZxbGL0eUQMk1fiyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KO +Tk0k+17kBL5yG6YnLUlamXrXXAkgt3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOt +zCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZIhvcNAQELBQAD +ggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2 +cDMT/uFPpiN3GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUN +qXsCHKnQO18LwIE6PWThv6ctTr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5 +YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP+V04ikkwj+3x6xn0dxoxGE1nVGwv +b2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh3jRJjehZrJ3ydlo2 +8hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fawx/k +NSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNj +ZgKAvQU6O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhp +q1467HxpvMc7hU6eFbm0FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFt +nh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOVhMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 2 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 2 G3" +# Serial: 390156079458959257446133169266079962026824725800 +# MD5 Fingerprint: af:0c:86:6e:bf:40:2d:7f:0b:3e:12:50:ba:12:3d:06 +# SHA1 Fingerprint: 09:3c:61:f3:8b:8b:dc:7d:55:df:75:38:02:05:00:e1:25:f5:c8:36 +# SHA256 Fingerprint: 8f:e4:fb:0a:f9:3a:4d:0d:67:db:0b:eb:b2:3e:37:c7:1b:f3:25:dc:bc:dd:24:0e:a0:4d:af:58:b4:7e:18:40 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00 +MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFhZiFf +qq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMW +n4rjyduYNM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ym +c5GQYaYDFCDy54ejiK2toIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+ +O7q414AB+6XrW7PFXmAqMaCvN+ggOp+oMiwMzAkd056OXbxMmO7FGmh77FOm6RQ1 +o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+lV0POKa2Mq1W/xPtbAd0j +IaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZoL1NesNKq +IcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz +8eQQsSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43eh +vNURG3YBZwjgQQvD6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l +7ZizlWNof/k19N+IxWA1ksB8aRxhlRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALG +cC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZIhvcNAQELBQAD +ggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RC +roijQ1h5fq7KpVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0Ga +W/ZZGYjeVYg3UQt4XAoeo0L9x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4n +lv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgzdWqTHBLmYF5vHX/JHyPLhGGfHoJE ++V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6XU/IyAgkwo1jwDQHV +csaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+NwmNtd +dbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNg +KCLjsZWDzYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeM +HVOyToV7BjjHLPj4sHKNJeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4 +WSr2Rz0ZiC3oheGe7IUIarFsNMkd7EgrO3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +# Issuer: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Subject: CN=QuoVadis Root CA 3 G3 O=QuoVadis Limited +# Label: "QuoVadis Root CA 3 G3" +# Serial: 268090761170461462463995952157327242137089239581 +# MD5 Fingerprint: df:7d:b9:ad:54:6f:68:a1:df:89:57:03:97:43:b0:d7 +# SHA1 Fingerprint: 48:12:bd:92:3c:a8:c4:39:06:e7:30:6d:27:96:e6:a4:cf:22:2e:7d +# SHA256 Fingerprint: 88:ef:81:de:20:2e:b0:18:45:2e:43:f8:64:72:5c:ea:5f:bd:1f:c2:d9:d2:05:73:07:09:c5:d8:b8:69:0f:46 +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQEL +BQAwSDELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAc +BgNVBAMTFVF1b1ZhZGlzIFJvb3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00 +MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMgRzMwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286IxSR +/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNu +FoM7pmRLMon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXR +U7Ox7sWTaYI+FrUoRqHe6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+c +ra1AdHkrAj80//ogaX3T7mH1urPnMNA3I4ZyYUUpSFlob3emLoG+B01vr87ERROR +FHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3UVDmrJqMz6nWB2i3ND0/k +A9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f75li59wzw +eyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634Ryl +sSqiMd5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBp +VzgeAVuNVejH38DMdyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0Q +A4XN8f+MFrXBsj6IbGB/kE+V9/YtrQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ +ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZIhvcNAQELBQAD +ggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnI +FUBhynLWcKzSt/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5Wvv +oxXqA/4Ti2Tk08HS6IT7SdEQTXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFg +u/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9DuDcpmvJRPpq3t/O5jrFc/ZSXPsoaP +0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGibIh6BJpsQBJFxwAYf +3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmDhPbl +8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+ +DhcI00iX0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HN +PlopNLk9hM6xZdRZkZFWdSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ +ywaZWWDYWGWVjUTR939+J399roD1B0y2PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G2" +# Serial: 15385348160840213938643033620894905419 +# MD5 Fingerprint: 92:38:b9:f8:63:24:82:65:2c:57:33:e6:fe:81:8f:9d +# SHA1 Fingerprint: a1:4b:48:d9:43:ee:0a:0e:40:90:4f:3c:e0:a4:c0:91:93:51:5d:3f +# SHA256 Fingerprint: 7d:05:eb:b6:82:33:9f:8c:94:51:ee:09:4e:eb:fe:fa:79:53:a1:14:ed:b2:f4:49:49:45:2f:ab:7d:2f:c1:85 +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBl +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv +b3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl +cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSA +n61UQbVH35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4Htecc +biJVMWWXvdMX0h5i89vqbFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9Hp +EgjAALAcKxHad3A2m67OeYfcgnDmCXRwVWmvo2ifv922ebPynXApVfSr/5Vh88lA +bx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OPYLfykqGxvYmJHzDNw6Yu +YjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+RnlTGNAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQW +BBTOw0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPI +QW5pJ6d1Ee88hjZv0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I +0jJmwYrA8y8678Dj1JGG0VDjA9tzd29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4Gni +lmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAWhsI6yLETcDbYz+70CjTVW0z9 +B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0MjomZmWzwPDCv +ON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Assured ID Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Assured ID Root G3" +# Serial: 15459312981008553731928384953135426796 +# MD5 Fingerprint: 7c:7f:65:31:0c:81:df:8d:ba:3e:99:e2:5c:ad:6e:fb +# SHA1 Fingerprint: f5:17:a2:4f:9a:48:c6:c9:f8:a2:00:26:9f:dc:0f:48:2c:ab:30:89 +# SHA256 Fingerprint: 7e:37:cb:8b:4c:47:09:0c:ab:36:55:1b:a6:f4:5d:b8:40:68:0f:ba:16:6a:95:2d:b1:00:71:7f:43:05:3f:c2 +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3Qg +RzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJf +Zn4f5dwbRXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17Q +RSAPWXYQ1qAk8C3eNvJsKTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/ +BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgFUaFNN6KDec6NHSrkhDAKBggqhkjOPQQD +AwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5FyYZ5eEJJZVrmDxxDnOOlY +JjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy1vUhZscv +6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G2 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G2" +# Serial: 4293743540046975378534879503202253541 +# MD5 Fingerprint: e4:a6:8a:c8:54:ac:52:42:46:0a:fd:72:48:1b:2a:44 +# SHA1 Fingerprint: df:3c:24:f9:bf:d6:66:76:1b:26:80:73:fe:06:d1:cc:8d:4f:82:a4 +# SHA256 Fingerprint: cb:3c:cb:b7:60:31:e5:e0:13:8f:8d:d3:9a:23:f9:de:47:ff:c3:5e:43:c1:14:4c:ea:27:d4:6a:5a:b1:cb:5f +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBh +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBH +MjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVT +MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j +b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI +2/Ou8jqJkTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx +1x7e/dfgy5SDN67sH0NO3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQ +q2EGnI/yuum06ZIya7XzV+hdG82MHauVBJVJ8zUtluNJbd134/tJS7SsVQepj5Wz +tCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyMUNGPHgm+F6HmIcr9g+UQ +vIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV +5uNu5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY +1Yl9PMWLSn/pvtsrF9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4 +NeF22d+mQrvHRAiGfzZ0JFrabA0UWTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NG +Fdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBHQRFXGU7Aj64GxJUTFy8bJZ91 +8rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/iyK5S9kJRaTe +pLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Global Root G3 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Global Root G3" +# Serial: 7089244469030293291760083333884364146 +# MD5 Fingerprint: f5:5d:a4:50:a5:fb:28:7e:1e:0f:0d:cc:96:57:56:ca +# SHA1 Fingerprint: 7e:04:de:89:6a:3e:66:6d:00:e6:87:d3:3f:fa:d9:3b:e8:3d:34:9e +# SHA256 Fingerprint: 31:ad:66:48:f8:10:41:38:c7:38:f3:9e:a4:32:01:33:39:3e:3a:18:cc:02:29:6e:f9:7c:2a:c9:ef:67:31:d0 +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQsw +CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu +ZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAe +Fw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAwMDBaMGExCzAJBgNVBAYTAlVTMRUw +EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x +IDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0CAQYF +K4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FG +fp4tn+6OYwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPO +Z9wj/wMco+I+o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAd +BgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNpYim8S8YwCgYIKoZIzj0EAwMDaAAwZQIx +AK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y3maTD/HMsQmP3Wyr+mt/ +oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34VOKa5Vt8 +sycX +-----END CERTIFICATE----- + +# Issuer: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Subject: CN=DigiCert Trusted Root G4 O=DigiCert Inc OU=www.digicert.com +# Label: "DigiCert Trusted Root G4" +# Serial: 7451500558977370777930084869016614236 +# MD5 Fingerprint: 78:f2:fc:aa:60:1f:2f:b4:eb:c9:37:ba:53:2e:75:49 +# SHA1 Fingerprint: dd:fb:16:cd:49:31:c9:73:a2:03:7d:3f:c8:3a:4d:7d:77:5d:05:e4 +# SHA256 Fingerprint: 55:2f:7b:dc:f1:a7:af:9e:6c:e6:72:01:7f:4f:12:ab:f7:72:40:c7:8e:76:1a:c2:03:d1:d9:d2:0a:c8:99:88 +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBi +MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg +RzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQu +Y29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3y +ithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1If +xp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDV +ySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiO +DCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQ +jdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/ +CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCi +EhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADM +fRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QY +uKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXK +chYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t +9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB +hjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2 +SV1EY+CtnJYYZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd ++SeuMIW59mdNOj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWc +fFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqa +sjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9N +cCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N +0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie +4u1Ki7wb/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mI +r/OSmbaz5mEP0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1 +/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCm +gKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+ +-----END CERTIFICATE----- + +# Issuer: CN=Certification Authority of WoSign O=WoSign CA Limited +# Subject: CN=Certification Authority of WoSign O=WoSign CA Limited +# Label: "WoSign" +# Serial: 125491772294754854453622855443212256657 +# MD5 Fingerprint: a1:f2:f9:b5:d2:c8:7a:74:b8:f3:05:f1:d7:e1:84:8d +# SHA1 Fingerprint: b9:42:94:bf:91:ea:8f:b6:4b:e6:10:97:c7:fb:00:13:59:b6:76:cb +# SHA256 Fingerprint: 4b:22:d5:a6:ae:c9:9f:3c:db:79:aa:5e:c0:68:38:47:9c:d5:ec:ba:71:64:f7:f2:2d:c1:d6:5f:63:d8:57:08 +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBV +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNV +BAMTIUNlcnRpZmljYXRpb24gQXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgw +MTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFX +b1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvcqN +rLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1U +fcIiePyOCbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcScc +f+Hb0v1naMQFXQoOXXDX2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2 +ZjC1vt7tj/id07sBMOby8w7gLJKA84X5KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4M +x1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR+ScPewavVIMYe+HdVHpR +aG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ezEC8wQjch +zDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDar +uHqklWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221K +mYo0SLwX3OSACCK28jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvA +Sh0JWzko/amrzgD5LkhLJuYwTKVYyrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWv +HYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0CAwEAAaNCMEAwDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R8bNLtwYgFP6H +EtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJ +MuYhOZO9sxXqT2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2e +JXLOC62qx1ViC777Y7NhRCOjy+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VN +g64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC2nz4SNAzqfkHx5Xh9T71XXG68pWp +dIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes5cVAWubXbHssw1ab +R80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/EaEQ +PkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGce +xGATVdVhmVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+ +J7x6v+Db9NpSvd4MVHAxkUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMl +OtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGikpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWT +ee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +# Issuer: CN=CA 沃通根证书 O=WoSign CA Limited +# Subject: CN=CA 沃通根证书 O=WoSign CA Limited +# Label: "WoSign China" +# Serial: 106921963437422998931660691310149453965 +# MD5 Fingerprint: 78:83:5b:52:16:76:c4:24:3b:83:78:e8:ac:da:9a:93 +# SHA1 Fingerprint: 16:32:47:8d:89:f9:21:3a:92:00:85:63:f5:a4:a7:d3:12:40:8a:d6 +# SHA256 Fingerprint: d6:f0:34:bd:94:aa:23:3f:02:97:ec:a4:24:5b:28:39:73:e4:47:aa:59:0f:31:0c:77:f4:8f:df:83:11:22:54 +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBG +MQswCQYDVQQGEwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNV +BAMMEkNBIOayg+mAmuagueivgeS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgw +MTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRl +ZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjANBgkqhkiG9w0BAQEF +AAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k8H/r +D195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld1 +9AXbbQs5uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExf +v5RxadmWPgxDT74wwJ85dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnk +UkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+L +NVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFyb7Ao65vh4YOhn0pdr8yb ++gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc76DbT52V +qyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6K +yX2m+Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0G +AbQOXDBGVWCvOGU6yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaK +J/kR8slC/k7e3x9cxKSGhxYzoacXGKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwEC +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUAA4ICAQBqinA4 +WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj +/feTZU7n85iYr83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6 +jBAyvd0zaziGfjk9DgNyp115j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2 +ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0AkLppRQjbbpCBhqcqBT/mhDn4t/lX +X0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97qA4bLJyuQHCH2u2n +FoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Yjj4D +u9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10l +O1Hm13ZBONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Le +ie2uPAmvylezkolwQOQvT8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR1 +2KvxAmLBsX5VYc8T1yaw15zLKYs4SgsOkI26oQ== +-----END CERTIFICATE----- + +# Issuer: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Subject: CN=COMODO RSA Certification Authority O=COMODO CA Limited +# Label: "COMODO RSA Certification Authority" +# Serial: 101909084537582093308941363524873193117 +# MD5 Fingerprint: 1b:31:b0:71:40:36:cc:14:36:91:ad:c4:3e:fd:ec:18 +# SHA1 Fingerprint: af:e5:d2:44:a8:d1:19:42:30:ff:47:9f:e2:f8:97:bb:cd:7a:8c:b4 +# SHA256 Fingerprint: 52:f0:e1:c4:e5:8e:c6:29:29:1b:60:31:7f:07:46:71:b8:5d:7e:a8:0d:5b:07:27:34:63:53:4b:32:b4:02:34 +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust RSA Certification Authority O=The USERTRUST Network +# Label: "USERTrust RSA Certification Authority" +# Serial: 2645093764781058787591871645665788717 +# MD5 Fingerprint: 1b:fe:69:d1:91:b7:19:33:a3:72:a8:0f:e1:55:e5:b5 +# SHA1 Fingerprint: 2b:8f:1b:57:33:0d:bb:a2:d0:7a:6c:51:f7:0e:e9:0d:da:b9:ad:8e +# SHA256 Fingerprint: e7:93:c9:b0:2f:d8:aa:13:e2:1c:31:22:8a:cc:b0:81:19:64:3b:74:9c:89:89:64:b1:74:6d:46:c3:d4:cb:d2 +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCB +iDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0pl +cnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNV +BAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAw +MjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNV +BAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK +AoICAQCAEmUXNg7D2wiz0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B +3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2jY0K2dvKpOyuR+OJv0OwWIJAJPuLodMkY +tJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFnRghRy4YUVD+8M/5+bJz/ +Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O+T23LLb2 +VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT +79uq/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6 +c0Plfg6lZrEpfDKEY1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmT +Yo61Zs8liM2EuLE/pDkP2QKe6xJMlXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97l +c6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8yexDJtC/QV9AqURE9JnnV4ee +UB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+eLf8ZxXhyVeE +Hg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8G +A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPF +Up/L+M+ZBn8b2kMVn54CVVeWFPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KO +VWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ7l8wXEskEVX/JJpuXior7gtNn3/3 +ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQEg9zKC7F4iRO/Fjs +8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM8WcR +iQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYze +Sf7dNXGiFSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZ +XHlKYC6SQK5MNyosycdiyA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/ +qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9cJ2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRB +VXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGwsAvgnEzDHNb842m1R0aB +L6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gxQ+6IHdfG +jjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +# Issuer: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Subject: CN=USERTrust ECC Certification Authority O=The USERTRUST Network +# Label: "USERTrust ECC Certification Authority" +# Serial: 123013823720199481456569720443997572134 +# MD5 Fingerprint: fa:68:bc:d9:b5:7f:ad:fd:c9:1d:06:83:28:cc:24:c1 +# SHA1 Fingerprint: d1:cb:ca:5d:b2:d5:2a:7f:69:3b:67:4d:e5:f0:5a:1d:0c:95:7d:f0 +# SHA256 Fingerprint: 4f:f4:60:d5:4b:9c:86:da:bf:bc:fc:57:12:e0:40:0d:2b:ed:3f:bc:4d:4f:bd:aa:86:e0:6a:dc:d2:a9:ad:7a +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDEL +MAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNl +eSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMT +JVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMjAx +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT +Ck5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUg +VVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqflo +I+d61SRvU8Za2EurxtW20eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinng +o4N+LZfQYcTxmdwlkWOrfzCjtHDix6EznPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0G +A1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBBHU6+4WMB +zzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbW +RNZu9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R4 +# Label: "GlobalSign ECC Root CA - R4" +# Serial: 14367148294922964480859022125800977897474 +# MD5 Fingerprint: 20:f0:27:68:d1:7e:a0:9d:0e:e6:2a:ca:df:5c:89:8e +# SHA1 Fingerprint: 69:69:56:2e:40:80:f4:24:a1:e7:19:9f:14:ba:f3:ee:58:ab:6a:bb +# SHA256 Fingerprint: be:c9:49:11:c2:95:56:76:db:6c:0a:55:09:86:d7:6e:3b:a0:05:66:7c:44:2c:97:62:b4:fb:b7:73:de:22:8c +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ +FspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw +DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F +uOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX +kPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs +ewv4n4Q= +-----END CERTIFICATE----- + +# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign ECC Root CA - R5 +# Label: "GlobalSign ECC Root CA - R5" +# Serial: 32785792099990507226680698011560947931244 +# MD5 Fingerprint: 9f:ad:3b:1c:02:1e:8a:ba:17:74:38:81:0c:a2:bc:08 +# SHA1 Fingerprint: 1f:24:c6:30:cd:a4:18:ef:20:69:ff:ad:4f:dd:5f:46:3a:1b:69:aa +# SHA256 Fingerprint: 17:9f:bc:14:8a:3d:d0:0f:d2:4e:a1:34:58:cc:43:bf:a7:f5:9c:81:82:d7:83:a5:13:f6:eb:ec:10:0c:89:24 +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk +MCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH +bG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX +DTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD +QSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu +MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc +8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke +hOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI +KoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg +515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO +xwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden Root CA - G3 O=Staat der Nederlanden +# Label: "Staat der Nederlanden Root CA - G3" +# Serial: 10003001 +# MD5 Fingerprint: 0b:46:67:07:db:10:2f:19:8c:35:50:60:d1:0b:f4:37 +# SHA1 Fingerprint: d8:eb:6b:41:51:92:59:e0:f3:e7:85:00:c0:3d:b6:88:97:c9:ee:fc +# SHA256 Fingerprint: 3c:4f:b0:b9:5a:b8:b3:00:32:f4:32:b8:6f:53:5f:e1:72:c1:85:d0:fd:39:86:58:37:cf:36:18:7f:a6:f4:28 +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloX +DTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl +ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv +b3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4yolQP +cPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WW +IkYFsO2tx1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqX +xz8ecAgwoNzFs21v0IJyEavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFy +KJLZWyNtZrVtB0LrpjPOktvA9mxjeM3KTj215VKb8b475lRgsGYeCasH/lSJEULR +9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUurmkVLoR9BvUhTFXFkC4az +5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU51nus6+N8 +6U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7 +Ngzp07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHP +bMk7ccHViLVlvMDoFxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXt +BznaqB16nzaeErAMZRKQFWDZJkBE41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTt +XUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMBAAGjQjBAMA8GA1UdEwEB/wQF +MAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleuyjWcLhL75Lpd +INyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwp +LiniyMMB8jPqKqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8 +Ipf3YF3qKS9Ysr1YvY2WTxB1v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixp +gZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA8KCWAg8zxXHzniN9lLf9OtMJgwYh +/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b8KKaa8MFSu1BYBQw +0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0rmj1A +fsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq +4BZ+Extq1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR +1VmiiXTTn74eS9fGbbeIJG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/ +QFH1T/U67cjF68IeHRaVesd+QnGTbksVtzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM +94B7IWcnMFk= +-----END CERTIFICATE----- + +# Issuer: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Subject: CN=Staat der Nederlanden EV Root CA O=Staat der Nederlanden +# Label: "Staat der Nederlanden EV Root CA" +# Serial: 10000013 +# MD5 Fingerprint: fc:06:af:7b:e8:1a:f1:9a:b4:e8:d2:70:1f:c0:f5:ba +# SHA1 Fingerprint: 76:e2:7e:c1:4f:db:82:c1:c0:a6:75:b5:05:be:3d:29:b4:ed:db:bb +# SHA256 Fingerprint: 4d:24:91:41:4c:fe:95:67:46:ec:4c:ef:a6:cf:6f:72:e2:8a:13:29:43:2f:9d:8a:90:7a:c4:cb:5d:ad:c1:5a +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJO +TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFh +dCBkZXIgTmVkZXJsYW5kZW4gRVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0y +MjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5MMR4wHAYDVQQKDBVTdGFhdCBkZXIg +TmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRlcmxhbmRlbiBFViBS +b290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkkSzrS +M4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nC +UiY4iKTWO0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3d +Z//BYY1jTw+bbRcwJu+r0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46p +rfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13l +pJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gVXJrm0w912fxBmJc+qiXb +j5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr08C+eKxC +KFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS +/ZbV0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0X +cgOPvZuM5l5Tnrmd74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH +1vI4gnPah1vlPNOePqc7nvQDs/nxfRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrP +px9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwaivsnuL8wbqg7 +MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u +2dfOWBfoqSmuc0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHS +v4ilf0X8rLiltTMMgsT7B/Zq5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTC +wPTxGfARKbalGAKb12NMcIxHowNDXLldRqANb/9Zjr7dn3LDWyvfjFvO5QxGbJKy +CqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tNf1zuacpzEPuKqf2e +vTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi5Dp6 +Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIa +Gl6I6lD4WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeL +eG9QgkRQP2YGiqtDhFZKDyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8 +FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGyeUN51q1veieQA6TqJIc/2b3Z6fJfUEkc +7uzXLg== +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Commercial Root CA 1 O=IdenTrust +# Label: "IdenTrust Commercial Root CA 1" +# Serial: 13298821034946342390520003877796839426 +# MD5 Fingerprint: b3:3e:77:73:75:ee:a0:d3:e3:7e:49:63:49:59:bb:c7 +# SHA1 Fingerprint: df:71:7e:aa:4a:d9:4e:c9:55:84:99:60:2d:48:de:5f:bc:f0:3a:25 +# SHA256 Fingerprint: 5d:56:49:9b:e4:d2:e0:8b:cf:ca:d0:8a:3e:38:72:3d:50:50:3b:de:70:69:48:e4:2f:55:60:30:19:e5:28:ae +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBK +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVu +VHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQw +MTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MScw +JQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEwggIiMA0GCSqG +SIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ldhNlT +3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU ++ehcCuz/mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gp +S0l4PJNgiCL8mdo2yMKi1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1 +bVoE/c40yiTcdCMbXTMTEl3EASX2MN0CXZ/g1Ue9tOsbobtJSdifWwLziuQkkORi +T0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl3ZBWzvurpWCdxJ35UrCL +vYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzyNeVJSQjK +Vsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZK +dHzVWYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHT +c+XvvqDtMwt0viAgxGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hv +l7yTmvmcEpB4eoCHFddydJxVdHixuuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5N +iGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZIhvcNAQELBQAD +ggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwt +LRvM7Kqas6pgghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93 +nAbowacYXVKV7cndJZ5t+qntozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3 ++wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmVYjzlVYA211QC//G5Xc7UI2/YRYRK +W2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUXfeu+h1sXIFRRk0pT +AwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/rokTLq +l1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG +4iZZRHUe2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZ +mUlO+KWA2yUPHGNiiskzZ2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A +7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7RcGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +# Issuer: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Subject: CN=IdenTrust Public Sector Root CA 1 O=IdenTrust +# Label: "IdenTrust Public Sector Root CA 1" +# Serial: 13298821034946342390521976156843933698 +# MD5 Fingerprint: 37:06:a5:b0:fc:89:9d:ba:f4:6b:8c:1a:64:cd:d5:ba +# SHA1 Fingerprint: ba:29:41:60:77:98:3f:f4:f3:ef:f2:31:05:3b:2e:ea:6d:4d:45:fd +# SHA256 Fingerprint: 30:d0:89:5a:9a:44:8a:26:20:91:63:55:22:d1:f5:20:10:b5:86:7a:ca:e1:2c:78:ef:95:8f:d4:f4:38:9f:2f +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBN +MQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVu +VHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcN +MzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJVUzESMBAGA1UEChMJSWRlblRydXN0 +MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBSb290IENBIDEwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTyP4o7 +ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGy +RBb06tD6Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlS +bdsHyo+1W/CD80/HLaXIrcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF +/YTLNiCBWS2ab21ISGHKTN9T0a9SvESfqy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R +3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoSmJxZZoY+rfGwyj4GD3vw +EUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFnol57plzy +9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9V +GxyhLrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ +2fjXctscvG29ZV/viDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsV +WaFHVCkugyhfHMKiq3IXAAaOReyL4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gD +W/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMwDQYJKoZIhvcN +AQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHV +DRDtfULAj+7AmgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9 +TaDKQGXSc3z1i9kKlT/YPyNtGtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8G +lwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFtm6/n6J91eEyrRjuazr8FGF1NFTwW +mhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMxNRF4eKLg6TCMf4Df +WN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4Mhn5 ++bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJ +tshquDDIajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhA +GaQdp/lLQzfcaFpPz+vCZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv +8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - G2 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2009 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - G2" +# Serial: 1246989352 +# MD5 Fingerprint: 4b:e2:c9:91:96:65:0c:f4:0e:5a:93:92:a0:0a:fe:b2 +# SHA1 Fingerprint: 8c:f4:27:fd:79:0c:3a:d1:66:06:8d:e8:1e:57:ef:bb:93:22:72:d4 +# SHA256 Fingerprint: 43:df:57:74:b0:3e:7f:ef:5f:e4:0d:93:1a:7b:ed:f1:bb:2e:6b:42:73:8c:4e:6d:38:41:10:3d:3a:a7:f3:39 +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50 +cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3Qs +IEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVz +dCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwHhcNMDkwNzA3MTcy +NTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUVu +dHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwt +dGVybXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0 +aG9yaXplZCB1c2Ugb25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP/vaCeb9zYQYKpSfYs1/T +RU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXzHHfV1IWN +cCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hW +wcKUs/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1 +U1+cPvQXLOZprE4yTGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0 +jaWvYkxN4FisZDQSA/i2jZRjJKRxAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ60B7vfec7aVHUbI2fkBJmqzAN +BgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5ZiXMRrEPR9RP/ +jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v +1fN2D807iDginWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4R +nAuknZoh8/CbCzB428Hch0P+vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmH +VHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xOe4pIb4tF9g== +-----END CERTIFICATE----- + +# Issuer: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Subject: CN=Entrust Root Certification Authority - EC1 O=Entrust, Inc. OU=See www.entrust.net/legal-terms/(c) 2012 Entrust, Inc. - for authorized use only +# Label: "Entrust Root Certification Authority - EC1" +# Serial: 51543124481930649114116133369 +# MD5 Fingerprint: b6:7e:1d:f0:58:c5:49:6c:24:3b:3d:ed:98:18:ed:bc +# SHA1 Fingerprint: 20:d8:06:40:df:9b:25:f5:12:25:3a:11:ea:f7:59:8a:eb:14:b5:47 +# SHA256 Fingerprint: 02:ed:0e:b2:8c:14:da:45:16:5c:56:67:91:70:0d:64:51:d7:fb:56:f0:b2:ab:1d:3b:8e:b0:70:e5:6e:df:f5 +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkG +A1UEBhMCVVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3 +d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVu +dHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25seTEzMDEGA1UEAxMq +RW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxMB4XDTEy +MTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYwFAYD +VQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0g +Zm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEVDMTB2MBAGByqGSM49AgEGBSuBBAAi +A2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHyAsWfoPZb1YsGGYZPUxBt +ByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef9eNi1KlH +Bz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVC +R98crlOZF7ZvHH3hvxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nX +hTcGtXsI/esni0qU+eH6p44mCOh8kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +# Issuer: CN=CFCA EV ROOT O=China Financial Certification Authority +# Subject: CN=CFCA EV ROOT O=China Financial Certification Authority +# Label: "CFCA EV ROOT" +# Serial: 407555286 +# MD5 Fingerprint: 74:e1:b6:ed:26:7a:7a:44:30:33:94:ab:7b:27:81:30 +# SHA1 Fingerprint: e2:b8:29:4b:55:84:ab:6b:58:c2:90:46:6c:ac:3f:b8:39:8f:84:83 +# SHA256 Fingerprint: 5c:c3:d7:8e:4e:1d:5e:45:54:7a:04:e6:87:3e:64:f9:0c:f9:53:6d:1c:cc:2e:f8:00:f3:55:c4:c5:fd:70:fd +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJD +TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y +aXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkx +MjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5j +aWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNBIEVWIFJP +T1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnVBU03 +sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpL +TIpTUnrD7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5 +/ZOkVIBMUtRSqy5J35DNuF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp +7hZZLDRJGqgG16iI0gNyejLi6mhNbiyWZXvKWfry4t3uMCz7zEasxGPrb382KzRz +EpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7xzbh72fROdOXW3NiGUgt +hxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9fpy25IGvP +a931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqot +aK8KgWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNg +TnYGmE69g60dWIolhdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfV +PKPtl8MeNPo4+QgO48BdK4PRVmrJtqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hv +cWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAfBgNVHSMEGDAWgBTj/i39KNAL +tbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAd +BgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObT +ej/tUxPQ4i9qecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdL +jOztUmCypAbqTuv0axn96/Ua4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBS +ESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sGE5uPhnEFtC+NiWYzKXZUmhH4J/qy +P5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfXBDrDMlI1Dlb4pd19 +xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjnaH9d +Ci77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN +5mydLIhyPDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe +/v5WOaHIz16eGWRGENoXkbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+Z +AAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3CekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ +5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5" +# Serial: 156233699172481 +# MD5 Fingerprint: da:70:8e:f0:22:df:93:26:f6:5f:9f:d3:15:06:52:4e +# SHA1 Fingerprint: c4:18:f6:4d:46:d1:df:00:3d:27:30:13:72:43:a9:12:11:c6:75:fb +# SHA256 Fingerprint: 49:35:1b:90:34:44:c1:85:cc:dc:5c:69:3d:24:d8:55:5c:b2:08:d6:a8:14:13:07:69:9f:4a:f0:63:19:9d:78 +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UE +BhMCVFIxDzANBgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxn +aSDEsGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkg +QS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1QgRWxla3Ryb25payBTZXJ0aWZpa2Eg +SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAwODA3MDFaFw0yMzA0 +MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYD +VQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 +dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApCUZ4WWe60ghUEoI5RHwWrom +/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537jVJp45wnEFPzpALFp/kR +Gml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1mep5Fimh3 +4khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z +5UNP9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0 +hO8EuPbJbKoCPrZV4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QID +AQABo0IwQDAdBgNVHQ4EFgQUVpkHHtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/ +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAJ5FdnsX +SDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPoBP5yCccLqh0l +VX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nf +peYVhDfwwvJllpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CF +Yv4HAqGEVka+lgqaE9chTLd8B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW ++qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. +# Label: "TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6" +# Serial: 138134509972618 +# MD5 Fingerprint: f8:c5:ee:2a:6b:be:95:8d:08:f7:25:4a:ea:71:3e:46 +# SHA1 Fingerprint: 8a:5c:8c:ee:a5:03:e6:05:56:ba:d8:1b:d4:f6:c9:b0:ed:e5:2f:e0 +# SHA256 Fingerprint: 8d:e7:86:55:e1:be:7f:78:47:80:0b:93:f6:94:d2:1d:36:8c:c0:6e:03:3e:7f:ab:04:bb:5e:b9:9d:a6:b7:00 +-----BEGIN CERTIFICATE----- +MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQG +EwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdp +IMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBB +LsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBI +aXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5MDQxMFoXDTIzMTIx +NjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBLBgNV +BAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2 +ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVs +ZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdsGjW6L0UlqMACprx9MfMkU1x +eHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a2uqsxgbPJQ1BgfbBOCK9 ++bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EEDwnS3/faA +z1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0p +u5FbHH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6p +lVxiSvgNZ1GpryHV+DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMB +AAGjQjBAMB0GA1UdDgQWBBTdVRcT9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAb1gNl0Oq +FlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3RfdCaqaXKGDsC +QC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy +o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKID +gI6tflEATseWhvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm +9ocJV612ph1jmv3XZch4gyt1O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsG +tAuYSyher4hYyw== +-----END CERTIFICATE----- + +# Issuer: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Subject: CN=Certinomis - Root CA O=Certinomis OU=0002 433998903 +# Label: "Certinomis - Root CA" +# Serial: 1 +# MD5 Fingerprint: 14:0a:fd:8d:a8:28:b5:38:69:db:56:7e:61:22:03:3f +# SHA1 Fingerprint: 9d:70:bb:01:a5:a4:a0:18:11:2e:f7:1c:01:b9:32:c5:34:e7:88:a8 +# SHA256 Fingerprint: 2a:99:f5:bc:11:74:b7:3c:bb:1d:62:08:84:e0:1c:34:e5:1c:cb:39:78:da:12:5f:0e:33:26:88:83:bf:41:58 +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjET +MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAb +BgNVBAMTFENlcnRpbm9taXMgLSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMz +MTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMx +FzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRDZXJ0aW5vbWlzIC0g +Um9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQosP5L2 +fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJfl +LieY6pOod5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQV +WZUKxkd8aRi5pwP5ynapz8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDF +TKWrteoB4owuZH9kb/2jJZOLyKIOSY008B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb +5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09xRLWtwHkziOC/7aOgFLSc +CbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE6OXWk6Ri +wsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJ +wx3tFvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SG +m/lg0h9tkQPTYKbVPZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4 +F2iw4lNVYC2vPsKD2NkJK/DAZNuHi5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZng +WVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I6tNxIqSSaHh0 +2TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/ +0KGRHCwPT5iVWVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWw +F6YSjNRieOpWauwK0kDDPAUwPk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZS +g081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAXlCOotQqSD7J6wWAsOMwaplv/8gzj +qh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJy29SWwNyhlCVCNSN +h4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9Iff/ +ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8V +btaw5BngDwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwj +Y/M50n92Uaf0yKHxDHYiI0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ +8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nMcyrDflOR1m749fPH0FFNjkulW+YZFzvW +gQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVrhkIGuUE= +-----END CERTIFICATE----- +# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited +# Label: "Entrust.net Secure Server CA" +# Serial: 927650371 +# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee +# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39 +# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50 +-----BEGIN CERTIFICATE----- +MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC +VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u +ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc +KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u +ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 +MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE +ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j +b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF +bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg +U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA +A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ +I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 +wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC +AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb +oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 +BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p +dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk +MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp +b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu +dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 +MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi +E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa +MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI +hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN +95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd +2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority +# Label: "ValiCert Class 2 VA" +# Serial: 1 +# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87 +# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6 +# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy +NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY +dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 +WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS +v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v +UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu +IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC +W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Express (Class C) Root" +# Serial: 104 +# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4 +# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b +# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f +-----BEGIN CERTIFICATE----- +MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD +EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X +DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw +DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u +c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr +TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN +BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA +OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC +2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW +RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P +AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW +ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 +YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz +b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO +ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB +IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs +b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs +ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s +YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg +a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g +SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 +aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg +YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg +Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY +ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g +pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 +Fp1hBWeAyNDYpQcCNJgEjTME1A== +-----END CERTIFICATE----- + +# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok +# Label: "NetLock Business (Class B) Root" +# Serial: 105 +# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6 +# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af +# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12 +-----BEGIN CERTIFICATE----- +MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx +ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 +b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD +EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 +OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G +A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh +Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l +dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG +SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK +gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX +iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc +Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E +BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G +SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu +b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh +bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv +Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln +aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 +IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh +c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph +biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo +ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP +UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj +YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo +dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA +bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 +sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa +n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS +NitjrFgBazMpUIaD8QFI +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority +# Label: "RSA Root Certificate 1" +# Serial: 1 +# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72 +# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb +# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy +NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD +cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs +2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY +JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE +Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ +n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A +PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu +-----END CERTIFICATE----- + +# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority +# Label: "ValiCert Class 1 VA" +# Serial: 1 +# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb +# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e +# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04 +-----BEGIN CERTIFICATE----- +MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 +IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz +BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y +aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG +9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy +NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y +azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs +YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw +Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl +cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y +LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ +TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y +TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 +LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW +I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw +nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure eBusiness CA 1" +# Serial: 4 +# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d +# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41 +# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73 +-----BEGIN CERTIFICATE----- +MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT +ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw +MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j +LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ +KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo +RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu +WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw +Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD +AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK +eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM +zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ +WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN +/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== +-----END CERTIFICATE----- + +# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc. +# Label: "Equifax Secure Global eBusiness CA" +# Serial: 1 +# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc +# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45 +# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07 +-----BEGIN CERTIFICATE----- +MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc +MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT +ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw +MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj +dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l +c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC +UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc +58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ +o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH +MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr +aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA +A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA +Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv +8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Premium Server CA" +# Serial: 1 +# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a +# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a +# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72 +-----BEGIN CERTIFICATE----- +MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy +dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t +MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB +MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG +A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp +b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl +cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE +VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ +ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR +uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI +hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM +pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== +-----END CERTIFICATE----- + +# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division +# Label: "Thawte Server CA" +# Serial: 1 +# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d +# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c +# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9 +-----BEGIN CERTIFICATE----- +MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx +FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD +VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm +MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx +MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT +DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 +dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl +cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 +DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD +gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 +yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX +L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj +EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG +7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e +QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ +qdq5snUb9kLy78fyGPmJvKP/iiMucEc= +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 149843929435818692848040365716851702463 +# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67 +# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2 +# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do +lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc +AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority +# Label: "Verisign Class 3 Public Primary Certification Authority" +# Serial: 80507572722862485515306429940691309246 +# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4 +# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b +# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05 +-----BEGIN CERTIFICATE----- +MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG +A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz +cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 +MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV +BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE +BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is +I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G +CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i +2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ +2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ +-----END CERTIFICATE----- + +# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network +# Label: "Verisign Class 3 Public Primary Certification Authority - G2" +# Serial: 167285380242319648451154478808036881606 +# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9 +# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f +# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b +-----BEGIN CERTIFICATE----- +MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ +BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh +c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy +MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp +emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X +DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw +FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg +UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo +YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 +MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB +AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 +pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 +13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID +AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk +U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i +F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY +oJ2daZH9 +-----END CERTIFICATE----- + +# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc. +# Label: "GTE CyberTrust Global Root" +# Serial: 421 +# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db +# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74 +# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- diff --git a/vendor/requests/certs.py b/vendor/requests/certs.py index bc008261..f922b99d 100644 --- a/vendor/requests/certs.py +++ b/vendor/requests/certs.py @@ -2,8 +2,8 @@ # -*- coding: utf-8 -*- """ -certs.py -~~~~~~~~ +requests.certs +~~~~~~~~~~~~~~ This module returns the preferred default CA certificate bundle. @@ -11,14 +11,15 @@ If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. """ - import os.path - -def where(): - """Return the preferred certificate bundle.""" - # vendored bundle inside Requests - return os.path.join(os.path.dirname(__file__), 'cacert.pem') +try: + from certifi import where +except ImportError: + def where(): + """Return the preferred certificate bundle.""" + # vendored bundle inside Requests + return os.path.join(os.path.dirname(__file__), 'cacert.pem') if __name__ == '__main__': print(where()) diff --git a/vendor/requests/compat.py b/vendor/requests/compat.py index bdf10d6a..eb6530d6 100644 --- a/vendor/requests/compat.py +++ b/vendor/requests/compat.py @@ -1,7 +1,11 @@ # -*- coding: utf-8 -*- """ -pythoncompat +requests.compat +~~~~~~~~~~~~~~~ + +This module handles import compatibility issues between Python 2 and +Python 3. """ from .packages import chardet @@ -21,61 +25,11 @@ is_py2 = (_ver[0] == 2) #: Python 3.x? is_py3 = (_ver[0] == 3) -#: Python 3.0.x -is_py30 = (is_py3 and _ver[1] == 0) - -#: Python 3.1.x -is_py31 = (is_py3 and _ver[1] == 1) - -#: Python 3.2.x -is_py32 = (is_py3 and _ver[1] == 2) - -#: Python 3.3.x -is_py33 = (is_py3 and _ver[1] == 3) - -#: Python 3.4.x -is_py34 = (is_py3 and _ver[1] == 4) - -#: Python 2.7.x -is_py27 = (is_py2 and _ver[1] == 7) - -#: Python 2.6.x -is_py26 = (is_py2 and _ver[1] == 6) - -#: Python 2.5.x -is_py25 = (is_py2 and _ver[1] == 5) - -#: Python 2.4.x -is_py24 = (is_py2 and _ver[1] == 4) # I'm assuming this is not by choice. - - -# --------- -# Platforms -# --------- - - -# Syntax sugar. -_ver = sys.version.lower() - -is_pypy = ('pypy' in _ver) -is_jython = ('jython' in _ver) -is_ironpython = ('iron' in _ver) - -# Assume CPython, if nothing else. -is_cpython = not any((is_pypy, is_jython, is_ironpython)) - -# Windows-based system. -is_windows = 'win32' in str(sys.platform).lower() - -# Standard Linux 2+ system. -is_linux = ('linux' in str(sys.platform).lower()) -is_osx = ('darwin' in str(sys.platform).lower()) -is_hpux = ('hpux' in str(sys.platform).lower()) # Complete guess. -is_solaris = ('solar==' in str(sys.platform).lower()) # Complete guess. - try: import simplejson as json -except ImportError: +except (ImportError, SyntaxError): + # simplejson does not support Python 3.2, it throws a SyntaxError + # because of u'...' Unicode literals. import json # --------- @@ -90,7 +44,6 @@ if is_py2: from Cookie import Morsel from StringIO import StringIO from .packages.urllib3.packages.ordered_dict import OrderedDict - from httplib import IncompleteRead builtin_str = str bytes = str @@ -98,7 +51,6 @@ if is_py2: basestring = basestring numeric_types = (int, long, float) - elif is_py3: from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag from urllib.request import parse_http_list, getproxies, proxy_bypass @@ -106,7 +58,6 @@ elif is_py3: from http.cookies import Morsel from io import StringIO from collections import OrderedDict - from http.client import IncompleteRead builtin_str = str str = str diff --git a/vendor/requests/cookies.py b/vendor/requests/cookies.py index 831c49c6..41a2fde1 100644 --- a/vendor/requests/cookies.py +++ b/vendor/requests/cookies.py @@ -1,12 +1,17 @@ # -*- coding: utf-8 -*- """ +requests.cookies +~~~~~~~~~~~~~~~~ + Compatibility code to be able to use `cookielib.CookieJar` with requests. requests.utils imports from here, so be careful with imports. """ +import copy import time +import calendar import collections from .compat import cookielib, urlparse, urlunparse, Morsel @@ -129,7 +134,11 @@ def extract_cookies_to_jar(jar, request, response): def get_cookie_header(jar, request): - """Produce an appropriate Cookie header string to be sent with `request`, or None.""" + """ + Produce an appropriate Cookie header string to be sent with `request`, or None. + + :rtype: str + """ r = MockRequest(request) jar.add_cookie_header(r) return r.get_new_headers().get('Cookie') @@ -142,10 +151,13 @@ def remove_cookie_by_name(cookiejar, name, domain=None, path=None): """ clearables = [] for cookie in cookiejar: - if cookie.name == name: - if domain is None or domain == cookie.domain: - if path is None or path == cookie.path: - clearables.append((cookie.domain, cookie.path, cookie.name)) + if cookie.name != name: + continue + if domain is not None and domain != cookie.domain: + continue + if path is not None and path != cookie.path: + continue + clearables.append((cookie.domain, cookie.path, cookie.name)) for domain, path, name in clearables: cookiejar.clear(domain, path, name) @@ -153,30 +165,35 @@ def remove_cookie_by_name(cookiejar, name, domain=None, path=None): class CookieConflictError(RuntimeError): """There are two cookies that meet the criteria specified in the cookie jar. - Use .get and .set and include domain and path args in order to be more specific.""" + Use .get and .set and include domain and path args in order to be more specific. + """ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): - """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. + """Compatibility class; is a cookielib.CookieJar, but exposes a dict + interface. This is the CookieJar we create by default for requests and sessions that don't specify one, since some clients may expect response.cookies and session.cookies to support dict operations. - Don't use the dict interface internally; it's just for compatibility with - with external client code. All `requests` code should work out of the box - with externally provided instances of CookieJar, e.g., LWPCookieJar and - FileCookieJar. - - Caution: dictionary operations that are normally O(1) may be O(n). + Requests does not use the dict interface internally; it's just for + compatibility with external client code. All requests code should work + out of the box with externally provided instances of ``CookieJar``, e.g. + ``LWPCookieJar`` and ``FileCookieJar``. Unlike a regular CookieJar, this class is pickleable. + + .. warning:: dictionary operations that are normally O(1) may be O(n). """ def get(self, name, default=None, domain=None, path=None): """Dict-like get() that also supports optional domain and path args in order to resolve naming collisions from using one cookie jar over - multiple domains. Caution: operation is O(n), not O(1).""" + multiple domains. + + .. warning:: operation is O(n), not O(1). + """ try: return self._find_no_duplicates(name, domain, path) except KeyError: @@ -185,7 +202,8 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): def set(self, name, value, **kwargs): """Dict-like set() that also supports optional domain and path args in order to resolve naming collisions from using one cookie jar over - multiple domains.""" + multiple domains. + """ # support client code that unsets cookies by assignment of a None value: if value is None: remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) @@ -199,37 +217,55 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): return c def iterkeys(self): - """Dict-like iterkeys() that returns an iterator of names of cookies from the jar. - See itervalues() and iteritems().""" + """Dict-like iterkeys() that returns an iterator of names of cookies + from the jar. + + .. seealso:: itervalues() and iteritems(). + """ for cookie in iter(self): yield cookie.name def keys(self): - """Dict-like keys() that returns a list of names of cookies from the jar. - See values() and items().""" + """Dict-like keys() that returns a list of names of cookies from the + jar. + + .. seealso:: values() and items(). + """ return list(self.iterkeys()) def itervalues(self): - """Dict-like itervalues() that returns an iterator of values of cookies from the jar. - See iterkeys() and iteritems().""" + """Dict-like itervalues() that returns an iterator of values of cookies + from the jar. + + .. seealso:: iterkeys() and iteritems(). + """ for cookie in iter(self): yield cookie.value def values(self): - """Dict-like values() that returns a list of values of cookies from the jar. - See keys() and items().""" + """Dict-like values() that returns a list of values of cookies from the + jar. + + .. seealso:: keys() and items(). + """ return list(self.itervalues()) def iteritems(self): - """Dict-like iteritems() that returns an iterator of name-value tuples from the jar. - See iterkeys() and itervalues().""" + """Dict-like iteritems() that returns an iterator of name-value tuples + from the jar. + + .. seealso:: iterkeys() and itervalues(). + """ for cookie in iter(self): yield cookie.name, cookie.value def items(self): - """Dict-like items() that returns a list of name-value tuples from the jar. - See keys() and values(). Allows client-code to call "dict(RequestsCookieJar) - and get a vanilla python dict of key value pairs.""" + """Dict-like items() that returns a list of name-value tuples from the + jar. Allows client-code to call ``dict(RequestsCookieJar)`` and get a + vanilla python dict of key value pairs. + + .. seealso:: keys() and values(). + """ return list(self.iteritems()) def list_domains(self): @@ -250,7 +286,10 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): def multiple_domains(self): """Returns True if there are multiple domains in the jar. - Returns False otherwise.""" + Returns False otherwise. + + :rtype: bool + """ domains = [] for cookie in iter(self): if cookie.domain is not None and cookie.domain in domains: @@ -259,8 +298,12 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): return False # there is only one domain in jar def get_dict(self, domain=None, path=None): - """Takes as an argument an optional domain and path and returns a plain old - Python dict of name-value pairs of cookies that meet the requirements.""" + """Takes as an argument an optional domain and path and returns a plain + old Python dict of name-value pairs of cookies that meet the + requirements. + + :rtype: dict + """ dictionary = {} for cookie in iter(self): if (domain is None or cookie.domain == domain) and (path is None @@ -268,22 +311,32 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): dictionary[cookie.name] = cookie.value return dictionary - def __getitem__(self, name): - """Dict-like __getitem__() for compatibility with client code. Throws exception - if there are more than one cookie with name. In that case, use the more - explicit get() method instead. Caution: operation is O(n), not O(1).""" + def __contains__(self, name): + try: + return super(RequestsCookieJar, self).__contains__(name) + except CookieConflictError: + return True + def __getitem__(self, name): + """Dict-like __getitem__() for compatibility with client code. Throws + exception if there are more than one cookie with name. In that case, + use the more explicit get() method instead. + + .. warning:: operation is O(n), not O(1). + """ return self._find_no_duplicates(name) def __setitem__(self, name, value): - """Dict-like __setitem__ for compatibility with client code. Throws exception - if there is already a cookie of that name in the jar. In that case, use the more - explicit set() method instead.""" - + """Dict-like __setitem__ for compatibility with client code. Throws + exception if there is already a cookie of that name in the jar. In that + case, use the more explicit set() method instead. + """ self.set(name, value) def __delitem__(self, name): - """Deletes a cookie given a name. Wraps cookielib.CookieJar's remove_cookie_by_name().""" + """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s + ``remove_cookie_by_name()``. + """ remove_cookie_by_name(self, name) def set_cookie(self, cookie, *args, **kwargs): @@ -295,15 +348,22 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): """Updates this jar with cookies from another CookieJar or dict-like""" if isinstance(other, cookielib.CookieJar): for cookie in other: - self.set_cookie(cookie) + self.set_cookie(copy.copy(cookie)) else: super(RequestsCookieJar, self).update(other) def _find(self, name, domain=None, path=None): - """Requests uses this method internally to get cookie values. Takes as args name - and optional domain and path. Returns a cookie.value. If there are conflicting cookies, - _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown - if there are conflicting cookies.""" + """Requests uses this method internally to get cookie values. + + If there are conflicting cookies, _find arbitrarily chooses one. + See _find_no_duplicates if you want an exception thrown if there are + conflicting cookies. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :return: cookie.value + """ for cookie in iter(self): if cookie.name == name: if domain is None or cookie.domain == domain: @@ -313,10 +373,17 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) def _find_no_duplicates(self, name, domain=None, path=None): - """__get_item__ and get call _find_no_duplicates -- never used in Requests internally. - Takes as args name and optional domain and path. Returns a cookie.value. - Throws KeyError if cookie is not found and CookieConflictError if there are - multiple cookies that match name and optionally domain and path.""" + """Both ``__get_item__`` and ``get`` call this function: it's never + used elsewhere in Requests. + + :param name: a string containing name of cookie + :param domain: (optional) string containing domain of cookie + :param path: (optional) string containing path of cookie + :raises KeyError: if cookie is not found + :raises CookieConflictError: if there are multiple cookies + that match name and optionally domain and path + :return: cookie.value + """ toReturn = None for cookie in iter(self): if cookie.name == name: @@ -350,6 +417,21 @@ class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): return new_cj +def _copy_cookie_jar(jar): + if jar is None: + return None + + if hasattr(jar, 'copy'): + # We're dealing with an instance of RequestsCookieJar + return jar.copy() + # We're dealing with a generic CookieJar instance + new_jar = copy.copy(jar) + new_jar.clear() + for cookie in jar: + new_jar.set_cookie(copy.copy(cookie)) + return new_jar + + def create_cookie(name, value, **kwargs): """Make a cookie from underspecified parameters. @@ -390,11 +472,15 @@ def morsel_to_cookie(morsel): expires = None if morsel['max-age']: - expires = time.time() + morsel['max-age'] + try: + expires = int(time.time() + int(morsel['max-age'])) + except ValueError: + raise TypeError('max-age: %s must be integer' % morsel['max-age']) elif morsel['expires']: time_template = '%a, %d-%b-%Y %H:%M:%S GMT' - expires = time.mktime( - time.strptime(morsel['expires'], time_template)) - time.timezone + expires = calendar.timegm( + time.strptime(morsel['expires'], time_template) + ) return create_cookie( comment=morsel['comment'], comment_url=bool(morsel['comment']), @@ -440,7 +526,7 @@ def merge_cookies(cookiejar, cookies): """ if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') - + if isinstance(cookies, dict): cookiejar = cookiejar_from_dict( cookies, cookiejar=cookiejar, overwrite=False) diff --git a/vendor/requests/exceptions.py b/vendor/requests/exceptions.py index 7caf4db2..b89e0cc6 100644 --- a/vendor/requests/exceptions.py +++ b/vendor/requests/exceptions.py @@ -5,23 +5,29 @@ requests.exceptions ~~~~~~~~~~~~~~~~~~~ This module contains the set of Requests' exceptions. - """ +from .packages.urllib3.exceptions import HTTPError as BaseHTTPError class RequestException(IOError): """There was an ambiguous exception that occurred while handling your - request.""" + request. + """ + + def __init__(self, *args, **kwargs): + """Initialize RequestException with `request` and `response` objects.""" + response = kwargs.pop('response', None) + self.response = response + self.request = kwargs.pop('request', None) + if (response is not None and not self.request and + hasattr(response, 'request')): + self.request = self.response.request + super(RequestException, self).__init__(*args, **kwargs) class HTTPError(RequestException): """An HTTP error occurred.""" - def __init__(self, *args, **kwargs): - """ Initializes HTTPError with optional `response` object. """ - self.response = kwargs.pop('response', None) - super(HTTPError, self).__init__(*args, **kwargs) - class ConnectionError(RequestException): """A Connection error occurred.""" @@ -36,7 +42,23 @@ class SSLError(ConnectionError): class Timeout(RequestException): - """The request timed out.""" + """The request timed out. + + Catching this error will catch both + :exc:`~requests.exceptions.ConnectTimeout` and + :exc:`~requests.exceptions.ReadTimeout` errors. + """ + + +class ConnectTimeout(ConnectionError, Timeout): + """The request timed out while trying to connect to the remote server. + + Requests that produced this error are safe to retry. + """ + + +class ReadTimeout(Timeout): + """The server did not send any data in the allotted amount of time.""" class URLRequired(RequestException): @@ -56,12 +78,37 @@ class InvalidSchema(RequestException, ValueError): class InvalidURL(RequestException, ValueError): - """ The URL provided was somehow invalid. """ + """The URL provided was somehow invalid.""" + + +class InvalidHeader(RequestException, ValueError): + """The header value provided was somehow invalid.""" class ChunkedEncodingError(RequestException): """The server declared chunked encoding but sent an invalid chunk.""" -class ContentDecodingError(RequestException): +class ContentDecodingError(RequestException, BaseHTTPError): """Failed to decode response content""" + + +class StreamConsumedError(RequestException, TypeError): + """The content for this response was already consumed""" + + +class RetryError(RequestException): + """Custom retries logic failed""" + + +# Warnings + + +class RequestsWarning(Warning): + """Base warning for Requests.""" + pass + + +class FileModeWarning(RequestsWarning, DeprecationWarning): + """A file was opened in text mode, but Requests determined its binary length.""" + pass diff --git a/vendor/requests/hooks.py b/vendor/requests/hooks.py index 5dfaf6b6..32b32de7 100644 --- a/vendor/requests/hooks.py +++ b/vendor/requests/hooks.py @@ -10,36 +10,25 @@ Available hooks: ``response``: The response generated from a Request. - """ - - HOOKS = ['response'] def default_hooks(): - hooks = {} - for event in HOOKS: - hooks[event] = [] - return hooks + return dict((event, []) for event in HOOKS) # TODO: response is the only one def dispatch_hook(key, hooks, hook_data, **kwargs): """Dispatches a hook dictionary on a given piece of data.""" - hooks = hooks or dict() - - if key in hooks: - hooks = hooks.get(key) - + hooks = hooks.get(key) + if hooks: if hasattr(hooks, '__call__'): hooks = [hooks] - for hook in hooks: _hook_data = hook(hook_data, **kwargs) if _hook_data is not None: hook_data = _hook_data - return hook_data diff --git a/vendor/requests/models.py b/vendor/requests/models.py index 061c93b0..11434ef4 100644 --- a/vendor/requests/models.py +++ b/vendor/requests/models.py @@ -8,7 +8,6 @@ This module contains the primary objects that power Requests. """ import collections -import logging import datetime from io import BytesIO, UnsupportedOperation @@ -16,27 +15,40 @@ from .hooks import default_hooks from .structures import CaseInsensitiveDict from .auth import HTTPBasicAuth -from .cookies import cookiejar_from_dict, get_cookie_header +from .cookies import cookiejar_from_dict, get_cookie_header, _copy_cookie_jar from .packages.urllib3.fields import RequestField from .packages.urllib3.filepost import encode_multipart_formdata from .packages.urllib3.util import parse_url -from .packages.urllib3.exceptions import DecodeError +from .packages.urllib3.exceptions import ( + DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) from .exceptions import ( - HTTPError, RequestException, MissingSchema, InvalidURL, - ChunkedEncodingError, ContentDecodingError) + HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, + ContentDecodingError, ConnectionError, StreamConsumedError) from .utils import ( guess_filename, get_auth_from_url, requote_uri, stream_decode_response_unicode, to_key_val_list, parse_header_links, - iter_slices, guess_json_utf, super_len, to_native_string) + iter_slices, guess_json_utf, super_len, to_native_string, + check_header_validity) from .compat import ( cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, - is_py2, chardet, json, builtin_str, basestring, IncompleteRead) + is_py2, chardet, builtin_str, basestring) +from .compat import json as complexjson +from .status_codes import codes +#: The set of HTTP status codes that indicate an automatically +#: processable redirect. +REDIRECT_STATI = ( + codes.moved, # 301 + codes.found, # 302 + codes.other, # 303 + codes.temporary_redirect, # 307 + codes.permanent_redirect, # 308 +) + +DEFAULT_REDIRECT_LIMIT = 30 CONTENT_CHUNK_SIZE = 10 * 1024 ITER_CHUNK_SIZE = 512 -log = logging.getLogger(__name__) - class RequestEncodingMixin(object): @property @@ -92,9 +104,10 @@ class RequestEncodingMixin(object): """Build the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of - 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary + tuples. Order is retained if data is a list of tuples but arbitrary if parameters are supplied as a dict. - + The tuples may be 2-tuples (filename, fileobj), 3-tuples (filename, fileobj, contentype) + or 4-tuples (filename, fileobj, contentype, custom_headers). """ if (not files): raise ValueError("Files must be provided.") @@ -132,13 +145,13 @@ class RequestEncodingMixin(object): else: fn = guess_filename(v) or k fp = v - if isinstance(fp, str): - fp = StringIO(fp) - if isinstance(fp, bytes): - fp = BytesIO(fp) - rf = RequestField(name=k, data=fp.read(), - filename=fn, headers=fh) + if isinstance(fp, (str, bytes, bytearray)): + fdata = fp + else: + fdata = fp.read() + + rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) new_fields.append(rf) @@ -180,7 +193,8 @@ class Request(RequestHooksMixin): :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. - :param data: the body to attach the request. If a dictionary is provided, form-encoding will take place. + :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. + :param json: json for the body to attach to the request (if files or data is not specified). :param params: dictionary of URL parameters to append to the URL. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. @@ -192,18 +206,10 @@ class Request(RequestHooksMixin): >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> req.prepare() - """ - def __init__(self, - method=None, - url=None, - headers=None, - files=None, - data=None, - params=None, - auth=None, - cookies=None, - hooks=None): + + def __init__(self, method=None, url=None, headers=None, files=None, + data=None, params=None, auth=None, cookies=None, hooks=None, json=None): # Default empty dicts for dict params. data = [] if data is None else data @@ -221,6 +227,7 @@ class Request(RequestHooksMixin): self.headers = headers self.files = files self.data = data + self.json = json self.params = params self.auth = auth self.cookies = cookies @@ -237,6 +244,7 @@ class Request(RequestHooksMixin): headers=self.headers, files=self.files, data=self.data, + json=self.json, params=self.params, auth=self.auth, cookies=self.cookies, @@ -261,7 +269,6 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): >>> s = requests.Session() >>> s.send(r) - """ def __init__(self): @@ -280,15 +287,16 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.hooks = default_hooks() def prepare(self, method=None, url=None, headers=None, files=None, - data=None, params=None, auth=None, cookies=None, hooks=None): + data=None, params=None, auth=None, cookies=None, hooks=None, json=None): """Prepares the entire request with the given parameters.""" self.prepare_method(method) self.prepare_url(url, params) self.prepare_headers(headers) self.prepare_cookies(cookies) - self.prepare_body(data, files) + self.prepare_body(data, files, json) self.prepare_auth(auth, url) + # Note that prepare_auth must be last to enable authentication schemes # such as OAuth to work on a fully prepared request. @@ -302,8 +310,8 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): p = PreparedRequest() p.method = self.method p.url = self.url - p.headers = self.headers.copy() - p._cookies = self._cookies.copy() + p.headers = self.headers.copy() if self.headers is not None else None + p._cookies = _copy_cookie_jar(self._cookies) p.body = self.body p.hooks = self.hooks return p @@ -312,30 +320,38 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): """Prepares the given HTTP method.""" self.method = method if self.method is not None: - self.method = self.method.upper() + self.method = to_native_string(self.method.upper()) def prepare_url(self, url, params): """Prepares the given HTTP URL.""" #: Accept objects that have string representations. - try: - url = unicode(url) - except NameError: - # We're on Python 3. - url = str(url) - except UnicodeDecodeError: - pass + #: We're unable to blindly call unicode/str functions + #: as this will include the bytestring indicator (b'') + #: on python 3.x. + #: https://github.com/kennethreitz/requests/pull/2238 + if isinstance(url, bytes): + url = url.decode('utf8') + else: + url = unicode(url) if is_py2 else str(url) - # Don't do any URL preparation for oddball schemes + # Don't do any URL preparation for non-HTTP schemes like `mailto`, + # `data` etc to work around exceptions from `url_parse`, which + # handles RFC 3986 only. if ':' in url and not url.lower().startswith('http'): self.url = url return # Support for unicode domain names and paths. - scheme, auth, host, port, path, query, fragment = parse_url(url) + try: + scheme, auth, host, port, path, query, fragment = parse_url(url) + except LocationParseError as e: + raise InvalidURL(*e.args) if not scheme: - raise MissingSchema("Invalid URL {0!r}: No schema supplied. " - "Perhaps you meant http://{0}?".format(url)) + error = ("Invalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?") + error = error.format(to_native_string(url, 'utf8')) + + raise MissingSchema(error) if not host: raise InvalidURL("Invalid URL %r: No host supplied" % url) @@ -370,6 +386,9 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): if isinstance(fragment, str): fragment = fragment.encode('utf-8') + if isinstance(params, (str, bytes)): + params = to_native_string(params) + enc_params = self._encode_params(params) if enc_params: if query: @@ -383,12 +402,15 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): def prepare_headers(self, headers): """Prepares the given HTTP headers.""" + self.headers = CaseInsensitiveDict() if headers: - self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items()) - else: - self.headers = CaseInsensitiveDict() + for header in headers.items(): + # Raise exception on invalid header value. + check_header_validity(header) + name, value = header + self.headers[to_native_string(name)] = value - def prepare_body(self, data, files): + def prepare_body(self, data, files, json=None): """Prepares the given HTTP body data.""" # Check if file, fo, generator, iterator. @@ -399,11 +421,17 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): content_type = None length = None + if not data and json is not None: + # urllib3 requires a bytes-like body. Python 2's json.dumps + # provides this natively, but Python 3 gives a Unicode string. + content_type = 'application/json' + body = complexjson.dumps(json) + if not isinstance(body, bytes): + body = body.encode('utf-8') + is_stream = all([ hasattr(data, '__iter__'), - not isinstance(data, basestring), - not isinstance(data, list), - not isinstance(data, dict) + not isinstance(data, (basestring, list, tuple, dict)) ]) try: @@ -417,7 +445,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): if files: raise NotImplementedError('Streamed bodies and files are mutually exclusive.') - if length is not None: + if length: self.headers['Content-Length'] = builtin_str(length) else: self.headers['Transfer-Encoding'] = 'chunked' @@ -428,7 +456,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): else: if data: body = self._encode_params(data) - if isinstance(data, str) or isinstance(data, builtin_str) or hasattr(data, 'read'): + if isinstance(data, basestring) or hasattr(data, 'read'): content_type = None else: content_type = 'application/x-www-form-urlencoded' @@ -436,21 +464,23 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.prepare_content_length(body) # Add content-type if it wasn't explicitly provided. - if (content_type) and (not 'content-type' in self.headers): + if content_type and ('content-type' not in self.headers): self.headers['Content-Type'] = content_type self.body = body def prepare_content_length(self, body): if hasattr(body, 'seek') and hasattr(body, 'tell'): + curr_pos = body.tell() body.seek(0, 2) - self.headers['Content-Length'] = builtin_str(body.tell()) - body.seek(0, 0) + end_pos = body.tell() + self.headers['Content-Length'] = builtin_str(max(0, end_pos - curr_pos)) + body.seek(curr_pos, 0) elif body is not None: l = super_len(body) if l: self.headers['Content-Length'] = builtin_str(l) - elif self.method not in ('GET', 'HEAD'): + elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None): self.headers['Content-Length'] = '0' def prepare_auth(self, auth, url=''): @@ -476,8 +506,16 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): self.prepare_content_length(self.body) def prepare_cookies(self, cookies): - """Prepares the given HTTP cookie data.""" + """Prepares the given HTTP cookie data. + This function eventually generates a ``Cookie`` header from the + given cookies using cookielib. Due to cookielib's design, the header + will not be regenerated if it already exists, meaning this function + can only be called once for the life of the + :class:`PreparedRequest ` object. Any subsequent calls + to ``prepare_cookies`` will have no actual effect, unless the "Cookie" + header is removed beforehand. + """ if isinstance(cookies, cookielib.CookieJar): self._cookies = cookies else: @@ -489,6 +527,10 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): def prepare_hooks(self, hooks): """Prepares the given hooks.""" + # hooks can be passed as None to the prepare method and to this + # method. To prevent iterating over None, simply use an empty list + # if hooks is False-y + hooks = hooks or [] for event in hooks: self.register_hook(event, hooks[event]) @@ -499,16 +541,8 @@ class Response(object): """ __attrs__ = [ - '_content', - 'status_code', - 'headers', - 'url', - 'history', - 'encoding', - 'reason', - 'cookies', - 'elapsed', - 'request', + '_content', 'status_code', 'headers', 'url', 'history', + 'encoding', 'reason', 'cookies', 'elapsed', 'request' ] def __init__(self): @@ -517,7 +551,7 @@ class Response(object): self._content = False self._content_consumed = False - #: Integer Code of responded HTTP Status. + #: Integer Code of responded HTTP Status, e.g. 404 or 200. self.status_code = None #: Case-insensitive Dictionary of Response Headers. @@ -526,7 +560,7 @@ class Response(object): self.headers = CaseInsensitiveDict() #: File-like object representation of response (for advanced usage). - #: Requires that ``stream=True` on the request. + #: Use of ``raw`` requires that ``stream=True`` be set on the request. # This requirement does not apply for use internally to Requests. self.raw = None @@ -541,15 +575,24 @@ class Response(object): #: up here. The list is sorted from the oldest to the most recent request. self.history = [] + #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". self.reason = None #: A CookieJar of Cookies the server sent back. self.cookies = cookiejar_from_dict({}) #: The amount of time elapsed between sending the request - #: and the arrival of the response (as a timedelta) + #: and the arrival of the response (as a timedelta). + #: This property specifically measures the time taken between sending + #: the first byte of the request and finishing parsing the headers. It + #: is therefore unaffected by consuming the response content or the + #: value of the ``stream`` keyword argument. self.elapsed = datetime.timedelta(0) + #: The :class:`PreparedRequest ` object to which this + #: is a response. + self.request = None + def __getstate__(self): # Consume everything; accessing the content attribute makes # sure the content has been fully read. @@ -567,6 +610,7 @@ class Response(object): # pickled objects do not have .raw setattr(self, '_content_consumed', True) + setattr(self, 'raw', None) def __repr__(self): return '' % (self.status_code) @@ -587,14 +631,25 @@ class Response(object): def ok(self): try: self.raise_for_status() - except RequestException: + except HTTPError: return False return True + @property + def is_redirect(self): + """True if this Response is a well-formed HTTP redirect that could have + been processed automatically (by :meth:`Session.resolve_redirects`). + """ + return ('location' in self.headers and self.status_code in REDIRECT_STATI) + + @property + def is_permanent_redirect(self): + """True if this Response one of the permanent versions of redirect""" + return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) + @property def apparent_encoding(self): - """The apparent encoding, provided by the lovely Charade library - (Thanks, Ian!).""" + """The apparent encoding, provided by the chardet library""" return chardet.detect(self.content)['encoding'] def iter_content(self, chunk_size=1, decode_unicode=False): @@ -603,23 +658,30 @@ class Response(object): large responses. The chunk size is the number of bytes it should read into memory. This is not necessarily the length of each item returned as decoding can take place. + + chunk_size must be of type int or None. A value of None will + function differently depending on the value of `stream`. + stream=True will read data as it arrives in whatever size the + chunks are received. If stream=False, data is returned as + a single chunk. + + If decode_unicode is True, content will be decoded using the best + available encoding based on the response. """ - if self._content_consumed: - # simulate reading small chunks of the content - return iter_slices(self._content, chunk_size) def generate(): - try: - # Special case for urllib3. + # Special case for urllib3. + if hasattr(self.raw, 'stream'): try: - for chunk in self.raw.stream(chunk_size, - decode_content=True): + for chunk in self.raw.stream(chunk_size, decode_content=True): yield chunk - except IncompleteRead as e: + except ProtocolError as e: raise ChunkedEncodingError(e) except DecodeError as e: raise ContentDecodingError(e) - except AttributeError: + except ReadTimeoutError as e: + raise ConnectionError(e) + else: # Standard file-like object. while True: chunk = self.raw.read(chunk_size) @@ -629,27 +691,41 @@ class Response(object): self._content_consumed = True - gen = generate() + if self._content_consumed and isinstance(self._content, bool): + raise StreamConsumedError() + elif chunk_size is not None and not isinstance(chunk_size, int): + raise TypeError("chunk_size must be an int, it is instead a %s." % type(chunk_size)) + # simulate reading small chunks of the content + reused_chunks = iter_slices(self._content, chunk_size) + + stream_chunks = generate() + + chunks = reused_chunks if self._content_consumed else stream_chunks if decode_unicode: - gen = stream_decode_response_unicode(gen, self) + chunks = stream_decode_response_unicode(chunks, self) - return gen + return chunks - def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None): + def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): """Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. + + .. note:: This method is not reentrant safe. """ pending = None - for chunk in self.iter_content(chunk_size=chunk_size, - decode_unicode=decode_unicode): + for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): if pending is not None: chunk = pending + chunk - lines = chunk.splitlines() + + if delimiter: + lines = chunk.split(delimiter) + else: + lines = chunk.splitlines() if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: pending = lines.pop() @@ -693,7 +769,7 @@ class Response(object): If Response.encoding is None, encoding will be guessed using ``chardet``. - The encoding of the response content is determined based soley on HTTP + The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set ``r.encoding`` appropriately before accessing this property. @@ -730,15 +806,24 @@ class Response(object): :param \*\*kwargs: Optional arguments that ``json.loads`` takes. """ - if not self.encoding and len(self.content) > 3: + if not self.encoding and self.content and len(self.content) > 3: # No encoding set. JSON RFC 4627 section 3 states we should expect # UTF-8, -16 or -32. Detect which one to use; If the detection or # decoding fails, fall back to `self.text` (using chardet to make # a best guess). encoding = guess_json_utf(self.content) if encoding is not None: - return json.loads(self.content.decode(encoding), **kwargs) - return json.loads(self.text, **kwargs) + try: + return complexjson.loads( + self.content.decode(encoding), **kwargs + ) + except UnicodeDecodeError: + # Wrong UTF codec detected; usually because it's not UTF-8 + # but some other 8-bit codec. This is an RFC violation, + # and the server didn't bother to tell us what codec *was* + # used. + pass + return complexjson.loads(self.text, **kwargs) @property def links(self): @@ -762,20 +847,27 @@ class Response(object): """Raises stored :class:`HTTPError`, if one occurred.""" http_error_msg = '' + if isinstance(self.reason, bytes): + reason = self.reason.decode('utf-8', 'ignore') + else: + reason = self.reason if 400 <= self.status_code < 500: - http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) + http_error_msg = u'%s Client Error: %s for url: %s' % (self.status_code, reason, self.url) elif 500 <= self.status_code < 600: - http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) + http_error_msg = u'%s Server Error: %s for url: %s' % (self.status_code, reason, self.url) if http_error_msg: raise HTTPError(http_error_msg, response=self) def close(self): - """Closes the underlying file descriptor and releases the connection - back to the pool. + """Releases the connection back to the pool. Once this method has been + called the underlying ``raw`` object must not be accessed again. *Note: Should not normally need to be called explicitly.* """ + if not self._content_consumed: + self.raw.close() + return self.raw.release_conn() diff --git a/vendor/requests/packages/README.rst b/vendor/requests/packages/README.rst new file mode 100644 index 00000000..83e0c625 --- /dev/null +++ b/vendor/requests/packages/README.rst @@ -0,0 +1,11 @@ +If you are planning to submit a pull request to requests with any changes in +this library do not go any further. These are independent libraries which we +vendor into requests. Any changes necessary to these libraries must be made in +them and submitted as separate pull requests to those libraries. + +urllib3 pull requests go here: https://github.com/shazow/urllib3 + +chardet pull requests go here: https://github.com/chardet/chardet + +See https://github.com/kennethreitz/requests/pull/1812#issuecomment-30854316 +for the reasoning behind this. diff --git a/vendor/requests/packages/__init__.py b/vendor/requests/packages/__init__.py index d62c4b71..971c2ad0 100644 --- a/vendor/requests/packages/__init__.py +++ b/vendor/requests/packages/__init__.py @@ -1,3 +1,36 @@ -from __future__ import absolute_import +''' +Debian and other distributions "unbundle" requests' vendored dependencies, and +rewrite all imports to use the global versions of ``urllib3`` and ``chardet``. +The problem with this is that not only requests itself imports those +dependencies, but third-party code outside of the distros' control too. -from . import urllib3 +In reaction to these problems, the distro maintainers replaced +``requests.packages`` with a magical "stub module" that imports the correct +modules. The implementations were varying in quality and all had severe +problems. For example, a symlink (or hardlink) that links the correct modules +into place introduces problems regarding object identity, since you now have +two modules in `sys.modules` with the same API, but different identities:: + + requests.packages.urllib3 is not urllib3 + +With version ``2.5.2``, requests started to maintain its own stub, so that +distro-specific breakage would be reduced to a minimum, even though the whole +issue is not requests' fault in the first place. See +https://github.com/kennethreitz/requests/pull/2375 for the corresponding pull +request. +''' + +from __future__ import absolute_import +import sys + +try: + from . import urllib3 +except ImportError: + import urllib3 + sys.modules['%s.urllib3' % __name__] = urllib3 + +try: + from . import chardet +except ImportError: + import chardet + sys.modules['%s.chardet' % __name__] = chardet diff --git a/vendor/requests/packages/chardet/__init__.py b/vendor/requests/packages/chardet/__init__.py index e4f0799d..82c2a48d 100644 --- a/vendor/requests/packages/chardet/__init__.py +++ b/vendor/requests/packages/chardet/__init__.py @@ -15,7 +15,7 @@ # 02110-1301 USA ######################### END LICENSE BLOCK ######################### -__version__ = "2.2.1" +__version__ = "2.3.0" from sys import version_info diff --git a/vendor/requests/packages/chardet/chardetect.py b/vendor/requests/packages/chardet/chardetect.py index ecd0163b..ffe892f2 100644 --- a/vendor/requests/packages/chardet/chardetect.py +++ b/vendor/requests/packages/chardet/chardetect.py @@ -12,34 +12,68 @@ Example:: If no paths are provided, it takes its input from stdin. """ -from io import open -from sys import argv, stdin +from __future__ import absolute_import, print_function, unicode_literals + +import argparse +import sys +from io import open + +from chardet import __version__ from chardet.universaldetector import UniversalDetector -def description_of(file, name='stdin'): - """Return a string describing the probable encoding of a file.""" +def description_of(lines, name='stdin'): + """ + Return a string describing the probable encoding of a file or + list of strings. + + :param lines: The lines to get the encoding of. + :type lines: Iterable of bytes + :param name: Name of file or collection of lines + :type name: str + """ u = UniversalDetector() - for line in file: + for line in lines: u.feed(line) u.close() result = u.result if result['encoding']: - return '%s: %s with confidence %s' % (name, - result['encoding'], - result['confidence']) + return '{0}: {1} with confidence {2}'.format(name, result['encoding'], + result['confidence']) else: - return '%s: no result' % name + return '{0}: no result'.format(name) -def main(): - if len(argv) <= 1: - print(description_of(stdin)) - else: - for path in argv[1:]: - with open(path, 'rb') as f: - print(description_of(f, path)) +def main(argv=None): + ''' + Handles command line arguments and gets things started. + + :param argv: List of arguments, as if specified on the command-line. + If None, ``sys.argv[1:]`` is used instead. + :type argv: list of str + ''' + # Get command line arguments + parser = argparse.ArgumentParser( + description="Takes one or more file paths and reports their detected \ + encodings", + formatter_class=argparse.ArgumentDefaultsHelpFormatter, + conflict_handler='resolve') + parser.add_argument('input', + help='File whose encoding we would like to determine.', + type=argparse.FileType('rb'), nargs='*', + default=[sys.stdin]) + parser.add_argument('--version', action='version', + version='%(prog)s {0}'.format(__version__)) + args = parser.parse_args(argv) + + for f in args.input: + if f.isatty(): + print("You are running chardetect interactively. Press " + + "CTRL-D twice at the start of a blank line to signal the " + + "end of your input. If you want help, run chardetect " + + "--help\n", file=sys.stderr) + print(description_of(f, f.name)) if __name__ == '__main__': diff --git a/vendor/requests/packages/chardet/jpcntx.py b/vendor/requests/packages/chardet/jpcntx.py index f7f69ba4..59aeb6a8 100644 --- a/vendor/requests/packages/chardet/jpcntx.py +++ b/vendor/requests/packages/chardet/jpcntx.py @@ -177,6 +177,12 @@ class JapaneseContextAnalysis: return -1, 1 class SJISContextAnalysis(JapaneseContextAnalysis): + def __init__(self): + self.charset_name = "SHIFT_JIS" + + def get_charset_name(self): + return self.charset_name + def get_order(self, aBuf): if not aBuf: return -1, 1 @@ -184,6 +190,8 @@ class SJISContextAnalysis(JapaneseContextAnalysis): first_char = wrap_ord(aBuf[0]) if ((0x81 <= first_char <= 0x9F) or (0xE0 <= first_char <= 0xFC)): charLen = 2 + if (first_char == 0x87) or (0xFA <= first_char <= 0xFC): + self.charset_name = "CP932" else: charLen = 1 diff --git a/vendor/requests/packages/chardet/latin1prober.py b/vendor/requests/packages/chardet/latin1prober.py index ad695f57..eef35735 100644 --- a/vendor/requests/packages/chardet/latin1prober.py +++ b/vendor/requests/packages/chardet/latin1prober.py @@ -129,11 +129,11 @@ class Latin1Prober(CharSetProber): if total < 0.01: confidence = 0.0 else: - confidence = ((self._mFreqCounter[3] / total) - - (self._mFreqCounter[1] * 20.0 / total)) + confidence = ((self._mFreqCounter[3] - self._mFreqCounter[1] * 20.0) + / total) if confidence < 0.0: confidence = 0.0 # lower the confidence of latin1 so that other more accurate # detector can take priority. - confidence = confidence * 0.5 + confidence = confidence * 0.73 return confidence diff --git a/vendor/requests/packages/chardet/mbcssm.py b/vendor/requests/packages/chardet/mbcssm.py index 3f93cfb0..efe678ca 100644 --- a/vendor/requests/packages/chardet/mbcssm.py +++ b/vendor/requests/packages/chardet/mbcssm.py @@ -353,7 +353,7 @@ SJIS_cls = ( 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,1, # 78 - 7f - 3,3,3,3,3,3,3,3, # 80 - 87 + 3,3,3,3,3,2,2,3, # 80 - 87 3,3,3,3,3,3,3,3, # 88 - 8f 3,3,3,3,3,3,3,3, # 90 - 97 3,3,3,3,3,3,3,3, # 98 - 9f @@ -369,9 +369,8 @@ SJIS_cls = ( 2,2,2,2,2,2,2,2, # d8 - df 3,3,3,3,3,3,3,3, # e0 - e7 3,3,3,3,3,4,4,4, # e8 - ef - 4,4,4,4,4,4,4,4, # f0 - f7 - 4,4,4,4,4,0,0,0 # f8 - ff -) + 3,3,3,3,3,3,3,3, # f0 - f7 + 3,3,3,3,3,0,0,0) # f8 - ff SJIS_st = ( @@ -571,5 +570,3 @@ UTF8SMModel = {'classTable': UTF8_cls, 'stateTable': UTF8_st, 'charLenTable': UTF8CharLenTable, 'name': 'UTF-8'} - -# flake8: noqa diff --git a/vendor/requests/packages/chardet/sjisprober.py b/vendor/requests/packages/chardet/sjisprober.py index b173614e..cd0e9e70 100644 --- a/vendor/requests/packages/chardet/sjisprober.py +++ b/vendor/requests/packages/chardet/sjisprober.py @@ -47,7 +47,7 @@ class SJISProber(MultiByteCharSetProber): self._mContextAnalyzer.reset() def get_charset_name(self): - return "SHIFT_JIS" + return self._mContextAnalyzer.get_charset_name() def feed(self, aBuf): aLen = len(aBuf) diff --git a/vendor/requests/packages/chardet/universaldetector.py b/vendor/requests/packages/chardet/universaldetector.py index 9a03ad3d..476522b9 100644 --- a/vendor/requests/packages/chardet/universaldetector.py +++ b/vendor/requests/packages/chardet/universaldetector.py @@ -71,9 +71,9 @@ class UniversalDetector: if not self._mGotData: # If the data starts with BOM, we know it is UTF - if aBuf[:3] == codecs.BOM: + if aBuf[:3] == codecs.BOM_UTF8: # EF BB BF UTF-8 with BOM - self.result = {'encoding': "UTF-8", 'confidence': 1.0} + self.result = {'encoding': "UTF-8-SIG", 'confidence': 1.0} elif aBuf[:4] == codecs.BOM_UTF32_LE: # FF FE 00 00 UTF-32, little-endian BOM self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} diff --git a/vendor/requests/packages/urllib3/__init__.py b/vendor/requests/packages/urllib3/__init__.py index 73071f70..c3536742 100644 --- a/vendor/requests/packages/urllib3/__init__.py +++ b/vendor/requests/packages/urllib3/__init__.py @@ -1,17 +1,9 @@ -# urllib3/__init__.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - """ urllib3 - Thread-safe connection pooling and re-using. """ -__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' -__license__ = 'MIT' -__version__ = 'dev' - +from __future__ import absolute_import +import warnings from .connectionpool import ( HTTPConnectionPool, @@ -23,7 +15,10 @@ from . import exceptions from .filepost import encode_multipart_formdata from .poolmanager import PoolManager, ProxyManager, proxy_from_url from .response import HTTPResponse -from .util import make_headers, get_host, Timeout +from .util.request import make_headers +from .util.url import get_host +from .util.timeout import Timeout +from .util.retry import Retry # Set default logging handler to avoid "No handler found" warnings. @@ -35,8 +30,30 @@ except ImportError: def emit(self, record): pass +__author__ = 'Andrey Petrov (andrey.petrov@shazow.net)' +__license__ = 'MIT' +__version__ = '1.16' + +__all__ = ( + 'HTTPConnectionPool', + 'HTTPSConnectionPool', + 'PoolManager', + 'ProxyManager', + 'HTTPResponse', + 'Retry', + 'Timeout', + 'add_stderr_logger', + 'connection_from_url', + 'disable_warnings', + 'encode_multipart_formdata', + 'get_host', + 'make_headers', + 'proxy_from_url', +) + logging.getLogger(__name__).addHandler(NullHandler()) + def add_stderr_logger(level=logging.DEBUG): """ Helper for quickly adding a StreamHandler to the logger. Useful for @@ -51,8 +68,29 @@ def add_stderr_logger(level=logging.DEBUG): handler.setFormatter(logging.Formatter('%(asctime)s %(levelname)s %(message)s')) logger.addHandler(handler) logger.setLevel(level) - logger.debug('Added an stderr logging handler to logger: %s' % __name__) + logger.debug('Added a stderr logging handler to logger: %s', __name__) return handler # ... Clean up. del NullHandler + + +# All warning filters *must* be appended unless you're really certain that they +# shouldn't be: otherwise, it's very hard for users to use most Python +# mechanisms to silence them. +# SecurityWarning's always go off by default. +warnings.simplefilter('always', exceptions.SecurityWarning, append=True) +# SubjectAltNameWarning's should go off once per host +warnings.simplefilter('default', exceptions.SubjectAltNameWarning, append=True) +# InsecurePlatformWarning's don't vary between requests, so we keep it default. +warnings.simplefilter('default', exceptions.InsecurePlatformWarning, + append=True) +# SNIMissingWarnings should go off only once. +warnings.simplefilter('default', exceptions.SNIMissingWarning, append=True) + + +def disable_warnings(category=exceptions.HTTPWarning): + """ + Helper for quickly disabling all urllib3 warnings. + """ + warnings.simplefilter('ignore', category) diff --git a/vendor/requests/packages/urllib3/_collections.py b/vendor/requests/packages/urllib3/_collections.py index 5907b0dc..77cee017 100644 --- a/vendor/requests/packages/urllib3/_collections.py +++ b/vendor/requests/packages/urllib3/_collections.py @@ -1,13 +1,8 @@ -# urllib3/_collections.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - -from collections import MutableMapping +from __future__ import absolute_import +from collections import Mapping, MutableMapping try: from threading import RLock -except ImportError: # Platform-specific: No threads available +except ImportError: # Platform-specific: No threads available class RLock: def __enter__(self): pass @@ -16,13 +11,14 @@ except ImportError: # Platform-specific: No threads available pass -try: # Python 2.7+ +try: # Python 2.7+ from collections import OrderedDict except ImportError: from .packages.ordered_dict import OrderedDict +from .packages.six import iterkeys, itervalues, PY3 -__all__ = ['RecentlyUsedContainer'] +__all__ = ['RecentlyUsedContainer', 'HTTPHeaderDict'] _Null = object() @@ -90,8 +86,7 @@ class RecentlyUsedContainer(MutableMapping): def clear(self): with self.lock: # Copy pointers to all values, then wipe the mapping - # under Python 2, this copies the list of values twice :-| - values = list(self._container.values()) + values = list(itervalues(self._container)) self._container.clear() if self.dispose_func: @@ -100,4 +95,230 @@ class RecentlyUsedContainer(MutableMapping): def keys(self): with self.lock: - return self._container.keys() + return list(iterkeys(self._container)) + + +class HTTPHeaderDict(MutableMapping): + """ + :param headers: + An iterable of field-value pairs. Must not contain multiple field names + when compared case-insensitively. + + :param kwargs: + Additional field-value pairs to pass in to ``dict.update``. + + A ``dict`` like container for storing HTTP Headers. + + Field names are stored and compared case-insensitively in compliance with + RFC 7230. Iteration provides the first case-sensitive key seen for each + case-insensitive pair. + + Using ``__setitem__`` syntax overwrites fields that compare equal + case-insensitively in order to maintain ``dict``'s api. For fields that + compare equal, instead create a new ``HTTPHeaderDict`` and use ``.add`` + in a loop. + + If multiple fields that are equal case-insensitively are passed to the + constructor or ``.update``, the behavior is undefined and some will be + lost. + + >>> headers = HTTPHeaderDict() + >>> headers.add('Set-Cookie', 'foo=bar') + >>> headers.add('set-cookie', 'baz=quxx') + >>> headers['content-length'] = '7' + >>> headers['SET-cookie'] + 'foo=bar, baz=quxx' + >>> headers['Content-Length'] + '7' + """ + + def __init__(self, headers=None, **kwargs): + super(HTTPHeaderDict, self).__init__() + self._container = OrderedDict() + if headers is not None: + if isinstance(headers, HTTPHeaderDict): + self._copy_from(headers) + else: + self.extend(headers) + if kwargs: + self.extend(kwargs) + + def __setitem__(self, key, val): + self._container[key.lower()] = (key, val) + return self._container[key.lower()] + + def __getitem__(self, key): + val = self._container[key.lower()] + return ', '.join(val[1:]) + + def __delitem__(self, key): + del self._container[key.lower()] + + def __contains__(self, key): + return key.lower() in self._container + + def __eq__(self, other): + if not isinstance(other, Mapping) and not hasattr(other, 'keys'): + return False + if not isinstance(other, type(self)): + other = type(self)(other) + return (dict((k.lower(), v) for k, v in self.itermerged()) == + dict((k.lower(), v) for k, v in other.itermerged())) + + def __ne__(self, other): + return not self.__eq__(other) + + if not PY3: # Python 2 + iterkeys = MutableMapping.iterkeys + itervalues = MutableMapping.itervalues + + __marker = object() + + def __len__(self): + return len(self._container) + + def __iter__(self): + # Only provide the originally cased names + for vals in self._container.values(): + yield vals[0] + + def pop(self, key, default=__marker): + '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. + If key is not found, d is returned if given, otherwise KeyError is raised. + ''' + # Using the MutableMapping function directly fails due to the private marker. + # Using ordinary dict.pop would expose the internal structures. + # So let's reinvent the wheel. + try: + value = self[key] + except KeyError: + if default is self.__marker: + raise + return default + else: + del self[key] + return value + + def discard(self, key): + try: + del self[key] + except KeyError: + pass + + def add(self, key, val): + """Adds a (name, value) pair, doesn't overwrite the value if it already + exists. + + >>> headers = HTTPHeaderDict(foo='bar') + >>> headers.add('Foo', 'baz') + >>> headers['foo'] + 'bar, baz' + """ + key_lower = key.lower() + new_vals = key, val + # Keep the common case aka no item present as fast as possible + vals = self._container.setdefault(key_lower, new_vals) + if new_vals is not vals: + # new_vals was not inserted, as there was a previous one + if isinstance(vals, list): + # If already several items got inserted, we have a list + vals.append(val) + else: + # vals should be a tuple then, i.e. only one item so far + # Need to convert the tuple to list for further extension + self._container[key_lower] = [vals[0], vals[1], val] + + def extend(self, *args, **kwargs): + """Generic import function for any type of header-like object. + Adapted version of MutableMapping.update in order to insert items + with self.add instead of self.__setitem__ + """ + if len(args) > 1: + raise TypeError("extend() takes at most 1 positional " + "arguments ({0} given)".format(len(args))) + other = args[0] if len(args) >= 1 else () + + if isinstance(other, HTTPHeaderDict): + for key, val in other.iteritems(): + self.add(key, val) + elif isinstance(other, Mapping): + for key in other: + self.add(key, other[key]) + elif hasattr(other, "keys"): + for key in other.keys(): + self.add(key, other[key]) + else: + for key, value in other: + self.add(key, value) + + for key, value in kwargs.items(): + self.add(key, value) + + def getlist(self, key): + """Returns a list of all the values for the named field. Returns an + empty list if the key doesn't exist.""" + try: + vals = self._container[key.lower()] + except KeyError: + return [] + else: + if isinstance(vals, tuple): + return [vals[1]] + else: + return vals[1:] + + # Backwards compatibility for httplib + getheaders = getlist + getallmatchingheaders = getlist + iget = getlist + + def __repr__(self): + return "%s(%s)" % (type(self).__name__, dict(self.itermerged())) + + def _copy_from(self, other): + for key in other: + val = other.getlist(key) + if isinstance(val, list): + # Don't need to convert tuples + val = list(val) + self._container[key.lower()] = [key] + val + + def copy(self): + clone = type(self)() + clone._copy_from(self) + return clone + + def iteritems(self): + """Iterate over all header lines, including duplicate ones.""" + for key in self: + vals = self._container[key.lower()] + for val in vals[1:]: + yield vals[0], val + + def itermerged(self): + """Iterate over all headers, merging duplicate ones together.""" + for key in self: + val = self._container[key.lower()] + yield val[0], ', '.join(val[1:]) + + def items(self): + return list(self.iteritems()) + + @classmethod + def from_httplib(cls, message): # Python 2 + """Read headers from a Python 2 httplib message object.""" + # python2.7 does not expose a proper API for exporting multiheaders + # efficiently. This function re-reads raw lines from the message + # object and extracts the multiheaders properly. + headers = [] + + for line in message.headers: + if line.startswith((' ', '\t')): + key, value = headers[-1] + headers[-1] = (key, value + '\r\n' + line.rstrip()) + continue + + key, value = line.split(':', 1) + headers.append((key, value.strip())) + + return cls(headers) diff --git a/vendor/requests/packages/urllib3/connection.py b/vendor/requests/packages/urllib3/connection.py index e240786a..5ce00804 100644 --- a/vendor/requests/packages/urllib3/connection.py +++ b/vendor/requests/packages/urllib3/connection.py @@ -1,50 +1,227 @@ -# urllib3/connection.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import +import datetime +import logging +import os +import sys import socket -from socket import timeout as SocketTimeout +from socket import error as SocketError, timeout as SocketTimeout +import warnings +from .packages import six -try: # Python 3 - from http.client import HTTPConnection, HTTPException +try: # Python 3 + from http.client import HTTPConnection as _HTTPConnection + from http.client import HTTPException # noqa: unused in this module except ImportError: - from httplib import HTTPConnection, HTTPException + from httplib import HTTPConnection as _HTTPConnection + from httplib import HTTPException # noqa: unused in this module -class DummyConnection(object): - "Used to detect a failed ConnectionCls import." - pass - -try: # Compiled with SSL? +try: # Compiled with SSL? + import ssl + BaseSSLError = ssl.SSLError +except (ImportError, AttributeError): # Platform-specific: No SSL. ssl = None - HTTPSConnection = DummyConnection class BaseSSLError(BaseException): pass - try: # Python 3 - from http.client import HTTPSConnection - except ImportError: - from httplib import HTTPSConnection - import ssl - BaseSSLError = ssl.SSLError +try: # Python 3: + # Not a no-op, we're adding this to the namespace so it can be imported. + ConnectionError = ConnectionError +except NameError: # Python 2: + class ConnectionError(Exception): + pass -except (ImportError, AttributeError): # Platform-specific: No SSL. - pass from .exceptions import ( + NewConnectionError, ConnectTimeoutError, + SubjectAltNameWarning, + SystemTimeWarning, ) -from .packages.ssl_match_hostname import match_hostname -from .util import ( - assert_fingerprint, +from .packages.ssl_match_hostname import match_hostname, CertificateError + +from .util.ssl_ import ( resolve_cert_reqs, resolve_ssl_version, ssl_wrap_socket, + assert_fingerprint, ) + +from .util import connection + +from ._collections import HTTPHeaderDict + +log = logging.getLogger(__name__) + +port_by_scheme = { + 'http': 80, + 'https': 443, +} + +RECENT_DATE = datetime.date(2014, 1, 1) + + +class DummyConnection(object): + """Used to detect a failed ConnectionCls import.""" + pass + + +class HTTPConnection(_HTTPConnection, object): + """ + Based on httplib.HTTPConnection but provides an extra constructor + backwards-compatibility layer between older and newer Pythons. + + Additional keyword parameters are used to configure attributes of the connection. + Accepted parameters include: + + - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool` + - ``source_address``: Set the source address for the current connection. + + .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x + + - ``socket_options``: Set specific options on the underlying socket. If not specified, then + defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling + Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy. + + For example, if you wish to enable TCP Keep Alive in addition to the defaults, + you might pass:: + + HTTPConnection.default_socket_options + [ + (socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1), + ] + + Or you may want to disable the defaults by passing an empty list (e.g., ``[]``). + """ + + default_port = port_by_scheme['http'] + + #: Disable Nagle's algorithm by default. + #: ``[(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)]`` + default_socket_options = [(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)] + + #: Whether this connection verifies the host's certificate. + is_verified = False + + def __init__(self, *args, **kw): + if six.PY3: # Python 3 + kw.pop('strict', None) + + # Pre-set source_address in case we have an older Python like 2.6. + self.source_address = kw.get('source_address') + + if sys.version_info < (2, 7): # Python 2.6 + # _HTTPConnection on Python 2.6 will balk at this keyword arg, but + # not newer versions. We can still use it when creating a + # connection though, so we pop it *after* we have saved it as + # self.source_address. + kw.pop('source_address', None) + + #: The socket options provided by the user. If no options are + #: provided, we use the default options. + self.socket_options = kw.pop('socket_options', self.default_socket_options) + + # Superclass also sets self.source_address in Python 2.7+. + _HTTPConnection.__init__(self, *args, **kw) + + def _new_conn(self): + """ Establish a socket connection and set nodelay settings on it. + + :return: New socket connection. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = connection.create_connection( + (self.host, self.port), self.timeout, **extra_kw) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except SocketError as e: + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + def _prepare_conn(self, conn): + self.sock = conn + # the _tunnel_host attribute was added in python 2.6.3 (via + # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do + # not have them. + if getattr(self, '_tunnel_host', None): + # TODO: Fix tunnel so it doesn't depend on self.sock state. + self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + + def request_chunked(self, method, url, body=None, headers=None): + """ + Alternative to the common request method, which sends the + body with chunked encoding and not as one block + """ + headers = HTTPHeaderDict(headers if headers is not None else {}) + skip_accept_encoding = 'accept-encoding' in headers + self.putrequest(method, url, skip_accept_encoding=skip_accept_encoding) + for header, value in headers.items(): + self.putheader(header, value) + if 'transfer-encoding' not in headers: + self.putheader('Transfer-Encoding', 'chunked') + self.endheaders() + + if body is not None: + stringish_types = six.string_types + (six.binary_type,) + if isinstance(body, stringish_types): + body = (body,) + for chunk in body: + if not chunk: + continue + if not isinstance(chunk, six.binary_type): + chunk = chunk.encode('utf8') + len_str = hex(len(chunk))[2:] + self.send(len_str.encode('utf-8')) + self.send(b'\r\n') + self.send(chunk) + self.send(b'\r\n') + + # After the if clause, to always have a closed body + self.send(b'0\r\n\r\n') + + +class HTTPSConnection(HTTPConnection): + default_port = port_by_scheme['https'] + + def __init__(self, host, port=None, key_file=None, cert_file=None, + strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, **kw): + + HTTPConnection.__init__(self, host, port, strict=strict, + timeout=timeout, **kw) + + self.key_file = key_file + self.cert_file = cert_file + + # Required property for Google AppEngine 1.9.0 which otherwise causes + # HTTPS requests to go out as HTTP. (See Issue #356) + self._protocol = 'https' + + def connect(self): + conn = self._new_conn() + self._prepare_conn(conn) + self.sock = ssl.wrap_socket(conn, self.key_file, self.cert_file) + + class VerifiedHTTPSConnection(HTTPSConnection): """ Based on httplib.HTTPSConnection but wraps the socket with @@ -52,56 +229,102 @@ class VerifiedHTTPSConnection(HTTPSConnection): """ cert_reqs = None ca_certs = None + ca_cert_dir = None ssl_version = None + assert_fingerprint = None def set_cert(self, key_file=None, cert_file=None, cert_reqs=None, ca_certs=None, - assert_hostname=None, assert_fingerprint=None): + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None): + + if (ca_certs or ca_cert_dir) and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' self.key_file = key_file self.cert_file = cert_file self.cert_reqs = cert_reqs - self.ca_certs = ca_certs self.assert_hostname = assert_hostname self.assert_fingerprint = assert_fingerprint + self.ca_certs = ca_certs and os.path.expanduser(ca_certs) + self.ca_cert_dir = ca_cert_dir and os.path.expanduser(ca_cert_dir) def connect(self): # Add certificate verification - try: - sock = socket.create_connection( - address=(self.host, self.port), - timeout=self.timeout, - ) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, self.timeout)) + conn = self._new_conn() resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) resolved_ssl_version = resolve_ssl_version(self.ssl_version) - if self._tunnel_host: - self.sock = sock + hostname = self.host + if getattr(self, '_tunnel_host', None): + # _tunnel_host was added in Python 2.6.3 + # (See: http://hg.python.org/cpython/rev/0f57b30a152f) + + self.sock = conn # Calls self._set_hostport(), so self.host is # self._tunnel_host below. self._tunnel() + # Mark this connection as not reusable + self.auto_open = 0 + + # Override the host with the one we're requesting data from. + hostname = self._tunnel_host + + is_time_off = datetime.date.today() < RECENT_DATE + if is_time_off: + warnings.warn(( + 'System time is way off (before {0}). This will probably ' + 'lead to SSL verification errors').format(RECENT_DATE), + SystemTimeWarning + ) # Wrap socket using verification with the root certs in # trusted_root_certs - self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file, + self.sock = ssl_wrap_socket(conn, self.key_file, self.cert_file, cert_reqs=resolved_cert_reqs, ca_certs=self.ca_certs, - server_hostname=self.host, + ca_cert_dir=self.ca_cert_dir, + server_hostname=hostname, ssl_version=resolved_ssl_version) - if resolved_cert_reqs != ssl.CERT_NONE: - if self.assert_fingerprint: - assert_fingerprint(self.sock.getpeercert(binary_form=True), - self.assert_fingerprint) - elif self.assert_hostname is not False: - match_hostname(self.sock.getpeercert(), - self.assert_hostname or self.host) + if self.assert_fingerprint: + assert_fingerprint(self.sock.getpeercert(binary_form=True), + self.assert_fingerprint) + elif resolved_cert_reqs != ssl.CERT_NONE \ + and self.assert_hostname is not False: + cert = self.sock.getpeercert() + if not cert.get('subjectAltName', ()): + warnings.warn(( + 'Certificate for {0} has no `subjectAltName`, falling back to check for a ' + '`commonName` for now. This feature is being removed by major browsers and ' + 'deprecated by RFC 2818. (See https://github.com/shazow/urllib3/issues/497 ' + 'for details.)'.format(hostname)), + SubjectAltNameWarning + ) + _match_hostname(cert, self.assert_hostname or hostname) + + self.is_verified = (resolved_cert_reqs == ssl.CERT_REQUIRED or + self.assert_fingerprint is not None) + + +def _match_hostname(cert, asserted_hostname): + try: + match_hostname(cert, asserted_hostname) + except CertificateError as e: + log.error( + 'Certificate did not match expected hostname: %s. ' + 'Certificate: %s', asserted_hostname, cert + ) + # Add cert to exception and reraise so client code can inspect + # the cert when catching the exception, if they want to + e._peer_cert = cert + raise if ssl: + # Make a copy for testing. + UnverifiedHTTPSConnection = HTTPSConnection HTTPSConnection = VerifiedHTTPSConnection +else: + HTTPSConnection = DummyConnection diff --git a/vendor/requests/packages/urllib3/connectionpool.py b/vendor/requests/packages/urllib3/connectionpool.py index 72011b5a..ab634cb4 100644 --- a/vendor/requests/packages/urllib3/connectionpool.py +++ b/vendor/requests/packages/urllib3/connectionpool.py @@ -1,48 +1,51 @@ -# urllib3/connectionpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import import errno import logging +import sys +import warnings from socket import error as SocketError, timeout as SocketTimeout import socket -try: # Python 3 +try: # Python 3 from queue import LifoQueue, Empty, Full except ImportError: from Queue import LifoQueue, Empty, Full - import Queue as _ # Platform-specific: Windows + # Queue is imported for side effects on MS Windows + import Queue as _unused_module_Queue # noqa: unused from .exceptions import ( ClosedPoolError, - ConnectTimeoutError, + ProtocolError, EmptyPoolError, + HeaderParsingError, HostChangedError, + LocationValueError, MaxRetryError, + ProxyError, + ReadTimeoutError, SSLError, TimeoutError, - ReadTimeoutError, - ProxyError, + InsecureRequestWarning, + NewConnectionError, ) from .packages.ssl_match_hostname import CertificateError from .packages import six from .connection import ( + port_by_scheme, DummyConnection, HTTPConnection, HTTPSConnection, VerifiedHTTPSConnection, HTTPException, BaseSSLError, ) from .request import RequestMethods from .response import HTTPResponse -from .util import ( - assert_fingerprint, - get_host, - is_connection_dropped, - Timeout, -) + +from .util.connection import is_connection_dropped +from .util.response import assert_header_parsing +from .util.retry import Retry +from .util.timeout import Timeout +from .util.url import get_host, Url xrange = six.moves.xrange @@ -51,14 +54,8 @@ log = logging.getLogger(__name__) _Default = object() -port_by_scheme = { - 'http': 80, - 'https': 443, -} - - -## Pool objects +# Pool objects class ConnectionPool(object): """ Base class for all connection pools, such as @@ -69,19 +66,41 @@ class ConnectionPool(object): QueueCls = LifoQueue def __init__(self, host, port=None): - # httplib doesn't like it when we include brackets in ipv6 addresses - host = host.strip('[]') + if not host: + raise LocationValueError("No host specified.") - self.host = host + # httplib doesn't like it when we include brackets in ipv6 addresses + # Specifically, if we include brackets but also pass the port then + # httplib crazily doubles up the square brackets on the Host header. + # Instead, we need to make sure we never pass ``None`` as the port. + # However, for backward compatibility reasons we can't actually + # *assert* that. + self.host = host.strip('[]') self.port = port def __str__(self): return '%s(host=%r, port=%r)' % (type(self).__name__, self.host, self.port) + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.close() + # Return False to re-raise any potential exceptions + return False + + def close(self): + """ + Close all pooled connections and disable the pool. + """ + pass + + # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252 _blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK]) + class HTTPConnectionPool(ConnectionPool, RequestMethods): """ Thread-safe connection pool for one host. @@ -111,7 +130,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): :param maxsize: Number of connections to save that can be reused. More than 1 is useful - in multithreaded situations. If ``block`` is set to false, more + in multithreaded situations. If ``block`` is set to False, more connections will be created but they will not be saved once they've been used. @@ -126,6 +145,9 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): Headers to include with all requests, unless other headers are given explicitly. + :param retries: + Retry configuration to use by default with requests in this pool. + :param _proxy: Parsed proxy URL, should not be used directly, instead, see :class:`urllib3.connectionpool.ProxyManager`" @@ -133,25 +155,34 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): :param _proxy_headers: A dictionary with proxy headers, should not be used directly, instead, see :class:`urllib3.connectionpool.ProxyManager`" + + :param \**conn_kw: + Additional parameters are used to create fresh :class:`urllib3.connection.HTTPConnection`, + :class:`urllib3.connection.HTTPSConnection` instances. """ scheme = 'http' ConnectionCls = HTTPConnection + ResponseCls = HTTPResponse def __init__(self, host, port=None, strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, block=False, - headers=None, _proxy=None, _proxy_headers=None): + headers=None, retries=None, + _proxy=None, _proxy_headers=None, + **conn_kw): ConnectionPool.__init__(self, host, port) RequestMethods.__init__(self, headers) self.strict = strict - # This is for backwards compatibility and can be removed once a timeout - # can only be set to a Timeout object if not isinstance(timeout, Timeout): timeout = Timeout.from_float(timeout) + if retries is None: + retries = Retry.DEFAULT + self.timeout = timeout + self.retries = retries self.pool = self.QueueCls(maxsize) self.block = block @@ -166,22 +197,26 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # These are mostly for testing and debugging purposes. self.num_connections = 0 self.num_requests = 0 + self.conn_kw = conn_kw + + if self.proxy: + # Enable Nagle's algorithm for proxies, to avoid packet fragmentation. + # We cannot know if the user has added default socket options, so we cannot replace the + # list. + self.conn_kw.setdefault('socket_options', []) def _new_conn(self): """ - Return a fresh :class:`httplib.HTTPConnection`. + Return a fresh :class:`HTTPConnection`. """ self.num_connections += 1 - log.info("Starting new HTTP connection (%d): %s" % - (self.num_connections, self.host)) + log.info("Starting new HTTP connection (%d): %s", + self.num_connections, self.host) - extra_params = {} - if not six.PY3: # Python 2 - extra_params['strict'] = self.strict - - return self.ConnectionCls(host=self.host, port=self.port, + conn = self.ConnectionCls(host=self.host, port=self.port, timeout=self.timeout.connect_timeout, - **extra_params) + strict=self.strict, **self.conn_kw) + return conn def _get_conn(self, timeout=None): """ @@ -199,7 +234,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): try: conn = self.pool.get(block=self.block, timeout=timeout) - except AttributeError: # self.pool is None + except AttributeError: # self.pool is None raise ClosedPoolError(self, "Pool is closed.") except Empty: @@ -211,8 +246,13 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # If this is a persistent connection, check if it got disconnected if conn and is_connection_dropped(conn): - log.info("Resetting dropped connection: %s" % self.host) + log.info("Resetting dropped connection: %s", self.host) conn.close() + if getattr(conn, 'auto_open', 1) == 0: + # This is a proxied connection that has been mutated by + # httplib._tunnel() and cannot be reused (since it would + # attempt to bypass the proxy) + conn = None return conn or self._new_conn() @@ -232,19 +272,30 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): """ try: self.pool.put(conn, block=False) - return # Everything is dandy, done. + return # Everything is dandy, done. except AttributeError: # self.pool is None. pass except Full: # This should never happen if self.block == True - log.warning("HttpConnectionPool is full, discarding connection: %s" - % self.host) + log.warning( + "Connection pool is full, discarding connection: %s", + self.host) # Connection never got put back into the pool, close it. if conn: conn.close() + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + pass + + def _prepare_proxy(self, conn): + # Nothing to do for HTTP connections. + pass + def _get_timeout(self, timeout): """ Helper that always returns a :class:`urllib3.util.Timeout` """ if timeout is _Default: @@ -257,10 +308,27 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # can be removed later return Timeout.from_float(timeout) - def _make_request(self, conn, method, url, timeout=_Default, + def _raise_timeout(self, err, url, timeout_value): + """Is the error actually a timeout? Will raise a ReadTimeout or pass""" + + if isinstance(err, SocketTimeout): + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # See the above comment about EAGAIN in Python 3. In Python 2 we have + # to specifically catch it and throw the timeout error + if hasattr(err, 'errno') and err.errno in _blocking_errnos: + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + # Catch possible read timeouts thrown as SSL errors. If not the + # case, rethrow the original. We need to do this because of: + # http://bugs.python.org/issue10272 + if 'timed out' in str(err) or 'did not complete (read)' in str(err): # Python 2.6 + raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value) + + def _make_request(self, conn, method, url, timeout=_Default, chunked=False, **httplib_request_kw): """ - Perform a request on a given httplib connection object taken from our + Perform a request on a given urllib connection object taken from our pool. :param conn: @@ -276,23 +344,29 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): self.num_requests += 1 timeout_obj = self._get_timeout(timeout) + timeout_obj.start_connect() + conn.timeout = timeout_obj.connect_timeout + # Trigger any extra validation we need to do. try: - timeout_obj.start_connect() - conn.timeout = timeout_obj.connect_timeout - # conn.request() calls httplib.*.request, not the method in - # urllib3.request. It also calls makefile (recv) on the socket. + self._validate_conn(conn) + except (SocketTimeout, BaseSSLError) as e: + # Py2 raises this as a BaseSSLError, Py3 raises it as socket timeout. + self._raise_timeout(err=e, url=url, timeout_value=conn.timeout) + raise + + # conn.request() calls httplib.*.request, not the method in + # urllib3.request. It also calls makefile (recv) on the socket. + if chunked: + conn.request_chunked(method, url, **httplib_request_kw) + else: conn.request(method, url, **httplib_request_kw) - except SocketTimeout: - raise ConnectTimeoutError( - self, "Connection to %s timed out. (connect timeout=%s)" % - (self.host, timeout_obj.connect_timeout)) # Reset the timeout for the recv() on the socket read_timeout = timeout_obj.read_timeout # App Engine doesn't have a sock attr - if hasattr(conn, 'sock'): + if getattr(conn, 'sock', None): # In Python 3 socket.py will catch EAGAIN and return None when you # try and read into the file pointer created by http.client, which # instead raises a BadStatusLine exception. Instead of catching @@ -300,50 +374,44 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # timeouts, check for a zero timeout before making the request. if read_timeout == 0: raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) + self, url, "Read timed out. (read timeout=%s)" % read_timeout) if read_timeout is Timeout.DEFAULT_TIMEOUT: conn.sock.settimeout(socket.getdefaulttimeout()) - else: # None or a value + else: # None or a value conn.sock.settimeout(read_timeout) # Receive the response from the server try: - try: # Python 2.7+, use buffering of HTTP responses + try: # Python 2.7, use buffering of HTTP responses httplib_response = conn.getresponse(buffering=True) - except TypeError: # Python 2.6 and older - httplib_response = conn.getresponse() - except SocketTimeout: - raise ReadTimeoutError( - self, url, "Read timed out. (read timeout=%s)" % read_timeout) - - except BaseSSLError as e: - # Catch possible read timeouts thrown as SSL errors. If not the - # case, rethrow the original. We need to do this because of: - # http://bugs.python.org/issue10272 - if 'timed out' in str(e) or \ - 'did not complete (read)' in str(e): # Python 2.6 - raise ReadTimeoutError(self, url, "Read timed out.") - - raise - - except SocketError as e: # Platform-specific: Python 2 - # See the above comment about EAGAIN in Python 3. In Python 2 we - # have to specifically catch it and throw the timeout error - if e.errno in _blocking_errnos: - raise ReadTimeoutError( - self, url, - "Read timed out. (read timeout=%s)" % read_timeout) - + except TypeError: # Python 2.6 and older, Python 3 + try: + httplib_response = conn.getresponse() + except Exception as e: + # Remove the TypeError from the exception chain in Python 3; + # otherwise it looks like a programming error was the cause. + six.raise_from(e, None) + except (SocketTimeout, BaseSSLError, SocketError) as e: + self._raise_timeout(err=e, url=url, timeout_value=read_timeout) raise # AppEngine doesn't have a version attr. http_version = getattr(conn, '_http_vsn_str', 'HTTP/?') - log.debug("\"%s %s %s\" %s %s" % (method, url, http_version, - httplib_response.status, - httplib_response.length)) + log.debug("\"%s %s %s\" %s %s", method, url, http_version, + httplib_response.status, httplib_response.length) + + try: + assert_header_parsing(httplib_response.msg) + except HeaderParsingError as hpe: # Platform-specific: Python 3 + log.warning( + 'Failed to parse headers (url=%s): %s', + self._absolute_url(url), hpe, exc_info=True) + return httplib_response + def _absolute_url(self, path): + return Url(scheme=self.scheme, host=self.host, port=self.port, path=path).url + def close(self): """ Close all pooled connections and disable the pool. @@ -358,7 +426,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): conn.close() except Empty: - pass # Done. + pass # Done. def is_same_host(self, url): """ @@ -371,15 +439,18 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): # TODO: Add optional support for socket.gethostbyname checking. scheme, host, port = get_host(url) + # Use explicit default port for comparison when none is given if self.port and not port: - # Use explicit default port for comparison when none is given. port = port_by_scheme.get(scheme) + elif not self.port and port == port_by_scheme.get(scheme): + port = None return (scheme, host, port) == (self.scheme, self.host, self.port) - def urlopen(self, method, url, body=None, headers=None, retries=3, + def urlopen(self, method, url, body=None, headers=None, retries=None, redirect=True, assert_same_host=True, timeout=_Default, - pool_timeout=None, release_conn=None, **response_kw): + pool_timeout=None, release_conn=None, chunked=False, + **response_kw): """ Get a connection from the pool and perform an HTTP request. This is the lowest level call for making a request, so you'll need to specify all @@ -411,11 +482,25 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): these headers completely replace any pool-specific headers. :param retries: - Number of retries to allow before raising a MaxRetryError exception. + Configure the number of retries to allow before raising a + :class:`~urllib3.exceptions.MaxRetryError` exception. + + Pass ``None`` to retry until you receive a response. Pass a + :class:`~urllib3.util.retry.Retry` object for fine-grained control + over different types of retries. + Pass an integer number to retry connection errors that many times, + but no other types of errors. Pass zero to never retry. + + If ``False``, then retries are disabled and any exception is raised + immediately. Also, instead of raising a MaxRetryError on redirects, + the redirect response will be returned. + + :type retries: :class:`~urllib3.util.retry.Retry`, False, or an int. :param redirect: If True, automatically handle redirects (status codes 301, 302, - 303, 307, 308). Each redirect counts as a retry. + 303, 307, 308). Each redirect counts as a retry. Disabling retries + will disable redirect, too. :param assert_same_host: If ``True``, will make sure that the host of the pool requests is @@ -442,6 +527,11 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): back into the pool. If None, it takes the value of ``response_kw.get('preload_content', True)``. + :param chunked: + If True, urllib3 will send the body using chunked transfer + encoding. Otherwise, urllib3 will send the body using the standard + content-length form. Defaults to False. + :param \**response_kw: Additional parameters are passed to :meth:`urllib3.response.HTTPResponse.from_httplib` @@ -449,18 +539,29 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if headers is None: headers = self.headers - if retries < 0: - raise MaxRetryError(self, url) + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect, default=self.retries) if release_conn is None: release_conn = response_kw.get('preload_content', True) # Check host if assert_same_host and not self.is_same_host(url): - raise HostChangedError(self, url, retries - 1) + raise HostChangedError(self, url, retries) conn = None + # Track whether `conn` needs to be released before + # returning/raising/recursing. Update this variable if necessary, and + # leave `release_conn` constant throughout the function. That way, if + # the function recurses, the original value of `release_conn` will be + # passed down into the recursive call, and its value will be respected. + # + # See issue #651 [1] for details. + # + # [1] + release_this_conn = release_conn + # Merge the proxy headers. Only do this in HTTP. We have to copy the # headers dict so we can safely change it without those changes being # reflected in anyone else's copy. @@ -468,67 +569,90 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): headers = headers.copy() headers.update(self.proxy_headers) + # Must keep the exception bound to a separate variable or else Python 3 + # complains about UnboundLocalError. + err = None + + # Keep track of whether we cleanly exited the except block. This + # ensures we do proper cleanup in finally. + clean_exit = False + try: - # Request a connection from the queue + # Request a connection from the queue. + timeout_obj = self._get_timeout(timeout) conn = self._get_conn(timeout=pool_timeout) - # Make the request on the httplib connection object + conn.timeout = timeout_obj.connect_timeout + + is_new_proxy_conn = self.proxy is not None and not getattr(conn, 'sock', None) + if is_new_proxy_conn: + self._prepare_proxy(conn) + + # Make the request on the httplib connection object. httplib_response = self._make_request(conn, method, url, - timeout=timeout, - body=body, headers=headers) + timeout=timeout_obj, + body=body, headers=headers, + chunked=chunked) # If we're going to release the connection in ``finally:``, then - # the request doesn't need to know about the connection. Otherwise + # the response doesn't need to know about the connection. Otherwise # it will also try to release it and we'll have a double-release # mess. - response_conn = not release_conn and conn + response_conn = conn if not release_conn else None # Import httplib's response into our own wrapper object - response = HTTPResponse.from_httplib(httplib_response, - pool=self, - connection=response_conn, - **response_kw) + response = self.ResponseCls.from_httplib(httplib_response, + pool=self, + connection=response_conn, + **response_kw) - # else: - # The connection will be put back into the pool when - # ``response.release_conn()`` is called (implicitly by - # ``response.read()``) + # Everything went great! + clean_exit = True except Empty: - # Timed out by queue + # Timed out by queue. raise EmptyPoolError(self, "No pool connections are available.") - except BaseSSLError as e: + except (BaseSSLError, CertificateError) as e: + # Close the connection. If a connection is reused on which there + # was a Certificate error, the next request will certainly raise + # another Certificate error. + clean_exit = False raise SSLError(e) - except CertificateError as e: - # Name mismatch - raise SSLError(e) + except SSLError: + # Treat SSLError separately from BaseSSLError to preserve + # traceback. + clean_exit = False + raise - except TimeoutError as e: - # Connection broken, discard. - conn = None - # Save the error off for retry logic. + except (TimeoutError, HTTPException, SocketError, ProtocolError) as e: + # Discard the connection for these exceptions. It will be + # be replaced during the next _get_conn() call. + clean_exit = False + + if isinstance(e, (SocketError, NewConnectionError)) and self.proxy: + e = ProxyError('Cannot connect to proxy.', e) + elif isinstance(e, (SocketError, HTTPException)): + e = ProtocolError('Connection aborted.', e) + + retries = retries.increment(method, url, error=e, _pool=self, + _stacktrace=sys.exc_info()[2]) + retries.sleep() + + # Keep track of the error for the retry warning. err = e - if retries == 0: - raise - - except (HTTPException, SocketError) as e: - if isinstance(e, SocketError) and self.proxy is not None: - raise ProxyError('Cannot connect to proxy. ' - 'Socket error: %s.' % e) - - # Connection broken, discard. It will be replaced next _get_conn(). - conn = None - # This is necessary so we can access e below - err = e - - if retries == 0: - raise MaxRetryError(self, url, e) - finally: - if release_conn: + if not clean_exit: + # We hit some kind of exception, handled or otherwise. We need + # to throw the connection away unless explicitly told not to. + # Close the connection, set the variable to None, and make sure + # we put the None back in the pool to avoid leaking it. + conn = conn and conn.close() + release_this_conn = True + + if release_this_conn: # Put the connection back to be reused. If the connection is # expired then it will be None, which will get replaced with a # fresh connection during _get_conn. @@ -536,9 +660,9 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if not conn: # Try again - log.warn("Retrying (%d attempts remain) after connection " - "broken by '%r': %s" % (retries, err, url)) - return self.urlopen(method, url, body, headers, retries - 1, + log.warning("Retrying (%r) after connection " + "broken by '%r': %s", retries, err, url) + return self.urlopen(method, url, body, headers, retries, redirect, assert_same_host, timeout=timeout, pool_timeout=pool_timeout, release_conn=release_conn, **response_kw) @@ -548,11 +672,44 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods): if redirect_location: if response.status == 303: method = 'GET' - log.info("Redirecting %s -> %s" % (url, redirect_location)) - return self.urlopen(method, redirect_location, body, headers, - retries - 1, redirect, assert_same_host, - timeout=timeout, pool_timeout=pool_timeout, - release_conn=release_conn, **response_kw) + + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_redirect: + # Release the connection for this response, since we're not + # returning it to be released manually. + response.release_conn() + raise + return response + + log.info("Redirecting %s -> %s", url, redirect_location) + return self.urlopen( + method, redirect_location, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) + + # Check if we should retry the HTTP response. + if retries.is_forced_retry(method, status_code=response.status): + try: + retries = retries.increment(method, url, response=response, _pool=self) + except MaxRetryError: + if retries.raise_on_status: + # Release the connection for this response, since we're not + # returning it to be released manually. + response.release_conn() + raise + return response + retries.sleep() + log.info("Forced retry: %s", url) + return self.urlopen( + method, url, body, headers, + retries=retries, redirect=redirect, + assert_same_host=assert_same_host, + timeout=timeout, pool_timeout=pool_timeout, + release_conn=release_conn, **response_kw) return response @@ -563,35 +720,42 @@ class HTTPSConnectionPool(HTTPConnectionPool): When Python is compiled with the :mod:`ssl` module, then :class:`.VerifiedHTTPSConnection` is used, which *can* verify certificates, - instead of :class:`httplib.HTTPSConnection`. + instead of :class:`.HTTPSConnection`. :class:`.VerifiedHTTPSConnection` uses one of ``assert_fingerprint``, ``assert_hostname`` and ``host`` in this order to verify connections. If ``assert_hostname`` is False, no verification is done. - The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs`` and - ``ssl_version`` are only used if :mod:`ssl` is available and are fed into - :meth:`urllib3.util.ssl_wrap_socket` to upgrade the connection socket - into an SSL socket. + The ``key_file``, ``cert_file``, ``cert_reqs``, ``ca_certs``, + ``ca_cert_dir``, and ``ssl_version`` are only used if :mod:`ssl` is + available and are fed into :meth:`urllib3.util.ssl_wrap_socket` to upgrade + the connection socket into an SSL socket. """ scheme = 'https' ConnectionCls = HTTPSConnection def __init__(self, host, port=None, - strict=False, timeout=None, maxsize=1, - block=False, headers=None, + strict=False, timeout=Timeout.DEFAULT_TIMEOUT, maxsize=1, + block=False, headers=None, retries=None, _proxy=None, _proxy_headers=None, key_file=None, cert_file=None, cert_reqs=None, ca_certs=None, ssl_version=None, - assert_hostname=None, assert_fingerprint=None): + assert_hostname=None, assert_fingerprint=None, + ca_cert_dir=None, **conn_kw): HTTPConnectionPool.__init__(self, host, port, strict, timeout, maxsize, - block, headers, _proxy, _proxy_headers) + block, headers, retries, _proxy, _proxy_headers, + **conn_kw) + + if ca_certs and cert_reqs is None: + cert_reqs = 'CERT_REQUIRED' + self.key_file = key_file self.cert_file = cert_file self.cert_reqs = cert_reqs self.ca_certs = ca_certs + self.ca_cert_dir = ca_cert_dir self.ssl_version = ssl_version self.assert_hostname = assert_hostname self.assert_fingerprint = assert_fingerprint @@ -607,33 +771,40 @@ class HTTPSConnectionPool(HTTPConnectionPool): cert_file=self.cert_file, cert_reqs=self.cert_reqs, ca_certs=self.ca_certs, + ca_cert_dir=self.ca_cert_dir, assert_hostname=self.assert_hostname, assert_fingerprint=self.assert_fingerprint) conn.ssl_version = self.ssl_version - if self.proxy is not None: - # Python 2.7+ - try: - set_tunnel = conn.set_tunnel - except AttributeError: # Platform-specific: Python 2.6 - set_tunnel = conn._set_tunnel - set_tunnel(self.host, self.port, self.proxy_headers) - # Establish tunnel connection early, because otherwise httplib - # would improperly set Host: header to proxy's IP:port. - conn.connect() - return conn + def _prepare_proxy(self, conn): + """ + Establish tunnel connection early, because otherwise httplib + would improperly set Host: header to proxy's IP:port. + """ + # Python 2.7+ + try: + set_tunnel = conn.set_tunnel + except AttributeError: # Platform-specific: Python 2.6 + set_tunnel = conn._set_tunnel + + if sys.version_info <= (2, 6, 4) and not self.proxy_headers: # Python 2.6.4 and older + set_tunnel(self.host, self.port) + else: + set_tunnel(self.host, self.port, self.proxy_headers) + + conn.connect() + def _new_conn(self): """ Return a fresh :class:`httplib.HTTPSConnection`. """ self.num_connections += 1 - log.info("Starting new HTTPS connection (%d): %s" - % (self.num_connections, self.host)) + log.info("Starting new HTTPS connection (%d): %s", + self.num_connections, self.host) if not self.ConnectionCls or self.ConnectionCls is DummyConnection: - # Platform-specific: Python without ssl raise SSLError("Can't connect to HTTPS URL because the SSL " "module is not available.") @@ -643,16 +814,29 @@ class HTTPSConnectionPool(HTTPConnectionPool): actual_host = self.proxy.host actual_port = self.proxy.port - extra_params = {} - if not six.PY3: # Python 2 - extra_params['strict'] = self.strict - conn = self.ConnectionCls(host=actual_host, port=actual_port, timeout=self.timeout.connect_timeout, - **extra_params) + strict=self.strict, **self.conn_kw) return self._prepare_conn(conn) + def _validate_conn(self, conn): + """ + Called right before a request is made, after the socket is created. + """ + super(HTTPSConnectionPool, self)._validate_conn(conn) + + # Force connect early to allow us to validate the connection. + if not getattr(conn, 'sock', None): # AppEngine might not have `.sock` + conn.connect() + + if not conn.is_verified: + warnings.warn(( + 'Unverified HTTPS request is being made. ' + 'Adding certificate verification is strongly advised. See: ' + 'https://urllib3.readthedocs.io/en/latest/security.html'), + InsecureRequestWarning) + def connection_from_url(url, **kw): """ @@ -669,12 +853,13 @@ def connection_from_url(url, **kw): :class:`.ConnectionPool`. Useful for specifying things like timeout, maxsize, headers, etc. - Example: :: + Example:: >>> conn = connection_from_url('http://google.com/') >>> r = conn.request('GET', '/') """ scheme, host, port = get_host(url) + port = port or port_by_scheme.get(scheme, 80) if scheme == 'https': return HTTPSConnectionPool(host, port=port, **kw) else: diff --git a/vendor/requests/packages/urllib3/contrib/appengine.py b/vendor/requests/packages/urllib3/contrib/appengine.py new file mode 100644 index 00000000..1579476c --- /dev/null +++ b/vendor/requests/packages/urllib3/contrib/appengine.py @@ -0,0 +1,231 @@ +from __future__ import absolute_import +import logging +import os +import warnings + +from ..exceptions import ( + HTTPError, + HTTPWarning, + MaxRetryError, + ProtocolError, + TimeoutError, + SSLError +) + +from ..packages.six import BytesIO +from ..request import RequestMethods +from ..response import HTTPResponse +from ..util.timeout import Timeout +from ..util.retry import Retry + +try: + from google.appengine.api import urlfetch +except ImportError: + urlfetch = None + + +log = logging.getLogger(__name__) + + +class AppEnginePlatformWarning(HTTPWarning): + pass + + +class AppEnginePlatformError(HTTPError): + pass + + +class AppEngineManager(RequestMethods): + """ + Connection manager for Google App Engine sandbox applications. + + This manager uses the URLFetch service directly instead of using the + emulated httplib, and is subject to URLFetch limitations as described in + the App Engine documentation here: + + https://cloud.google.com/appengine/docs/python/urlfetch + + Notably it will raise an AppEnginePlatformError if: + * URLFetch is not available. + * If you attempt to use this on GAEv2 (Managed VMs), as full socket + support is available. + * If a request size is more than 10 megabytes. + * If a response size is more than 32 megabtyes. + * If you use an unsupported request method such as OPTIONS. + + Beyond those cases, it will raise normal urllib3 errors. + """ + + def __init__(self, headers=None, retries=None, validate_certificate=True): + if not urlfetch: + raise AppEnginePlatformError( + "URLFetch is not available in this environment.") + + if is_prod_appengine_mvms(): + raise AppEnginePlatformError( + "Use normal urllib3.PoolManager instead of AppEngineManager" + "on Managed VMs, as using URLFetch is not necessary in " + "this environment.") + + warnings.warn( + "urllib3 is using URLFetch on Google App Engine sandbox instead " + "of sockets. To use sockets directly instead of URLFetch see " + "https://urllib3.readthedocs.io/en/latest/contrib.html.", + AppEnginePlatformWarning) + + RequestMethods.__init__(self, headers) + self.validate_certificate = validate_certificate + + self.retries = retries or Retry.DEFAULT + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + # Return False to re-raise any potential exceptions + return False + + def urlopen(self, method, url, body=None, headers=None, + retries=None, redirect=True, timeout=Timeout.DEFAULT_TIMEOUT, + **response_kw): + + retries = self._get_retries(retries, redirect) + + try: + response = urlfetch.fetch( + url, + payload=body, + method=method, + headers=headers or {}, + allow_truncated=False, + follow_redirects=( + redirect and + retries.redirect != 0 and + retries.total), + deadline=self._get_absolute_timeout(timeout), + validate_certificate=self.validate_certificate, + ) + except urlfetch.DeadlineExceededError as e: + raise TimeoutError(self, e) + + except urlfetch.InvalidURLError as e: + if 'too large' in str(e): + raise AppEnginePlatformError( + "URLFetch request too large, URLFetch only " + "supports requests up to 10mb in size.", e) + raise ProtocolError(e) + + except urlfetch.DownloadError as e: + if 'Too many redirects' in str(e): + raise MaxRetryError(self, url, reason=e) + raise ProtocolError(e) + + except urlfetch.ResponseTooLargeError as e: + raise AppEnginePlatformError( + "URLFetch response too large, URLFetch only supports" + "responses up to 32mb in size.", e) + + except urlfetch.SSLCertificateError as e: + raise SSLError(e) + + except urlfetch.InvalidMethodError as e: + raise AppEnginePlatformError( + "URLFetch does not support method: %s" % method, e) + + http_response = self._urlfetch_response_to_http_response( + response, **response_kw) + + # Check for redirect response + if (http_response.get_redirect_location() and + retries.raise_on_redirect and redirect): + raise MaxRetryError(self, url, "too many redirects") + + # Check if we should retry the HTTP response. + if retries.is_forced_retry(method, status_code=http_response.status): + retries = retries.increment( + method, url, response=http_response, _pool=self) + log.info("Forced retry: %s", url) + retries.sleep() + return self.urlopen( + method, url, + body=body, headers=headers, + retries=retries, redirect=redirect, + timeout=timeout, **response_kw) + + return http_response + + def _urlfetch_response_to_http_response(self, urlfetch_resp, **response_kw): + + if is_prod_appengine(): + # Production GAE handles deflate encoding automatically, but does + # not remove the encoding header. + content_encoding = urlfetch_resp.headers.get('content-encoding') + + if content_encoding == 'deflate': + del urlfetch_resp.headers['content-encoding'] + + transfer_encoding = urlfetch_resp.headers.get('transfer-encoding') + # We have a full response's content, + # so let's make sure we don't report ourselves as chunked data. + if transfer_encoding == 'chunked': + encodings = transfer_encoding.split(",") + encodings.remove('chunked') + urlfetch_resp.headers['transfer-encoding'] = ','.join(encodings) + + return HTTPResponse( + # In order for decoding to work, we must present the content as + # a file-like object. + body=BytesIO(urlfetch_resp.content), + headers=urlfetch_resp.headers, + status=urlfetch_resp.status_code, + **response_kw + ) + + def _get_absolute_timeout(self, timeout): + if timeout is Timeout.DEFAULT_TIMEOUT: + return 5 # 5s is the default timeout for URLFetch. + if isinstance(timeout, Timeout): + if timeout._read is not timeout._connect: + warnings.warn( + "URLFetch does not support granular timeout settings, " + "reverting to total timeout.", AppEnginePlatformWarning) + return timeout.total + return timeout + + def _get_retries(self, retries, redirect): + if not isinstance(retries, Retry): + retries = Retry.from_int( + retries, redirect=redirect, default=self.retries) + + if retries.connect or retries.read or retries.redirect: + warnings.warn( + "URLFetch only supports total retries and does not " + "recognize connect, read, or redirect retry parameters.", + AppEnginePlatformWarning) + + return retries + + +def is_appengine(): + return (is_local_appengine() or + is_prod_appengine() or + is_prod_appengine_mvms()) + + +def is_appengine_sandbox(): + return is_appengine() and not is_prod_appengine_mvms() + + +def is_local_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Development/' in os.environ['SERVER_SOFTWARE']) + + +def is_prod_appengine(): + return ('APPENGINE_RUNTIME' in os.environ and + 'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and + not is_prod_appengine_mvms()) + + +def is_prod_appengine_mvms(): + return os.environ.get('GAE_VM', False) == 'true' diff --git a/vendor/requests/packages/urllib3/contrib/ntlmpool.py b/vendor/requests/packages/urllib3/contrib/ntlmpool.py index b8cd9330..11d0b5c3 100644 --- a/vendor/requests/packages/urllib3/contrib/ntlmpool.py +++ b/vendor/requests/packages/urllib3/contrib/ntlmpool.py @@ -1,14 +1,9 @@ -# urllib3/contrib/ntlmpool.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - """ NTLM authenticating pool, contributed by erikcederstran Issue #10, see: http://code.google.com/p/urllib3/issues/detail?id=10 """ +from __future__ import absolute_import try: from http.client import HTTPSConnection @@ -48,8 +43,8 @@ class NTLMConnectionPool(HTTPSConnectionPool): # Performs the NTLM handshake that secures the connection. The socket # must be kept open while requests are performed. self.num_connections += 1 - log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s' % - (self.num_connections, self.host, self.authurl)) + log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s', + self.num_connections, self.host, self.authurl) headers = {} headers['Connection'] = 'Keep-Alive' @@ -61,13 +56,13 @@ class NTLMConnectionPool(HTTPSConnectionPool): # Send negotiation message headers[req_header] = ( 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(self.rawuser)) - log.debug('Request headers: %s' % headers) + log.debug('Request headers: %s', headers) conn.request('GET', self.authurl, None, headers) res = conn.getresponse() reshdr = dict(res.getheaders()) - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % reshdr) - log.debug('Response data: %s [...]' % res.read(100)) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', reshdr) + log.debug('Response data: %s [...]', res.read(100)) # Remove the reference to the socket, so that it can not be closed by # the response object (we want to keep the socket open) @@ -92,12 +87,12 @@ class NTLMConnectionPool(HTTPSConnectionPool): self.pw, NegotiateFlags) headers[req_header] = 'NTLM %s' % auth_msg - log.debug('Request headers: %s' % headers) + log.debug('Request headers: %s', headers) conn.request('GET', self.authurl, None, headers) res = conn.getresponse() - log.debug('Response status: %s %s' % (res.status, res.reason)) - log.debug('Response headers: %s' % dict(res.getheaders())) - log.debug('Response data: %s [...]' % res.read()[:100]) + log.debug('Response status: %s %s', res.status, res.reason) + log.debug('Response headers: %s', dict(res.getheaders())) + log.debug('Response data: %s [...]', res.read()[:100]) if res.status != 200: if res.status == 401: raise Exception('Server rejected request: wrong ' diff --git a/vendor/requests/packages/urllib3/contrib/pyopenssl.py b/vendor/requests/packages/urllib3/contrib/pyopenssl.py index f78e7170..ed3b9cc3 100644 --- a/vendor/requests/packages/urllib3/contrib/pyopenssl.py +++ b/vendor/requests/packages/urllib3/contrib/pyopenssl.py @@ -1,4 +1,7 @@ -'''SSL with SNI-support for Python 2. +'''SSL with SNI_-support for Python 2. Follow these instructions if you would +like to verify SSL certificates in Python 2. Note, the default libraries do +*not* do certificate checking; you need to do additional work to validate +certificates yourself. This needs the following packages installed: @@ -6,9 +9,15 @@ This needs the following packages installed: * ndg-httpsclient (tested with 0.3.2) * pyasn1 (tested with 0.1.6) -To activate it call :func:`~urllib3.contrib.pyopenssl.inject_into_urllib3`. -This can be done in a ``sitecustomize`` module, or at any other time before -your application begins using ``urllib3``, like this:: +You can install them with the following command: + + pip install pyopenssl ndg-httpsclient pyasn1 + +To activate certificate checking, call +:func:`~urllib3.contrib.pyopenssl.inject_into_urllib3` from your Python code +before you begin making HTTP requests. This can be done in a ``sitecustomize`` +module, or at any other time before your application begins using ``urllib3``, +like this:: try: import urllib3.contrib.pyopenssl @@ -18,16 +27,44 @@ your application begins using ``urllib3``, like this:: Now you can use :mod:`urllib3` as you normally would, and it will support SNI when the required modules are installed. -''' -from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT -from ndg.httpsclient.subj_alt_name import SubjectAltName +Activating this module also has the positive side effect of disabling SSL/TLS +compression in Python 2 (see `CRIME attack`_). + +If you want to configure the default list of supported cipher suites, you can +set the ``urllib3.contrib.pyopenssl.DEFAULT_SSL_CIPHER_LIST`` variable. + +Module Variables +---------------- + +:var DEFAULT_SSL_CIPHER_LIST: The list of supported SSL/TLS cipher suites. + +.. _sni: https://en.wikipedia.org/wiki/Server_Name_Indication +.. _crime attack: https://en.wikipedia.org/wiki/CRIME_(security_exploit) + +''' +from __future__ import absolute_import + +try: + from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT + from ndg.httpsclient.subj_alt_name import SubjectAltName as BaseSubjectAltName +except SyntaxError as e: + raise ImportError(e) + import OpenSSL.SSL from pyasn1.codec.der import decoder as der_decoder -from socket import _fileobject +from pyasn1.type import univ, constraint +from socket import timeout, error as SocketError + +try: # Platform-specific: Python 2 + from socket import _fileobject +except ImportError: # Platform-specific: Python 3 + _fileobject = None + from urllib3.packages.backports.makefile import backport_makefile + import ssl import select -from cStringIO import StringIO +import six from .. import connection from .. import util @@ -40,16 +77,31 @@ HAS_SNI = SUBJ_ALT_NAME_SUPPORT # Map from urllib3 to PyOpenSSL compatible parameter-values. _openssl_versions = { ssl.PROTOCOL_SSLv23: OpenSSL.SSL.SSLv23_METHOD, - ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD, ssl.PROTOCOL_TLSv1: OpenSSL.SSL.TLSv1_METHOD, } + +if hasattr(ssl, 'PROTOCOL_TLSv1_1') and hasattr(OpenSSL.SSL, 'TLSv1_1_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_1] = OpenSSL.SSL.TLSv1_1_METHOD + +if hasattr(ssl, 'PROTOCOL_TLSv1_2') and hasattr(OpenSSL.SSL, 'TLSv1_2_METHOD'): + _openssl_versions[ssl.PROTOCOL_TLSv1_2] = OpenSSL.SSL.TLSv1_2_METHOD + +try: + _openssl_versions.update({ssl.PROTOCOL_SSLv3: OpenSSL.SSL.SSLv3_METHOD}) +except AttributeError: + pass + _openssl_verify = { ssl.CERT_NONE: OpenSSL.SSL.VERIFY_NONE, ssl.CERT_OPTIONAL: OpenSSL.SSL.VERIFY_PEER, - ssl.CERT_REQUIRED: OpenSSL.SSL.VERIFY_PEER - + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, + ssl.CERT_REQUIRED: + OpenSSL.SSL.VERIFY_PEER + OpenSSL.SSL.VERIFY_FAIL_IF_NO_PEER_CERT, } +DEFAULT_SSL_CIPHER_LIST = util.ssl_.DEFAULT_CIPHERS.encode('ascii') + +# OpenSSL will only write 16K at a time +SSL_WRITE_BLOCKSIZE = 16384 orig_util_HAS_SNI = util.HAS_SNI orig_connection_ssl_wrap_socket = connection.ssl_wrap_socket @@ -60,6 +112,7 @@ def inject_into_urllib3(): connection.ssl_wrap_socket = ssl_wrap_socket util.HAS_SNI = HAS_SNI + util.IS_PYOPENSSL = True def extract_from_urllib3(): @@ -67,9 +120,21 @@ def extract_from_urllib3(): connection.ssl_wrap_socket = orig_connection_ssl_wrap_socket util.HAS_SNI = orig_util_HAS_SNI + util.IS_PYOPENSSL = False -### Note: This is a slightly bug-fixed version of same from ndg-httpsclient. +# Note: This is a slightly bug-fixed version of same from ndg-httpsclient. +class SubjectAltName(BaseSubjectAltName): + '''ASN.1 implementation for subjectAltNames support''' + + # There is no limit to how many SAN certificates a certificate may have, + # however this needs to have some limit so we'll set an arbitrarily high + # limit. + sizeSpec = univ.SequenceOf.sizeSpec + \ + constraint.ValueSizeConstraint(1, 1024) + + +# Note: This is a slightly bug-fixed version of same from ndg-httpsclient. def get_subj_alt_name(peer_cert): # Search through extensions dns_name = [] @@ -80,7 +145,7 @@ def get_subj_alt_name(peer_cert): for i in range(peer_cert.get_extension_count()): ext = peer_cert.get_extension(i) ext_name = ext.get_short_name() - if ext_name != 'subjectAltName': + if ext_name != b'subjectAltName': continue # PyOpenSSL returns extension data in ASN.1 encoded form @@ -100,193 +165,107 @@ def get_subj_alt_name(peer_cert): return dns_name -class fileobject(_fileobject): - - def read(self, size=-1): - # Use max, disallow tiny reads in a loop as they are very inefficient. - # We never leave read() with any leftover data from a new recv() call - # in our internal buffer. - rbufsize = max(self._rbufsize, self.default_bufsize) - # Our use of StringIO rather than lists of string objects returned by - # recv() minimizes memory usage and fragmentation that occurs when - # rbufsize is large compared to the typical return value of recv(). - buf = self._rbuf - buf.seek(0, 2) # seek end - if size < 0: - # Read until EOF - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or EOF seen, whichever comes first - buf_len = buf.tell() - if buf_len >= size: - # Already have size bytes in our buffer? Extract and return. - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - left = size - buf_len - # recv() will malloc the amount of memory given as its - # parameter even though it often returns much less data - # than that. The returned data string is short lived - # as we copy it into a StringIO and free it. This avoids - # fragmentation issues on many platforms. - try: - data = self._sock.recv(left) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid buffer data copies when: - # - We have no data in our buffer. - # AND - # - Our call to recv returned exactly the - # number of bytes we were asked to read. - return data - if n == left: - buf.write(data) - del data # explicit free - break - assert n <= left, "recv(%d) returned %d bytes" % (left, n) - buf.write(data) - buf_len += n - del data # explicit free - #assert buf_len == buf.tell() - return buf.getvalue() - - def readline(self, size=-1): - buf = self._rbuf - buf.seek(0, 2) # seek end - if buf.tell() > 0: - # check if we already have it in our buffer - buf.seek(0) - bline = buf.readline(size) - if bline.endswith('\n') or len(bline) == size: - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return bline - del bline - if size < 0: - # Read until \n or EOF, whichever comes first - if self._rbufsize <= 1: - # Speed up unbuffered case - buf.seek(0) - buffers = [buf.read()] - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - data = None - recv = self._sock.recv - while True: - try: - while data != "\n": - data = recv(1) - if not data: - break - buffers.append(data) - except OpenSSL.SSL.WantReadError: - continue - break - return "".join(buffers) - - buf.seek(0, 2) # seek end - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - nl = data.find('\n') - if nl >= 0: - nl += 1 - buf.write(data[:nl]) - self._rbuf.write(data[nl:]) - del data - break - buf.write(data) - return buf.getvalue() - else: - # Read until size bytes or \n or EOF seen, whichever comes first - buf.seek(0, 2) # seek end - buf_len = buf.tell() - if buf_len >= size: - buf.seek(0) - rv = buf.read(size) - self._rbuf = StringIO() - self._rbuf.write(buf.read()) - return rv - self._rbuf = StringIO() # reset _rbuf. we consume it via buf. - while True: - try: - data = self._sock.recv(self._rbufsize) - except OpenSSL.SSL.WantReadError: - continue - if not data: - break - left = size - buf_len - # did we just receive a newline? - nl = data.find('\n', 0, left) - if nl >= 0: - nl += 1 - # save the excess data to _rbuf - self._rbuf.write(data[nl:]) - if buf_len: - buf.write(data[:nl]) - break - else: - # Shortcut. Avoid data copy through buf when returning - # a substring of our first recv(). - return data[:nl] - n = len(data) - if n == size and not buf_len: - # Shortcut. Avoid data copy through buf when - # returning exactly all of our first recv(). - return data - if n >= left: - buf.write(data[:left]) - self._rbuf.write(data[left:]) - break - buf.write(data) - buf_len += n - #assert buf_len == buf.tell() - return buf.getvalue() - - class WrappedSocket(object): - '''API-compatibility wrapper for Python OpenSSL's Connection-class.''' + '''API-compatibility wrapper for Python OpenSSL's Connection-class. - def __init__(self, connection, socket): + Note: _makefile_refs, _drop() and _reuse() are needed for the garbage + collector of pypy. + ''' + + def __init__(self, connection, socket, suppress_ragged_eofs=True): self.connection = connection self.socket = socket + self.suppress_ragged_eofs = suppress_ragged_eofs + self._makefile_refs = 0 + self._closed = False def fileno(self): return self.socket.fileno() - def makefile(self, mode, bufsize=-1): - return fileobject(self.connection, mode, bufsize) + # Copy-pasted from Python 3.5 source code + def _decref_socketios(self): + if self._makefile_refs > 0: + self._makefile_refs -= 1 + if self._closed: + self.close() + + def recv(self, *args, **kwargs): + try: + data = self.connection.recv(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return b'' + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return b'' + else: + raise + except OpenSSL.SSL.WantReadError: + rd, wd, ed = select.select( + [self.socket], [], [], self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv(*args, **kwargs) + else: + return data + + def recv_into(self, *args, **kwargs): + try: + return self.connection.recv_into(*args, **kwargs) + except OpenSSL.SSL.SysCallError as e: + if self.suppress_ragged_eofs and e.args == (-1, 'Unexpected EOF'): + return 0 + else: + raise SocketError(str(e)) + except OpenSSL.SSL.ZeroReturnError as e: + if self.connection.get_shutdown() == OpenSSL.SSL.RECEIVED_SHUTDOWN: + return 0 + else: + raise + except OpenSSL.SSL.WantReadError: + rd, wd, ed = select.select( + [self.socket], [], [], self.socket.gettimeout()) + if not rd: + raise timeout('The read operation timed out') + else: + return self.recv_into(*args, **kwargs) def settimeout(self, timeout): return self.socket.settimeout(timeout) + def _send_until_done(self, data): + while True: + try: + return self.connection.send(data) + except OpenSSL.SSL.WantWriteError: + _, wlist, _ = select.select([], [self.socket], [], + self.socket.gettimeout()) + if not wlist: + raise timeout() + continue + def sendall(self, data): - return self.connection.sendall(data) + total_sent = 0 + while total_sent < len(data): + sent = self._send_until_done(data[total_sent:total_sent + SSL_WRITE_BLOCKSIZE]) + total_sent += sent + + def shutdown(self): + # FIXME rethrow compatible exceptions should we ever use this + self.connection.shutdown() def close(self): - return self.connection.shutdown() + if self._makefile_refs < 1: + try: + self._closed = True + return self.connection.close() + except OpenSSL.SSL.Error: + return + else: + self._makefile_refs -= 1 def getpeercert(self, binary_form=False): x509 = self.connection.get_peer_certificate() @@ -309,6 +288,25 @@ class WrappedSocket(object): ] } + def _reuse(self): + self._makefile_refs += 1 + + def _drop(self): + if self._makefile_refs < 1: + self.close() + else: + self._makefile_refs -= 1 + + +if _fileobject: # Platform-specific: Python 2 + def makefile(self, mode, bufsize=-1): + self._makefile_refs += 1 + return _fileobject(self, mode, bufsize, close=True) +else: # Platform-specific: Python 3 + makefile = backport_makefile + +WrappedSocket.makefile = makefile + def _verify_callback(cnx, x509, err_no, err_depth, return_code): return err_no == 0 @@ -316,31 +314,45 @@ def _verify_callback(cnx, x509, err_no, err_depth, return_code): def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, ca_certs=None, server_hostname=None, - ssl_version=None): + ssl_version=None, ca_cert_dir=None): ctx = OpenSSL.SSL.Context(_openssl_versions[ssl_version]) if certfile: + keyfile = keyfile or certfile # Match behaviour of the normal python ssl library ctx.use_certificate_file(certfile) if keyfile: ctx.use_privatekey_file(keyfile) if cert_reqs != ssl.CERT_NONE: ctx.set_verify(_openssl_verify[cert_reqs], _verify_callback) - if ca_certs: + if ca_certs or ca_cert_dir: try: - ctx.load_verify_locations(ca_certs, None) + ctx.load_verify_locations(ca_certs, ca_cert_dir) except OpenSSL.SSL.Error as e: raise ssl.SSLError('bad ca_certs: %r' % ca_certs, e) + else: + ctx.set_default_verify_paths() + + # Disable TLS compression to mitigate CRIME attack (issue #309) + OP_NO_COMPRESSION = 0x20000 + ctx.set_options(OP_NO_COMPRESSION) + + # Set list of supported ciphersuites. + ctx.set_cipher_list(DEFAULT_SSL_CIPHER_LIST) cnx = OpenSSL.SSL.Connection(ctx, sock) + if isinstance(server_hostname, six.text_type): # Platform-specific: Python 3 + server_hostname = server_hostname.encode('utf-8') cnx.set_tlsext_host_name(server_hostname) cnx.set_connect_state() while True: try: cnx.do_handshake() except OpenSSL.SSL.WantReadError: - select.select([sock], [], []) + rd, _, _ = select.select([sock], [], [], sock.gettimeout()) + if not rd: + raise timeout('select timed out') continue except OpenSSL.SSL.Error as e: - raise ssl.SSLError('bad handshake', e) + raise ssl.SSLError('bad handshake: %r' % e) break return WrappedSocket(cnx, sock) diff --git a/vendor/requests/packages/urllib3/contrib/socks.py b/vendor/requests/packages/urllib3/contrib/socks.py new file mode 100644 index 00000000..81970fa6 --- /dev/null +++ b/vendor/requests/packages/urllib3/contrib/socks.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +""" +SOCKS support for urllib3 +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This contrib module contains provisional support for SOCKS proxies from within +urllib3. This module supports SOCKS4 (specifically the SOCKS4A variant) and +SOCKS5. To enable its functionality, either install PySocks or install this +module with the ``socks`` extra. + +Known Limitations: + +- Currently PySocks does not support contacting remote websites via literal + IPv6 addresses. Any such connection attempt will fail. +- Currently PySocks does not support IPv6 connections to the SOCKS proxy. Any + such connection attempt will fail. +""" +from __future__ import absolute_import + +try: + import socks +except ImportError: + import warnings + from ..exceptions import DependencyWarning + + warnings.warn(( + 'SOCKS support in urllib3 requires the installation of optional ' + 'dependencies: specifically, PySocks. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/contrib.html#socks-proxies' + ), + DependencyWarning + ) + raise + +from socket import error as SocketError, timeout as SocketTimeout + +from ..connection import ( + HTTPConnection, HTTPSConnection +) +from ..connectionpool import ( + HTTPConnectionPool, HTTPSConnectionPool +) +from ..exceptions import ConnectTimeoutError, NewConnectionError +from ..poolmanager import PoolManager +from ..util.url import parse_url + +try: + import ssl +except ImportError: + ssl = None + + +class SOCKSConnection(HTTPConnection): + """ + A plain-text HTTP connection that connects via a SOCKS proxy. + """ + def __init__(self, *args, **kwargs): + self._socks_options = kwargs.pop('_socks_options') + super(SOCKSConnection, self).__init__(*args, **kwargs) + + def _new_conn(self): + """ + Establish a new connection via the SOCKS proxy. + """ + extra_kw = {} + if self.source_address: + extra_kw['source_address'] = self.source_address + + if self.socket_options: + extra_kw['socket_options'] = self.socket_options + + try: + conn = socks.create_connection( + (self.host, self.port), + proxy_type=self._socks_options['socks_version'], + proxy_addr=self._socks_options['proxy_host'], + proxy_port=self._socks_options['proxy_port'], + proxy_username=self._socks_options['username'], + proxy_password=self._socks_options['password'], + timeout=self.timeout, + **extra_kw + ) + + except SocketTimeout as e: + raise ConnectTimeoutError( + self, "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout)) + + except socks.ProxyError as e: + # This is fragile as hell, but it seems to be the only way to raise + # useful errors here. + if e.socket_err: + error = e.socket_err + if isinstance(error, SocketTimeout): + raise ConnectTimeoutError( + self, + "Connection to %s timed out. (connect timeout=%s)" % + (self.host, self.timeout) + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % error + ) + else: + raise NewConnectionError( + self, + "Failed to establish a new connection: %s" % e + ) + + except SocketError as e: # Defensive: PySocks should catch all these. + raise NewConnectionError( + self, "Failed to establish a new connection: %s" % e) + + return conn + + +# We don't need to duplicate the Verified/Unverified distinction from +# urllib3/connection.py here because the HTTPSConnection will already have been +# correctly set to either the Verified or Unverified form by that module. This +# means the SOCKSHTTPSConnection will automatically be the correct type. +class SOCKSHTTPSConnection(SOCKSConnection, HTTPSConnection): + pass + + +class SOCKSHTTPConnectionPool(HTTPConnectionPool): + ConnectionCls = SOCKSConnection + + +class SOCKSHTTPSConnectionPool(HTTPSConnectionPool): + ConnectionCls = SOCKSHTTPSConnection + + +class SOCKSProxyManager(PoolManager): + """ + A version of the urllib3 ProxyManager that routes connections via the + defined SOCKS proxy. + """ + pool_classes_by_scheme = { + 'http': SOCKSHTTPConnectionPool, + 'https': SOCKSHTTPSConnectionPool, + } + + def __init__(self, proxy_url, username=None, password=None, + num_pools=10, headers=None, **connection_pool_kw): + parsed = parse_url(proxy_url) + + if parsed.scheme == 'socks5': + socks_version = socks.PROXY_TYPE_SOCKS5 + elif parsed.scheme == 'socks4': + socks_version = socks.PROXY_TYPE_SOCKS4 + else: + raise ValueError( + "Unable to determine SOCKS version from %s" % proxy_url + ) + + self.proxy_url = proxy_url + + socks_options = { + 'socks_version': socks_version, + 'proxy_host': parsed.host, + 'proxy_port': parsed.port, + 'username': username, + 'password': password, + } + connection_pool_kw['_socks_options'] = socks_options + + super(SOCKSProxyManager, self).__init__( + num_pools, headers, **connection_pool_kw + ) + + self.pool_classes_by_scheme = SOCKSProxyManager.pool_classes_by_scheme diff --git a/vendor/requests/packages/urllib3/exceptions.py b/vendor/requests/packages/urllib3/exceptions.py index 98ef9abc..f2e65917 100644 --- a/vendor/requests/packages/urllib3/exceptions.py +++ b/vendor/requests/packages/urllib3/exceptions.py @@ -1,17 +1,17 @@ -# urllib3/exceptions.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php +from __future__ import absolute_import +# Base Exceptions -## Base Exceptions - class HTTPError(Exception): "Base exception used by this module." pass +class HTTPWarning(Warning): + "Base warning used by this module." + pass + + class PoolError(HTTPError): "Base exception for errors caused within a pool." def __init__(self, pool, message): @@ -49,19 +49,32 @@ class DecodeError(HTTPError): pass -## Leaf Exceptions +class ProtocolError(HTTPError): + "Raised when something unexpected happens mid-request/response." + pass + + +#: Renamed to ProtocolError but aliased for backwards compatibility. +ConnectionError = ProtocolError + + +# Leaf Exceptions class MaxRetryError(RequestError): - "Raised when the maximum number of retries is exceeded." + """Raised when the maximum number of retries is exceeded. + + :param pool: The connection pool + :type pool: :class:`~urllib3.connectionpool.HTTPConnectionPool` + :param string url: The requested Url + :param exceptions.Exception reason: The underlying error + + """ def __init__(self, pool, url, reason=None): self.reason = reason - message = "Max retries exceeded with url: %s" % url - if reason: - message += " (Caused by %s: %s)" % (type(reason), reason) - else: - message += " (Caused by redirect)" + message = "Max retries exceeded with url: %s (Caused by %r)" % ( + url, reason) RequestError.__init__(self, pool, url, message) @@ -101,6 +114,11 @@ class ConnectTimeoutError(TimeoutError): pass +class NewConnectionError(ConnectTimeoutError, PoolError): + "Raised when we fail to establish a new connection. Usually ECONNREFUSED." + pass + + class EmptyPoolError(PoolError): "Raised when a pool runs out of connections and no more are allowed." pass @@ -111,7 +129,12 @@ class ClosedPoolError(PoolError): pass -class LocationParseError(ValueError, HTTPError): +class LocationValueError(ValueError, HTTPError): + "Raised when there is something wrong with a given URL input." + pass + + +class LocationParseError(LocationValueError): "Raised when get_host or similar fails to parse the URL input." def __init__(self, location): @@ -119,3 +142,68 @@ class LocationParseError(ValueError, HTTPError): HTTPError.__init__(self, message) self.location = location + + +class ResponseError(HTTPError): + "Used as a container for an error reason supplied in a MaxRetryError." + GENERIC_ERROR = 'too many error responses' + SPECIFIC_ERROR = 'too many {status_code} error responses' + + +class SecurityWarning(HTTPWarning): + "Warned when perfoming security reducing actions" + pass + + +class SubjectAltNameWarning(SecurityWarning): + "Warned when connecting to a host with a certificate missing a SAN." + pass + + +class InsecureRequestWarning(SecurityWarning): + "Warned when making an unverified HTTPS request." + pass + + +class SystemTimeWarning(SecurityWarning): + "Warned when system time is suspected to be wrong" + pass + + +class InsecurePlatformWarning(SecurityWarning): + "Warned when certain SSL configuration is not available on a platform." + pass + + +class SNIMissingWarning(HTTPWarning): + "Warned when making a HTTPS request without SNI available." + pass + + +class DependencyWarning(HTTPWarning): + """ + Warned when an attempt is made to import a module with missing optional + dependencies. + """ + pass + + +class ResponseNotChunked(ProtocolError, ValueError): + "Response needs to be chunked in order to read it as chunks." + pass + + +class ProxySchemeUnknown(AssertionError, ValueError): + "ProxyManager does not support the supplied scheme" + # TODO(t-8ch): Stop inheriting from AssertionError in v2.0. + + def __init__(self, scheme): + message = "Not supported proxy scheme %s" % scheme + super(ProxySchemeUnknown, self).__init__(message) + + +class HeaderParsingError(HTTPError): + "Raised by assert_header_parsing, but we convert it to a log.warning statement." + def __init__(self, defects, unparsed_data): + message = '%s, unparsed data: %r' % (defects or 'Unknown', unparsed_data) + super(HeaderParsingError, self).__init__(message) diff --git a/vendor/requests/packages/urllib3/fields.py b/vendor/requests/packages/urllib3/fields.py index ed017657..8fa2a127 100644 --- a/vendor/requests/packages/urllib3/fields.py +++ b/vendor/requests/packages/urllib3/fields.py @@ -1,9 +1,4 @@ -# urllib3/fields.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import import email.utils import mimetypes @@ -15,7 +10,7 @@ def guess_content_type(filename, default='application/octet-stream'): Guess the "Content-Type" of a file. :param filename: - The filename to guess the "Content-Type" of using :mod:`mimetimes`. + The filename to guess the "Content-Type" of using :mod:`mimetypes`. :param default: If no "Content-Type" can be guessed, default to `default`. """ @@ -41,11 +36,11 @@ def format_header_param(name, value): result = '%s="%s"' % (name, value) try: result.encode('ascii') - except UnicodeEncodeError: + except (UnicodeEncodeError, UnicodeDecodeError): pass else: return result - if not six.PY3: # Python 2: + if not six.PY3 and isinstance(value, six.text_type): # Python 2: value = value.encode('utf-8') value = email.utils.encode_rfc2231(value, 'utf-8') value = '%s*=%s' % (name, value) @@ -78,9 +73,10 @@ class RequestField(object): """ A :class:`~urllib3.fields.RequestField` factory from old-style tuple parameters. - Supports constructing :class:`~urllib3.fields.RequestField` from parameter - of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) - tuple where the MIME type is optional. For example: :: + Supports constructing :class:`~urllib3.fields.RequestField` from + parameter of key/value strings AND key/filetuple. A filetuple is a + (filename, data, MIME type) tuple where the MIME type is optional. + For example:: 'foo': 'bar', 'fakefile': ('foofile.txt', 'contents of foofile'), @@ -125,8 +121,8 @@ class RequestField(object): 'Content-Disposition' fields. :param header_parts: - A sequence of (k, v) typles or a :class:`dict` of (k, v) to format as - `k1="v1"; k2="v2"; ...`. + A sequence of (k, v) typles or a :class:`dict` of (k, v) to format + as `k1="v1"; k2="v2"; ...`. """ parts = [] iterable = header_parts @@ -158,7 +154,8 @@ class RequestField(object): lines.append('\r\n') return '\r\n'.join(lines) - def make_multipart(self, content_disposition=None, content_type=None, content_location=None): + def make_multipart(self, content_disposition=None, content_type=None, + content_location=None): """ Makes this request field into a multipart request field. @@ -172,6 +169,10 @@ class RequestField(object): """ self.headers['Content-Disposition'] = content_disposition or 'form-data' - self.headers['Content-Disposition'] += '; '.join(['', self._render_parts((('name', self._name), ('filename', self._filename)))]) + self.headers['Content-Disposition'] += '; '.join([ + '', self._render_parts( + (('name', self._name), ('filename', self._filename)) + ) + ]) self.headers['Content-Type'] = content_type self.headers['Content-Location'] = content_location diff --git a/vendor/requests/packages/urllib3/filepost.py b/vendor/requests/packages/urllib3/filepost.py index 4575582e..97a2843c 100644 --- a/vendor/requests/packages/urllib3/filepost.py +++ b/vendor/requests/packages/urllib3/filepost.py @@ -1,11 +1,5 @@ -# urllib3/filepost.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import import codecs -import mimetypes from uuid import uuid4 from io import BytesIO @@ -38,24 +32,23 @@ def iter_field_objects(fields): i = iter(fields) for field in i: - if isinstance(field, RequestField): - yield field - else: - yield RequestField.from_tuples(*field) + if isinstance(field, RequestField): + yield field + else: + yield RequestField.from_tuples(*field) def iter_fields(fields): """ + .. deprecated:: 1.6 + Iterate over fields. - .. deprecated :: - - The addition of `~urllib3.fields.RequestField` makes this function - obsolete. Instead, use :func:`iter_field_objects`, which returns - `~urllib3.fields.RequestField` objects, instead. + The addition of :class:`~urllib3.fields.RequestField` makes this function + obsolete. Instead, use :func:`iter_field_objects`, which returns + :class:`~urllib3.fields.RequestField` objects. Supports list of (k, v) tuples and dicts. - """ if isinstance(fields, dict): return ((k, v) for k, v in six.iteritems(fields)) diff --git a/vendor/requests/packages/urllib3/packages/__init__.py b/vendor/requests/packages/urllib3/packages/__init__.py index 37e83515..170e974c 100644 --- a/vendor/requests/packages/urllib3/packages/__init__.py +++ b/vendor/requests/packages/urllib3/packages/__init__.py @@ -2,3 +2,4 @@ from __future__ import absolute_import from . import ssl_match_hostname +__all__ = ('ssl_match_hostname', ) diff --git a/vendor/requests/packages/urllib3/packages/backports/__init__.py b/vendor/requests/packages/urllib3/packages/backports/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/vendor/requests/packages/urllib3/packages/backports/makefile.py b/vendor/requests/packages/urllib3/packages/backports/makefile.py new file mode 100644 index 00000000..75b80dcf --- /dev/null +++ b/vendor/requests/packages/urllib3/packages/backports/makefile.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +""" +backports.makefile +~~~~~~~~~~~~~~~~~~ + +Backports the Python 3 ``socket.makefile`` method for use with anything that +wants to create a "fake" socket object. +""" +import io + +from socket import SocketIO + + +def backport_makefile(self, mode="r", buffering=None, encoding=None, + errors=None, newline=None): + """ + Backport of ``socket.makefile`` from Python 3.5. + """ + if not set(mode) <= set(["r", "w", "b"]): + raise ValueError( + "invalid mode %r (only r, w, b allowed)" % (mode,) + ) + writing = "w" in mode + reading = "r" in mode or not writing + assert reading or writing + binary = "b" in mode + rawmode = "" + if reading: + rawmode += "r" + if writing: + rawmode += "w" + raw = SocketIO(self, rawmode) + self._makefile_refs += 1 + if buffering is None: + buffering = -1 + if buffering < 0: + buffering = io.DEFAULT_BUFFER_SIZE + if buffering == 0: + if not binary: + raise ValueError("unbuffered streams must be binary") + return raw + if reading and writing: + buffer = io.BufferedRWPair(raw, raw, buffering) + elif reading: + buffer = io.BufferedReader(raw, buffering) + else: + assert writing + buffer = io.BufferedWriter(raw, buffering) + if binary: + return buffer + text = io.TextIOWrapper(buffer, encoding, errors, newline) + text.mode = mode + return text diff --git a/vendor/requests/packages/urllib3/packages/ordered_dict.py b/vendor/requests/packages/urllib3/packages/ordered_dict.py index 7f8ee154..4479363c 100644 --- a/vendor/requests/packages/urllib3/packages/ordered_dict.py +++ b/vendor/requests/packages/urllib3/packages/ordered_dict.py @@ -2,7 +2,6 @@ # Passes Python2.7's test suite and incorporates all the latest updates. # Copyright 2009 Raymond Hettinger, released under the MIT License. # http://code.activestate.com/recipes/576693/ - try: from thread import get_ident as _get_ident except ImportError: diff --git a/vendor/requests/packages/urllib3/packages/six.py b/vendor/requests/packages/urllib3/packages/six.py index 27d80112..190c0239 100644 --- a/vendor/requests/packages/urllib3/packages/six.py +++ b/vendor/requests/packages/urllib3/packages/six.py @@ -1,34 +1,41 @@ """Utilities for writing code that runs on Python 2 and 3""" -#Copyright (c) 2010-2011 Benjamin Peterson +# Copyright (c) 2010-2015 Benjamin Peterson +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. -#Permission is hereby granted, free of charge, to any person obtaining a copy of -#this software and associated documentation files (the "Software"), to deal in -#the Software without restriction, including without limitation the rights to -#use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -#the Software, and to permit persons to whom the Software is furnished to do so, -#subject to the following conditions: - -#The above copyright notice and this permission notice shall be included in all -#copies or substantial portions of the Software. - -#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -#FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -#COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -#IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -#CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +from __future__ import absolute_import +import functools +import itertools import operator import sys import types __author__ = "Benjamin Peterson " -__version__ = "1.2.0" # Revision 41c74fef2ded +__version__ = "1.10.0" -# True if we are running on Python 3. +# Useful for very coarse version differentiation. +PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 +PY34 = sys.version_info[0:2] >= (3, 4) if PY3: string_types = str, @@ -51,6 +58,7 @@ else: else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): + def __len__(self): return 1 << 31 try: @@ -61,7 +69,7 @@ else: else: # 64-bit MAXSIZE = int((1 << 63) - 1) - del X + del X def _add_doc(func, doc): @@ -82,9 +90,13 @@ class _LazyDescr(object): def __get__(self, obj, tp): result = self._resolve() - setattr(obj, self.name, result) - # This is a bit ugly, but it avoids running this again. - delattr(tp, self.name) + setattr(obj, self.name, result) # Invokes __set__. + try: + # This is a bit ugly, but it avoids running this again by + # removing this descriptor. + delattr(obj.__class__, self.name) + except AttributeError: + pass return result @@ -102,6 +114,27 @@ class MovedModule(_LazyDescr): def _resolve(self): return _import_module(self.mod) + def __getattr__(self, attr): + _module = self._resolve() + value = getattr(_module, attr) + setattr(self, attr, value) + return value + + +class _LazyModule(types.ModuleType): + + def __init__(self, name): + super(_LazyModule, self).__init__(name) + self.__doc__ = self.__class__.__doc__ + + def __dir__(self): + attrs = ["__doc__", "__name__"] + attrs += [attr.name for attr in self._moved_attributes] + return attrs + + # Subclasses should override this + _moved_attributes = [] + class MovedAttribute(_LazyDescr): @@ -128,30 +161,111 @@ class MovedAttribute(_LazyDescr): return getattr(module, self.attr) +class _SixMetaPathImporter(object): + + """ + A meta path importer to import six.moves and its submodules. + + This class implements a PEP302 finder and loader. It should be compatible + with Python 2.5 and all existing versions of Python3 + """ + + def __init__(self, six_module_name): + self.name = six_module_name + self.known_modules = {} + + def _add_module(self, mod, *fullnames): + for fullname in fullnames: + self.known_modules[self.name + "." + fullname] = mod + + def _get_module(self, fullname): + return self.known_modules[self.name + "." + fullname] + + def find_module(self, fullname, path=None): + if fullname in self.known_modules: + return self + return None + + def __get_module(self, fullname): + try: + return self.known_modules[fullname] + except KeyError: + raise ImportError("This loader does not know module " + fullname) + + def load_module(self, fullname): + try: + # in case of a reload + return sys.modules[fullname] + except KeyError: + pass + mod = self.__get_module(fullname) + if isinstance(mod, MovedModule): + mod = mod._resolve() + else: + mod.__loader__ = self + sys.modules[fullname] = mod + return mod + + def is_package(self, fullname): + """ + Return true, if the named module is a package. + + We need this method to get correct spec objects with + Python 3.4 (see PEP451) + """ + return hasattr(self.__get_module(fullname), "__path__") + + def get_code(self, fullname): + """Return None + + Required, if is_package is implemented""" + self.__get_module(fullname) # eventually raises ImportError + return None + get_source = get_code # same as get_code + +_importer = _SixMetaPathImporter(__name__) + + +class _MovedItems(_LazyModule): -class _MovedItems(types.ModuleType): """Lazy loading of moved objects""" + __path__ = [] # mark as package _moved_attributes = [ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), + MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), + MovedAttribute("intern", "__builtin__", "sys"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), - MovedAttribute("reload_module", "__builtin__", "imp", "reload"), + MovedAttribute("getcwd", "os", "os", "getcwdu", "getcwd"), + MovedAttribute("getcwdb", "os", "os", "getcwd", "getcwdb"), + MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), + MovedAttribute("reload_module", "__builtin__", "importlib" if PY34 else "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), + MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), + MovedAttribute("UserDict", "UserDict", "collections"), + MovedAttribute("UserList", "UserList", "collections"), + MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), - + MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), MovedModule("builtins", "__builtin__"), MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), + MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), + MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), + MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), + MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), + MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), + MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), @@ -159,12 +273,14 @@ _moved_attributes = [ MovedModule("queue", "Queue"), MovedModule("reprlib", "repr"), MovedModule("socketserver", "SocketServer"), + MovedModule("_thread", "thread", "_thread"), MovedModule("tkinter", "Tkinter"), MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), MovedModule("tkinter_tix", "Tix", "tkinter.tix"), + MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), MovedModule("tkinter_colorchooser", "tkColorChooser", @@ -176,14 +292,195 @@ _moved_attributes = [ MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), + MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), + MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), + MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), - MovedModule("winreg", "_winreg"), + MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), + MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), ] +# Add windows specific modules. +if sys.platform == "win32": + _moved_attributes += [ + MovedModule("winreg", "_winreg"), + ] + for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) + if isinstance(attr, MovedModule): + _importer._add_module(attr, "moves." + attr.name) del attr -moves = sys.modules[__name__ + ".moves"] = _MovedItems("moves") +_MovedItems._moved_attributes = _moved_attributes + +moves = _MovedItems(__name__ + ".moves") +_importer._add_module(moves, "moves") + + +class Module_six_moves_urllib_parse(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_parse""" + + +_urllib_parse_moved_attributes = [ + MovedAttribute("ParseResult", "urlparse", "urllib.parse"), + MovedAttribute("SplitResult", "urlparse", "urllib.parse"), + MovedAttribute("parse_qs", "urlparse", "urllib.parse"), + MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), + MovedAttribute("urldefrag", "urlparse", "urllib.parse"), + MovedAttribute("urljoin", "urlparse", "urllib.parse"), + MovedAttribute("urlparse", "urlparse", "urllib.parse"), + MovedAttribute("urlsplit", "urlparse", "urllib.parse"), + MovedAttribute("urlunparse", "urlparse", "urllib.parse"), + MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), + MovedAttribute("quote", "urllib", "urllib.parse"), + MovedAttribute("quote_plus", "urllib", "urllib.parse"), + MovedAttribute("unquote", "urllib", "urllib.parse"), + MovedAttribute("unquote_plus", "urllib", "urllib.parse"), + MovedAttribute("urlencode", "urllib", "urllib.parse"), + MovedAttribute("splitquery", "urllib", "urllib.parse"), + MovedAttribute("splittag", "urllib", "urllib.parse"), + MovedAttribute("splituser", "urllib", "urllib.parse"), + MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), + MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), + MovedAttribute("uses_params", "urlparse", "urllib.parse"), + MovedAttribute("uses_query", "urlparse", "urllib.parse"), + MovedAttribute("uses_relative", "urlparse", "urllib.parse"), +] +for attr in _urllib_parse_moved_attributes: + setattr(Module_six_moves_urllib_parse, attr.name, attr) +del attr + +Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes + +_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), + "moves.urllib_parse", "moves.urllib.parse") + + +class Module_six_moves_urllib_error(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_error""" + + +_urllib_error_moved_attributes = [ + MovedAttribute("URLError", "urllib2", "urllib.error"), + MovedAttribute("HTTPError", "urllib2", "urllib.error"), + MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), +] +for attr in _urllib_error_moved_attributes: + setattr(Module_six_moves_urllib_error, attr.name, attr) +del attr + +Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes + +_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), + "moves.urllib_error", "moves.urllib.error") + + +class Module_six_moves_urllib_request(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_request""" + + +_urllib_request_moved_attributes = [ + MovedAttribute("urlopen", "urllib2", "urllib.request"), + MovedAttribute("install_opener", "urllib2", "urllib.request"), + MovedAttribute("build_opener", "urllib2", "urllib.request"), + MovedAttribute("pathname2url", "urllib", "urllib.request"), + MovedAttribute("url2pathname", "urllib", "urllib.request"), + MovedAttribute("getproxies", "urllib", "urllib.request"), + MovedAttribute("Request", "urllib2", "urllib.request"), + MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), + MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), + MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), + MovedAttribute("BaseHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), + MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), + MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), + MovedAttribute("FileHandler", "urllib2", "urllib.request"), + MovedAttribute("FTPHandler", "urllib2", "urllib.request"), + MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), + MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), + MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), + MovedAttribute("urlretrieve", "urllib", "urllib.request"), + MovedAttribute("urlcleanup", "urllib", "urllib.request"), + MovedAttribute("URLopener", "urllib", "urllib.request"), + MovedAttribute("FancyURLopener", "urllib", "urllib.request"), + MovedAttribute("proxy_bypass", "urllib", "urllib.request"), +] +for attr in _urllib_request_moved_attributes: + setattr(Module_six_moves_urllib_request, attr.name, attr) +del attr + +Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes + +_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), + "moves.urllib_request", "moves.urllib.request") + + +class Module_six_moves_urllib_response(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_response""" + + +_urllib_response_moved_attributes = [ + MovedAttribute("addbase", "urllib", "urllib.response"), + MovedAttribute("addclosehook", "urllib", "urllib.response"), + MovedAttribute("addinfo", "urllib", "urllib.response"), + MovedAttribute("addinfourl", "urllib", "urllib.response"), +] +for attr in _urllib_response_moved_attributes: + setattr(Module_six_moves_urllib_response, attr.name, attr) +del attr + +Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes + +_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), + "moves.urllib_response", "moves.urllib.response") + + +class Module_six_moves_urllib_robotparser(_LazyModule): + + """Lazy loading of moved objects in six.moves.urllib_robotparser""" + + +_urllib_robotparser_moved_attributes = [ + MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), +] +for attr in _urllib_robotparser_moved_attributes: + setattr(Module_six_moves_urllib_robotparser, attr.name, attr) +del attr + +Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes + +_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), + "moves.urllib_robotparser", "moves.urllib.robotparser") + + +class Module_six_moves_urllib(types.ModuleType): + + """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" + __path__ = [] # mark as package + parse = _importer._get_module("moves.urllib_parse") + error = _importer._get_module("moves.urllib_error") + request = _importer._get_module("moves.urllib_request") + response = _importer._get_module("moves.urllib_response") + robotparser = _importer._get_module("moves.urllib_robotparser") + + def __dir__(self): + return ['parse', 'error', 'request', 'response', 'robotparser'] + +_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), + "moves.urllib") def add_move(move): @@ -206,22 +503,18 @@ if PY3: _meth_func = "__func__" _meth_self = "__self__" + _func_closure = "__closure__" _func_code = "__code__" _func_defaults = "__defaults__" - - _iterkeys = "keys" - _itervalues = "values" - _iteritems = "items" + _func_globals = "__globals__" else: _meth_func = "im_func" _meth_self = "im_self" + _func_closure = "func_closure" _func_code = "func_code" _func_defaults = "func_defaults" - - _iterkeys = "iterkeys" - _itervalues = "itervalues" - _iteritems = "iteritems" + _func_globals = "func_globals" try: @@ -232,18 +525,33 @@ except NameError: next = advance_iterator +try: + callable = callable +except NameError: + def callable(obj): + return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + + if PY3: def get_unbound_function(unbound): return unbound - Iterator = object + create_bound_method = types.MethodType - def callable(obj): - return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) + def create_unbound_method(func, cls): + return func + + Iterator = object else: def get_unbound_function(unbound): return unbound.im_func + def create_bound_method(func, obj): + return types.MethodType(func, obj, obj.__class__) + + def create_unbound_method(func, cls): + return types.MethodType(func, None, cls) + class Iterator(object): def next(self): @@ -256,90 +564,179 @@ _add_doc(get_unbound_function, get_method_function = operator.attrgetter(_meth_func) get_method_self = operator.attrgetter(_meth_self) +get_function_closure = operator.attrgetter(_func_closure) get_function_code = operator.attrgetter(_func_code) get_function_defaults = operator.attrgetter(_func_defaults) +get_function_globals = operator.attrgetter(_func_globals) -def iterkeys(d): - """Return an iterator over the keys of a dictionary.""" - return iter(getattr(d, _iterkeys)()) +if PY3: + def iterkeys(d, **kw): + return iter(d.keys(**kw)) -def itervalues(d): - """Return an iterator over the values of a dictionary.""" - return iter(getattr(d, _itervalues)()) + def itervalues(d, **kw): + return iter(d.values(**kw)) -def iteritems(d): - """Return an iterator over the (key, value) pairs of a dictionary.""" - return iter(getattr(d, _iteritems)()) + def iteritems(d, **kw): + return iter(d.items(**kw)) + + def iterlists(d, **kw): + return iter(d.lists(**kw)) + + viewkeys = operator.methodcaller("keys") + + viewvalues = operator.methodcaller("values") + + viewitems = operator.methodcaller("items") +else: + def iterkeys(d, **kw): + return d.iterkeys(**kw) + + def itervalues(d, **kw): + return d.itervalues(**kw) + + def iteritems(d, **kw): + return d.iteritems(**kw) + + def iterlists(d, **kw): + return d.iterlists(**kw) + + viewkeys = operator.methodcaller("viewkeys") + + viewvalues = operator.methodcaller("viewvalues") + + viewitems = operator.methodcaller("viewitems") + +_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") +_add_doc(itervalues, "Return an iterator over the values of a dictionary.") +_add_doc(iteritems, + "Return an iterator over the (key, value) pairs of a dictionary.") +_add_doc(iterlists, + "Return an iterator over the (key, [values]) pairs of a dictionary.") if PY3: def b(s): return s.encode("latin-1") + def u(s): return s - if sys.version_info[1] <= 1: - def int2byte(i): - return bytes((i,)) - else: - # This is about 2x faster than the implementation above on 3.2+ - int2byte = operator.methodcaller("to_bytes", 1, "big") + unichr = chr + import struct + int2byte = struct.Struct(">B").pack + del struct + byte2int = operator.itemgetter(0) + indexbytes = operator.getitem + iterbytes = iter import io StringIO = io.StringIO BytesIO = io.BytesIO + _assertCountEqual = "assertCountEqual" + if sys.version_info[1] <= 1: + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" + else: + _assertRaisesRegex = "assertRaisesRegex" + _assertRegex = "assertRegex" else: def b(s): return s + # Workaround for standalone backslash + def u(s): - return unicode(s, "unicode_escape") + return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") + unichr = unichr int2byte = chr + + def byte2int(bs): + return ord(bs[0]) + + def indexbytes(buf, i): + return ord(buf[i]) + iterbytes = functools.partial(itertools.imap, ord) import StringIO StringIO = BytesIO = StringIO.StringIO + _assertCountEqual = "assertItemsEqual" + _assertRaisesRegex = "assertRaisesRegexp" + _assertRegex = "assertRegexpMatches" _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") -if PY3: - import builtins - exec_ = getattr(builtins, "exec") +def assertCountEqual(self, *args, **kwargs): + return getattr(self, _assertCountEqual)(*args, **kwargs) +def assertRaisesRegex(self, *args, **kwargs): + return getattr(self, _assertRaisesRegex)(*args, **kwargs) + + +def assertRegex(self, *args, **kwargs): + return getattr(self, _assertRegex)(*args, **kwargs) + + +if PY3: + exec_ = getattr(moves.builtins, "exec") + def reraise(tp, value, tb=None): + if value is None: + value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value - - print_ = getattr(builtins, "print") - del builtins - else: - def exec_(code, globs=None, locs=None): + def exec_(_code_, _globs_=None, _locs_=None): """Execute code in a namespace.""" - if globs is None: + if _globs_ is None: frame = sys._getframe(1) - globs = frame.f_globals - if locs is None: - locs = frame.f_locals + _globs_ = frame.f_globals + if _locs_ is None: + _locs_ = frame.f_locals del frame - elif locs is None: - locs = globs - exec("""exec code in globs, locs""") - + elif _locs_ is None: + _locs_ = _globs_ + exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): raise tp, value, tb """) +if sys.version_info[:2] == (3, 2): + exec_("""def raise_from(value, from_value): + if from_value is None: + raise value + raise value from from_value +""") +elif sys.version_info[:2] > (3, 2): + exec_("""def raise_from(value, from_value): + raise value from from_value +""") +else: + def raise_from(value, from_value): + raise value + + +print_ = getattr(moves.builtins, "print", None) +if print_ is None: def print_(*args, **kwargs): - """The new-style print function.""" + """The new-style print function for Python 2.4 and 2.5.""" fp = kwargs.pop("file", sys.stdout) if fp is None: return + def write(data): if not isinstance(data, basestring): data = str(data) + # If the file has an encoding, encode unicode with it. + if (isinstance(fp, file) and + isinstance(data, unicode) and + fp.encoding is not None): + errors = getattr(fp, "errors", None) + if errors is None: + errors = "strict" + data = data.encode(fp.encoding, errors) fp.write(data) want_unicode = False sep = kwargs.pop("sep", None) @@ -376,10 +773,96 @@ else: write(sep) write(arg) write(end) +if sys.version_info[:2] < (3, 3): + _print = print_ + + def print_(*args, **kwargs): + fp = kwargs.get("file", sys.stdout) + flush = kwargs.pop("flush", False) + _print(*args, **kwargs) + if flush and fp is not None: + fp.flush() _add_doc(reraise, """Reraise an exception.""") +if sys.version_info[0:2] < (3, 4): + def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, + updated=functools.WRAPPER_UPDATES): + def wrapper(f): + f = functools.wraps(wrapped, assigned, updated)(f) + f.__wrapped__ = wrapped + return f + return wrapper +else: + wraps = functools.wraps -def with_metaclass(meta, base=object): + +def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" - return meta("NewBase", (base,), {}) + # This requires a bit of explanation: the basic idea is to make a dummy + # metaclass for one level of class instantiation that replaces itself with + # the actual metaclass. + class metaclass(meta): + + def __new__(cls, name, this_bases, d): + return meta(name, bases, d) + return type.__new__(metaclass, 'temporary_class', (), {}) + + +def add_metaclass(metaclass): + """Class decorator for creating a class with a metaclass.""" + def wrapper(cls): + orig_vars = cls.__dict__.copy() + slots = orig_vars.get('__slots__') + if slots is not None: + if isinstance(slots, str): + slots = [slots] + for slots_var in slots: + orig_vars.pop(slots_var) + orig_vars.pop('__dict__', None) + orig_vars.pop('__weakref__', None) + return metaclass(cls.__name__, cls.__bases__, orig_vars) + return wrapper + + +def python_2_unicode_compatible(klass): + """ + A decorator that defines __unicode__ and __str__ methods under Python 2. + Under Python 3 it does nothing. + + To support Python 2 and 3 with a single code base, define a __str__ method + returning text and apply this decorator to the class. + """ + if PY2: + if '__str__' not in klass.__dict__: + raise ValueError("@python_2_unicode_compatible cannot be applied " + "to %s because it doesn't define __str__()." % + klass.__name__) + klass.__unicode__ = klass.__str__ + klass.__str__ = lambda self: self.__unicode__().encode('utf-8') + return klass + + +# Complete the moves implementation. +# This code is at the end of this module to speed up module loading. +# Turn this module into a package. +__path__ = [] # required for PEP 302 and PEP 451 +__package__ = __name__ # see PEP 366 @ReservedAssignment +if globals().get("__spec__") is not None: + __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable +# Remove other six meta path importers, since they cause problems. This can +# happen if six is removed from sys.modules and then reloaded. (Setuptools does +# this for some reason.) +if sys.meta_path: + for i, importer in enumerate(sys.meta_path): + # Here's some real nastiness: Another "instance" of the six module might + # be floating around. Therefore, we can't use isinstance() to check for + # the six meta path importer, since the other six instance will have + # inserted an importer with different class. + if (type(importer).__name__ == "_SixMetaPathImporter" and + importer.name == __name__): + del sys.meta_path[i] + break + del i, importer +# Finally, add the importer to the meta path import hook. +sys.meta_path.append(_importer) diff --git a/vendor/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore b/vendor/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore new file mode 100644 index 00000000..0a764a4d --- /dev/null +++ b/vendor/requests/packages/urllib3/packages/ssl_match_hostname/.gitignore @@ -0,0 +1 @@ +env diff --git a/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py b/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py index 3aa5b2e1..dd59a75f 100644 --- a/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +++ b/vendor/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py @@ -7,7 +7,7 @@ except ImportError: from backports.ssl_match_hostname import CertificateError, match_hostname except ImportError: # Our vendored copy - from _implementation import CertificateError, match_hostname + from ._implementation import CertificateError, match_hostname # Not needed, but documenting what we provide. __all__ = ('CertificateError', 'match_hostname') diff --git a/vendor/requests/packages/urllib3/poolmanager.py b/vendor/requests/packages/urllib3/poolmanager.py index c16519f8..7ed00b1c 100644 --- a/vendor/requests/packages/urllib3/poolmanager.py +++ b/vendor/requests/packages/urllib3/poolmanager.py @@ -1,9 +1,6 @@ -# urllib3/poolmanager.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import +import collections +import functools import logging try: # Python 3 @@ -14,23 +11,78 @@ except ImportError: from ._collections import RecentlyUsedContainer from .connectionpool import HTTPConnectionPool, HTTPSConnectionPool from .connectionpool import port_by_scheme +from .exceptions import LocationValueError, MaxRetryError, ProxySchemeUnknown from .request import RequestMethods -from .util import parse_url +from .util.url import parse_url +from .util.retry import Retry __all__ = ['PoolManager', 'ProxyManager', 'proxy_from_url'] +log = logging.getLogger(__name__) + +SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', + 'ssl_version', 'ca_cert_dir') + +# The base fields to use when determining what pool to get a connection from; +# these do not rely on the ``connection_pool_kw`` and can be determined by the +# URL and potentially the ``urllib3.connection.port_by_scheme`` dictionary. +# +# All custom key schemes should include the fields in this key at a minimum. +BasePoolKey = collections.namedtuple('BasePoolKey', ('scheme', 'host', 'port')) + +# The fields to use when determining what pool to get a HTTP and HTTPS +# connection from. All additional fields must be present in the PoolManager's +# ``connection_pool_kw`` instance variable. +HTTPPoolKey = collections.namedtuple( + 'HTTPPoolKey', BasePoolKey._fields + ('timeout', 'retries', 'strict', + 'block', 'source_address') +) +HTTPSPoolKey = collections.namedtuple( + 'HTTPSPoolKey', HTTPPoolKey._fields + SSL_KEYWORDS +) + + +def _default_key_normalizer(key_class, request_context): + """ + Create a pool key of type ``key_class`` for a request. + + According to RFC 3986, both the scheme and host are case-insensitive. + Therefore, this function normalizes both before constructing the pool + key for an HTTPS request. If you wish to change this behaviour, provide + alternate callables to ``key_fn_by_scheme``. + + :param key_class: + The class to use when constructing the key. This should be a namedtuple + with the ``scheme`` and ``host`` keys at a minimum. + + :param request_context: + A dictionary-like object that contain the context for a request. + It should contain a key for each field in the :class:`HTTPPoolKey` + """ + context = {} + for key in key_class._fields: + context[key] = request_context.get(key) + context['scheme'] = context['scheme'].lower() + context['host'] = context['host'].lower() + return key_class(**context) + + +# A dictionary that maps a scheme to a callable that creates a pool key. +# This can be used to alter the way pool keys are constructed, if desired. +# Each PoolManager makes a copy of this dictionary so they can be configured +# globally here, or individually on the instance. +key_fn_by_scheme = { + 'http': functools.partial(_default_key_normalizer, HTTPPoolKey), + 'https': functools.partial(_default_key_normalizer, HTTPSPoolKey), +} + pool_classes_by_scheme = { 'http': HTTPConnectionPool, 'https': HTTPSConnectionPool, } -log = logging.getLogger(__name__) - -SSL_KEYWORDS = ('key_file', 'cert_file', 'cert_reqs', 'ca_certs', - 'ssl_version') - class PoolManager(RequestMethods): """ @@ -49,7 +101,7 @@ class PoolManager(RequestMethods): Additional parameters are used to create fresh :class:`urllib3.connectionpool.ConnectionPool` instances. - Example: :: + Example:: >>> manager = PoolManager(num_pools=2) >>> r = manager.request('GET', 'http://google.com/') @@ -68,6 +120,19 @@ class PoolManager(RequestMethods): self.pools = RecentlyUsedContainer(num_pools, dispose_func=lambda p: p.close()) + # Locally set the pool classes and keys so other PoolManagers can + # override them. + self.pool_classes_by_scheme = pool_classes_by_scheme + self.key_fn_by_scheme = key_fn_by_scheme.copy() + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.clear() + # Return False to re-raise any potential exceptions + return False + def _new_pool(self, scheme, host, port): """ Create a new :class:`ConnectionPool` based on host, port and scheme. @@ -76,7 +141,7 @@ class PoolManager(RequestMethods): by :meth:`connection_from_url` and companion methods. It is intended to be overridden for customization. """ - pool_cls = pool_classes_by_scheme[scheme] + pool_cls = self.pool_classes_by_scheme[scheme] kwargs = self.connection_pool_kw if scheme == 'http': kwargs = self.connection_pool_kw.copy() @@ -102,12 +167,39 @@ class PoolManager(RequestMethods): ``urllib3.connectionpool.port_by_scheme``. """ - scheme = scheme or 'http' + if not host: + raise LocationValueError("No host specified.") - port = port or port_by_scheme.get(scheme, 80) + request_context = self.connection_pool_kw.copy() + request_context['scheme'] = scheme or 'http' + if not port: + port = port_by_scheme.get(request_context['scheme'].lower(), 80) + request_context['port'] = port + request_context['host'] = host - pool_key = (scheme, host, port) + return self.connection_from_context(request_context) + def connection_from_context(self, request_context): + """ + Get a :class:`ConnectionPool` based on the request context. + + ``request_context`` must at least contain the ``scheme`` key and its + value must be a key in ``key_fn_by_scheme`` instance variable. + """ + scheme = request_context['scheme'].lower() + pool_key_constructor = self.key_fn_by_scheme[scheme] + pool_key = pool_key_constructor(request_context) + + return self.connection_from_pool_key(pool_key) + + def connection_from_pool_key(self, pool_key): + """ + Get a :class:`ConnectionPool` based on the provided pool key. + + ``pool_key`` should be a namedtuple that only contains immutable + objects. At a minimum it must have the ``scheme``, ``host``, and + ``port`` fields. + """ with self.pools.lock: # If the scheme, host, or port doesn't match existing open # connections, open a new ConnectionPool. @@ -116,8 +208,9 @@ class PoolManager(RequestMethods): return pool # Make a fresh ConnectionPool of the desired type - pool = self._new_pool(scheme, host, port) + pool = self._new_pool(pool_key.scheme, pool_key.host, pool_key.port) self.pools[pool_key] = pool + return pool def connection_from_url(self, url): @@ -161,13 +254,25 @@ class PoolManager(RequestMethods): # Support relative URLs for redirecting. redirect_location = urljoin(url, redirect_location) - # RFC 2616, Section 10.3.4 + # RFC 7231, Section 6.4.4 if response.status == 303: method = 'GET' - log.info("Redirecting %s -> %s" % (url, redirect_location)) - kw['retries'] = kw.get('retries', 3) - 1 # Persist retries countdown + retries = kw.get('retries') + if not isinstance(retries, Retry): + retries = Retry.from_int(retries, redirect=redirect) + + try: + retries = retries.increment(method, url, response=response, _pool=conn) + except MaxRetryError: + if retries.raise_on_redirect: + raise + return response + + kw['retries'] = retries kw['redirect'] = redirect + + log.info("Redirecting %s -> %s", url, redirect_location) return self.urlopen(method, redirect_location, **kw) @@ -176,7 +281,7 @@ class ProxyManager(PoolManager): Behaves just like :class:`PoolManager`, but sends all requests through the defined proxy, using the CONNECT method for HTTPS URLs. - :param poxy_url: + :param proxy_url: The URL of the proxy to be used. :param proxy_headers: @@ -208,12 +313,16 @@ class ProxyManager(PoolManager): if not proxy.port: port = port_by_scheme.get(proxy.scheme, 80) proxy = proxy._replace(port=port) + + if proxy.scheme not in ("http", "https"): + raise ProxySchemeUnknown(proxy.scheme) + self.proxy = proxy self.proxy_headers = proxy_headers or {} - assert self.proxy.scheme in ("http", "https"), \ - 'Not supported proxy scheme %s' % self.proxy.scheme + connection_pool_kw['_proxy'] = self.proxy connection_pool_kw['_proxy_headers'] = self.proxy_headers + super(ProxyManager, self).__init__( num_pools, headers, **connection_pool_kw) @@ -248,10 +357,10 @@ class ProxyManager(PoolManager): # For proxied HTTPS requests, httplib sets the necessary headers # on the CONNECT to the proxy. For HTTP, we'll definitely # need to set 'Host' at the very least. - kw['headers'] = self._set_proxy_headers(url, kw.get('headers', - self.headers)) + headers = kw.get('headers', self.headers) + kw['headers'] = self._set_proxy_headers(url, headers) - return super(ProxyManager, self).urlopen(method, url, redirect, **kw) + return super(ProxyManager, self).urlopen(method, url, redirect=redirect, **kw) def proxy_from_url(url, **kw): diff --git a/vendor/requests/packages/urllib3/request.py b/vendor/requests/packages/urllib3/request.py index 66a9a0e6..d5aa62d8 100644 --- a/vendor/requests/packages/urllib3/request.py +++ b/vendor/requests/packages/urllib3/request.py @@ -1,9 +1,4 @@ -# urllib3/request.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - +from __future__ import absolute_import try: from urllib.parse import urlencode except ImportError: @@ -26,8 +21,8 @@ class RequestMethods(object): Specifically, - :meth:`.request_encode_url` is for sending requests whose fields are encoded - in the URL (such as GET, HEAD, DELETE). + :meth:`.request_encode_url` is for sending requests whose fields are + encoded in the URL (such as GET, HEAD, DELETE). :meth:`.request_encode_body` is for sending requests whose fields are encoded in the *body* of the request using multipart or www-form-urlencoded @@ -45,14 +40,13 @@ class RequestMethods(object): """ _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS']) - _encode_body_methods = set(['PATCH', 'POST', 'PUT', 'TRACE']) def __init__(self, headers=None): self.headers = headers or {} def urlopen(self, method, url, body=None, headers=None, encode_multipart=True, multipart_boundary=None, - **kw): # Abstract + **kw): # Abstract raise NotImplemented("Classes extending RequestMethods must implement " "their own ``urlopen`` method.") @@ -62,8 +56,8 @@ class RequestMethods(object): ``fields`` based on the ``method`` used. This is a convenience method that requires the least amount of manual - effort. It can be used in most situations, while still having the option - to drop down to more specific methods when necessary, such as + effort. It can be used in most situations, while still having the + option to drop down to more specific methods when necessary, such as :meth:`request_encode_url`, :meth:`request_encode_body`, or even the lowest level :meth:`urlopen`. """ @@ -71,21 +65,29 @@ class RequestMethods(object): if method in self._encode_url_methods: return self.request_encode_url(method, url, fields=fields, - headers=headers, - **urlopen_kw) + headers=headers, + **urlopen_kw) else: return self.request_encode_body(method, url, fields=fields, - headers=headers, - **urlopen_kw) + headers=headers, + **urlopen_kw) - def request_encode_url(self, method, url, fields=None, **urlopen_kw): + def request_encode_url(self, method, url, fields=None, headers=None, + **urlopen_kw): """ Make a request using :meth:`urlopen` with the ``fields`` encoded in the url. This is useful for request methods like GET, HEAD, DELETE, etc. """ + if headers is None: + headers = self.headers + + extra_kw = {'headers': headers} + extra_kw.update(urlopen_kw) + if fields: url += '?' + urlencode(fields) - return self.urlopen(method, url, **urlopen_kw) + + return self.urlopen(method, url, **extra_kw) def request_encode_body(self, method, url, fields=None, headers=None, encode_multipart=True, multipart_boundary=None, @@ -95,18 +97,18 @@ class RequestMethods(object): the body. This is useful for request methods like POST, PUT, PATCH, etc. When ``encode_multipart=True`` (default), then - :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode the - payload with the appropriate content type. Otherwise + :meth:`urllib3.filepost.encode_multipart_formdata` is used to encode + the payload with the appropriate content type. Otherwise :meth:`urllib.urlencode` is used with the 'application/x-www-form-urlencoded' content type. Multipart encoding must be used when posting files, and it's reasonably - safe to use it in other times too. However, it may break request signing, - such as with OAuth. + safe to use it in other times too. However, it may break request + signing, such as with OAuth. Supports an optional ``fields`` parameter of key/value strings AND key/filetuple. A filetuple is a (filename, data, MIME type) tuple where - the MIME type is optional. For example: :: + the MIME type is optional. For example:: fields = { 'foo': 'bar', @@ -120,23 +122,30 @@ class RequestMethods(object): When uploading a file, providing a filename (the first parameter of the tuple) is optional but recommended to best mimick behavior of browsers. - Note that if ``headers`` are supplied, the 'Content-Type' header will be - overwritten because it depends on the dynamic random boundary string + Note that if ``headers`` are supplied, the 'Content-Type' header will + be overwritten because it depends on the dynamic random boundary string which is used to compose the body of the request. The random boundary string can be explicitly set with the ``multipart_boundary`` parameter. """ - if encode_multipart: - body, content_type = encode_multipart_formdata(fields or {}, - boundary=multipart_boundary) - else: - body, content_type = (urlencode(fields or {}), - 'application/x-www-form-urlencoded') - if headers is None: headers = self.headers - headers_ = {'Content-Type': content_type} - headers_.update(headers) + extra_kw = {'headers': {}} - return self.urlopen(method, url, body=body, headers=headers_, - **urlopen_kw) + if fields: + if 'body' in urlopen_kw: + raise TypeError( + "request got values for both 'fields' and 'body', can only specify one.") + + if encode_multipart: + body, content_type = encode_multipart_formdata(fields, boundary=multipart_boundary) + else: + body, content_type = urlencode(fields), 'application/x-www-form-urlencoded' + + extra_kw['body'] = body + extra_kw['headers'] = {'Content-Type': content_type} + + extra_kw['headers'].update(headers) + extra_kw.update(urlopen_kw) + + return self.urlopen(method, url, **extra_kw) diff --git a/vendor/requests/packages/urllib3/response.py b/vendor/requests/packages/urllib3/response.py index 6a1fe1a7..55679032 100644 --- a/vendor/requests/packages/urllib3/response.py +++ b/vendor/requests/packages/urllib3/response.py @@ -1,20 +1,18 @@ -# urllib3/response.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -import logging +from __future__ import absolute_import +from contextlib import contextmanager import zlib import io +from socket import timeout as SocketTimeout +from socket import error as SocketError -from .exceptions import DecodeError -from .packages.six import string_types as basestring, binary_type -from .util import is_fp_closed - - -log = logging.getLogger(__name__) +from ._collections import HTTPHeaderDict +from .exceptions import ( + ProtocolError, DecodeError, ReadTimeoutError, ResponseNotChunked +) +from .packages.six import string_types as basestring, binary_type, PY3 +from .packages.six.moves import http_client as httplib +from .connection import HTTPException, BaseSSLError +from .util.response import is_fp_closed, is_response_to_head class DeflateDecoder(object): @@ -28,6 +26,9 @@ class DeflateDecoder(object): return getattr(self._obj, name) def decompress(self, data): + if not data: + return data + if not self._first_try: return self._obj.decompress(data) @@ -43,9 +44,23 @@ class DeflateDecoder(object): self._data = None +class GzipDecoder(object): + + def __init__(self): + self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS) + + def __getattr__(self, name): + return getattr(self._obj, name) + + def decompress(self, data): + if not data: + return data + return self._obj.decompress(data) + + def _get_decoder(mode): if mode == 'gzip': - return zlib.decompressobj(16 + zlib.MAX_WBITS) + return GzipDecoder() return DeflateDecoder() @@ -55,7 +70,10 @@ class HTTPResponse(io.IOBase): HTTP Response container. Backwards-compatible to httplib's HTTPResponse but the response ``body`` is - loaded and decoded on-demand when the ``data`` property is accessed. + loaded and decoded on-demand when the ``data`` property is accessed. This + class is also compatible with the Python standard library's :mod:`io` + module, and can hence be treated as a readable object in the context of that + framework. Extra parameters for behaviour not present in httplib.HTTPResponse: @@ -79,7 +97,11 @@ class HTTPResponse(io.IOBase): def __init__(self, body='', headers=None, status=0, version=0, reason=None, strict=0, preload_content=True, decode_content=True, original_response=None, pool=None, connection=None): - self.headers = headers or {} + + if isinstance(headers, HTTPHeaderDict): + self.headers = headers + else: + self.headers = HTTPHeaderDict(headers) self.status = status self.version = version self.reason = reason @@ -87,17 +109,30 @@ class HTTPResponse(io.IOBase): self.decode_content = decode_content self._decoder = None - self._body = body if body and isinstance(body, basestring) else None + self._body = None self._fp = None self._original_response = original_response self._fp_bytes_read = 0 + if body and isinstance(body, (basestring, binary_type)): + self._body = body + self._pool = pool self._connection = connection if hasattr(body, 'read'): self._fp = body + # Are we using the chunked-style of transfer encoding? + self.chunked = False + self.chunk_left = None + tr_enc = self.headers.get('transfer-encoding', '').lower() + # Don't incur the penalty of creating a list and then discarding it + encodings = (enc.strip() for enc in tr_enc.split(",")) + if "chunked" in encodings: + self.chunked = True + + # If requested, preload the body. if preload_content and not self._body: self._body = self.read(decode_content=decode_content) @@ -130,6 +165,10 @@ class HTTPResponse(io.IOBase): if self._fp: return self.read(cache_content=True) + @property + def connection(self): + return self._connection + def tell(self): """ Obtain the number of bytes pulled over the wire so far. May differ from @@ -138,6 +177,102 @@ class HTTPResponse(io.IOBase): """ return self._fp_bytes_read + def _init_decoder(self): + """ + Set-up the _decoder attribute if necessar. + """ + # Note: content-encoding value should be case-insensitive, per RFC 7230 + # Section 3.2 + content_encoding = self.headers.get('content-encoding', '').lower() + if self._decoder is None and content_encoding in self.CONTENT_DECODERS: + self._decoder = _get_decoder(content_encoding) + + def _decode(self, data, decode_content, flush_decoder): + """ + Decode the data passed in and potentially flush the decoder. + """ + try: + if decode_content and self._decoder: + data = self._decoder.decompress(data) + except (IOError, zlib.error) as e: + content_encoding = self.headers.get('content-encoding', '').lower() + raise DecodeError( + "Received response with content-encoding: %s, but " + "failed to decode it." % content_encoding, e) + + if flush_decoder and decode_content: + data += self._flush_decoder() + + return data + + def _flush_decoder(self): + """ + Flushes the decoder. Should only be called if the decoder is actually + being used. + """ + if self._decoder: + buf = self._decoder.decompress(b'') + return buf + self._decoder.flush() + + return b'' + + @contextmanager + def _error_catcher(self): + """ + Catch low-level python exceptions, instead re-raising urllib3 + variants, so that low-level exceptions are not leaked in the + high-level api. + + On exit, release the connection back to the pool. + """ + clean_exit = False + + try: + try: + yield + + except SocketTimeout: + # FIXME: Ideally we'd like to include the url in the ReadTimeoutError but + # there is yet no clean way to get at it from this context. + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except BaseSSLError as e: + # FIXME: Is there a better way to differentiate between SSLErrors? + if 'read operation timed out' not in str(e): # Defensive: + # This shouldn't happen but just in case we're missing an edge + # case, let's avoid swallowing SSL errors. + raise + + raise ReadTimeoutError(self._pool, None, 'Read timed out.') + + except (HTTPException, SocketError) as e: + # This includes IncompleteRead. + raise ProtocolError('Connection broken: %r' % e, e) + + # If no exception is thrown, we should avoid cleaning up + # unnecessarily. + clean_exit = True + finally: + # If we didn't terminate cleanly, we need to throw away our + # connection. + if not clean_exit: + # The response may not be closed but we're not going to use it + # anymore so close it now to ensure that the connection is + # released back to the pool. + if self._original_response: + self._original_response.close() + + # Closing the response may not actually be sufficient to close + # everything, so if we have a hold of the connection close that + # too. + if self._connection: + self._connection.close() + + # If we hold the original response but it's closed now, we should + # return the connection back to the pool. + if self._original_response and self._original_response.isclosed(): + self.release_conn() + def read(self, amt=None, decode_content=None, cache_content=False): """ Similar to :meth:`httplib.HTTPResponse.read`, but with two additional @@ -159,12 +294,7 @@ class HTTPResponse(io.IOBase): after having ``.read()`` the file object. (Overridden if ``amt`` is set.) """ - # Note: content-encoding value should be case-insensitive, per RFC 2616 - # Section 3.5 - content_encoding = self.headers.get('content-encoding', '').lower() - if self._decoder is None: - if content_encoding in self.CONTENT_DECODERS: - self._decoder = _get_decoder(content_encoding) + self._init_decoder() if decode_content is None: decode_content = self.decode_content @@ -172,8 +302,9 @@ class HTTPResponse(io.IOBase): return flush_decoder = False + data = None - try: + with self._error_catcher(): if amt is None: # cStringIO doesn't like amt=None data = self._fp.read() @@ -186,35 +317,21 @@ class HTTPResponse(io.IOBase): # # This is redundant to what httplib/http.client _should_ # already do. However, versions of python released before - # December 15, 2012 (http://bugs.python.org/issue16298) do not - # properly close the connection in all cases. There is no harm - # in redundantly calling close. + # December 15, 2012 (http://bugs.python.org/issue16298) do + # not properly close the connection in all cases. There is + # no harm in redundantly calling close. self._fp.close() flush_decoder = True + if data: self._fp_bytes_read += len(data) - try: - if decode_content and self._decoder: - data = self._decoder.decompress(data) - except (IOError, zlib.error) as e: - raise DecodeError( - "Received response with content-encoding: %s, but " - "failed to decode it." % content_encoding, - e) - - if flush_decoder and decode_content and self._decoder: - buf = self._decoder.decompress(binary_type()) - data += buf + self._decoder.flush() + data = self._decode(data, decode_content, flush_decoder) if cache_content: self._body = data - return data - - finally: - if self._original_response and self._original_response.isclosed(): - self.release_conn() + return data def stream(self, amt=2**16, decode_content=None): """ @@ -232,12 +349,15 @@ class HTTPResponse(io.IOBase): If True, will attempt to decode the body based on the 'content-encoding' header. """ - while not is_fp_closed(self._fp): - data = self.read(amt=amt, decode_content=decode_content) - - if data: - yield data + if self.chunked: + for line in self.read_chunked(amt, decode_content=decode_content): + yield line + else: + while not is_fp_closed(self._fp): + data = self.read(amt=amt, decode_content=decode_content) + if data: + yield data @classmethod def from_httplib(ResponseCls, r, **response_kw): @@ -248,22 +368,17 @@ class HTTPResponse(io.IOBase): Remaining parameters are passed to the HTTPResponse constructor, along with ``original_response=r``. """ + headers = r.msg - # Normalize headers between different versions of Python - headers = {} - for k, v in r.getheaders(): - # Python 3: Header keys are returned capitalised - k = k.lower() - - has_value = headers.get(k) - if has_value: # Python 3: Repeating header keys are unmerged. - v = ', '.join([has_value, v]) - - headers[k] = v + if not isinstance(headers, HTTPHeaderDict): + if PY3: # Python 3 + headers = HTTPHeaderDict(headers.items()) + else: # Python 2 + headers = HTTPHeaderDict.from_httplib(headers) # HTTPResponse objects in Python 3 don't have a .strict attribute strict = getattr(r, 'strict', 0) - return ResponseCls(body=r, + resp = ResponseCls(body=r, headers=headers, status=r.status, version=r.version, @@ -271,6 +386,7 @@ class HTTPResponse(io.IOBase): strict=strict, original_response=r, **response_kw) + return resp # Backwards-compatibility methods for httplib.HTTPResponse def getheaders(self): @@ -284,6 +400,9 @@ class HTTPResponse(io.IOBase): if not self.closed: self._fp.close() + if self._connection: + self._connection.close() + @property def closed(self): if self._fp is None: @@ -301,7 +420,7 @@ class HTTPResponse(io.IOBase): elif hasattr(self._fp, "fileno"): return self._fp.fileno() else: - raise IOError("The file-like object this HTTPResponse is wrapped " + raise IOError("The file-like object this HTTPResponse is wrapped " "around has no file descriptor") def flush(self): @@ -309,4 +428,103 @@ class HTTPResponse(io.IOBase): return self._fp.flush() def readable(self): + # This method is required for `io` module compatibility. return True + + def readinto(self, b): + # This method is required for `io` module compatibility. + temp = self.read(len(b)) + if len(temp) == 0: + return 0 + else: + b[:len(temp)] = temp + return len(temp) + + def _update_chunk_length(self): + # First, we'll figure out length of a chunk and then + # we'll try to read it from socket. + if self.chunk_left is not None: + return + line = self._fp.fp.readline() + line = line.split(b';', 1)[0] + try: + self.chunk_left = int(line, 16) + except ValueError: + # Invalid chunked protocol response, abort. + self.close() + raise httplib.IncompleteRead(line) + + def _handle_chunk(self, amt): + returned_chunk = None + if amt is None: + chunk = self._fp._safe_read(self.chunk_left) + returned_chunk = chunk + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + elif amt < self.chunk_left: + value = self._fp._safe_read(amt) + self.chunk_left = self.chunk_left - amt + returned_chunk = value + elif amt == self.chunk_left: + value = self._fp._safe_read(amt) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + returned_chunk = value + else: # amt > self.chunk_left + returned_chunk = self._fp._safe_read(self.chunk_left) + self._fp._safe_read(2) # Toss the CRLF at the end of the chunk. + self.chunk_left = None + return returned_chunk + + def read_chunked(self, amt=None, decode_content=None): + """ + Similar to :meth:`HTTPResponse.read`, but with an additional + parameter: ``decode_content``. + + :param decode_content: + If True, will attempt to decode the body based on the + 'content-encoding' header. + """ + self._init_decoder() + # FIXME: Rewrite this method and make it a class with a better structured logic. + if not self.chunked: + raise ResponseNotChunked( + "Response is not chunked. " + "Header 'transfer-encoding: chunked' is missing.") + + # Don't bother reading the body of a HEAD request. + if self._original_response and is_response_to_head(self._original_response): + self._original_response.close() + return + + with self._error_catcher(): + while True: + self._update_chunk_length() + if self.chunk_left == 0: + break + chunk = self._handle_chunk(amt) + decoded = self._decode(chunk, decode_content=decode_content, + flush_decoder=False) + if decoded: + yield decoded + + if decode_content: + # On CPython and PyPy, we should never need to flush the + # decoder. However, on Jython we *might* need to, so + # lets defensively do it anyway. + decoded = self._flush_decoder() + if decoded: # Platform-specific: Jython. + yield decoded + + # Chunk content ends with \r\n: discard it. + while True: + line = self._fp.fp.readline() + if not line: + # Some sites may not end with '\r\n'. + break + if line == b'\r\n': + break + + # We read everything; close the "file". + if self._original_response: + self._original_response.close() diff --git a/vendor/requests/packages/urllib3/util.py b/vendor/requests/packages/urllib3/util.py deleted file mode 100644 index 46a0c48d..00000000 --- a/vendor/requests/packages/urllib3/util.py +++ /dev/null @@ -1,643 +0,0 @@ -# urllib3/util.py -# Copyright 2008-2013 Andrey Petrov and contributors (see CONTRIBUTORS.txt) -# -# This module is part of urllib3 and is released under -# the MIT License: http://www.opensource.org/licenses/mit-license.php - - -from base64 import b64encode -from binascii import hexlify, unhexlify -from collections import namedtuple -from hashlib import md5, sha1 -from socket import error as SocketError, _GLOBAL_DEFAULT_TIMEOUT -import time - -try: - from select import poll, POLLIN -except ImportError: # `poll` doesn't exist on OSX and other platforms - poll = False - try: - from select import select - except ImportError: # `select` doesn't exist on AppEngine. - select = False - -try: # Test for SSL features - SSLContext = None - HAS_SNI = False - - import ssl - from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 - from ssl import SSLContext # Modern SSL? - from ssl import HAS_SNI # Has SNI? -except ImportError: - pass - -from .packages import six -from .exceptions import LocationParseError, SSLError, TimeoutStateError - - -_Default = object() -# The default timeout to use for socket connections. This is the attribute used -# by httplib to define the default timeout - - -def current_time(): - """ - Retrieve the current time, this function is mocked out in unit testing. - """ - return time.time() - - -class Timeout(object): - """ - Utility object for storing timeout values. - - Example usage: - - .. code-block:: python - - timeout = urllib3.util.Timeout(connect=2.0, read=7.0) - pool = HTTPConnectionPool('www.google.com', 80, timeout=timeout) - pool.request(...) # Etc, etc - - :param connect: - The maximum amount of time to wait for a connection attempt to a server - to succeed. Omitting the parameter will default the connect timeout to - the system default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout for connection attempts. - - :type connect: integer, float, or None - - :param read: - The maximum amount of time to wait between consecutive - read operations for a response from the server. Omitting - the parameter will default the read timeout to the system - default, probably `the global default timeout in socket.py - `_. - None will set an infinite timeout. - - :type read: integer, float, or None - - :param total: - This combines the connect and read timeouts into one; the read timeout - will be set to the time leftover from the connect attempt. In the - event that both a connect timeout and a total are specified, or a read - timeout and a total are specified, the shorter timeout will be applied. - - Defaults to None. - - :type total: integer, float, or None - - .. note:: - - Many factors can affect the total amount of time for urllib3 to return - an HTTP response. Specifically, Python's DNS resolver does not obey the - timeout specified on the socket. Other factors that can affect total - request time include high CPU load, high swap, the program running at a - low priority level, or other behaviors. The observed running time for - urllib3 to return a response may be greater than the value passed to - `total`. - - In addition, the read and total timeouts only measure the time between - read operations on the socket connecting the client and the server, - not the total amount of time for the request to return a complete - response. For most requests, the timeout is raised because the server - has not sent the first byte in the specified time. This is not always - the case; if a server streams one byte every fifteen seconds, a timeout - of 20 seconds will not ever trigger, even though the request will - take several minutes to complete. - - If your goal is to cut off any request after a set amount of wall clock - time, consider having a second "watcher" thread to cut off a slow - request. - """ - - #: A sentinel object representing the default timeout value - DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT - - def __init__(self, total=None, connect=_Default, read=_Default): - self._connect = self._validate_timeout(connect, 'connect') - self._read = self._validate_timeout(read, 'read') - self.total = self._validate_timeout(total, 'total') - self._start_connect = None - - def __str__(self): - return '%s(connect=%r, read=%r, total=%r)' % ( - type(self).__name__, self._connect, self._read, self.total) - - - @classmethod - def _validate_timeout(cls, value, name): - """ Check that a timeout attribute is valid - - :param value: The timeout value to validate - :param name: The name of the timeout attribute to validate. This is used - for clear error messages - :return: the value - :raises ValueError: if the type is not an integer or a float, or if it - is a numeric value less than zero - """ - if value is _Default: - return cls.DEFAULT_TIMEOUT - - if value is None or value is cls.DEFAULT_TIMEOUT: - return value - - try: - float(value) - except (TypeError, ValueError): - raise ValueError("Timeout value %s was %s, but it must be an " - "int or float." % (name, value)) - - try: - if value < 0: - raise ValueError("Attempted to set %s timeout to %s, but the " - "timeout cannot be set to a value less " - "than 0." % (name, value)) - except TypeError: # Python 3 - raise ValueError("Timeout value %s was %s, but it must be an " - "int or float." % (name, value)) - - return value - - @classmethod - def from_float(cls, timeout): - """ Create a new Timeout from a legacy timeout value. - - The timeout value used by httplib.py sets the same timeout on the - connect(), and recv() socket requests. This creates a :class:`Timeout` - object that sets the individual timeouts to the ``timeout`` value passed - to this function. - - :param timeout: The legacy timeout value - :type timeout: integer, float, sentinel default object, or None - :return: a Timeout object - :rtype: :class:`Timeout` - """ - return Timeout(read=timeout, connect=timeout) - - def clone(self): - """ Create a copy of the timeout object - - Timeout properties are stored per-pool but each request needs a fresh - Timeout object to ensure each one has its own start/stop configured. - - :return: a copy of the timeout object - :rtype: :class:`Timeout` - """ - # We can't use copy.deepcopy because that will also create a new object - # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to - # detect the user default. - return Timeout(connect=self._connect, read=self._read, - total=self.total) - - def start_connect(self): - """ Start the timeout clock, used during a connect() attempt - - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to start a timer that has been started already. - """ - if self._start_connect is not None: - raise TimeoutStateError("Timeout timer has already been started.") - self._start_connect = current_time() - return self._start_connect - - def get_connect_duration(self): - """ Gets the time elapsed since the call to :meth:`start_connect`. - - :return: the elapsed time - :rtype: float - :raises urllib3.exceptions.TimeoutStateError: if you attempt - to get duration for a timer that hasn't been started. - """ - if self._start_connect is None: - raise TimeoutStateError("Can't get connect duration for timer " - "that has not started.") - return current_time() - self._start_connect - - @property - def connect_timeout(self): - """ Get the value to use when setting a connection timeout. - - This will be a positive float or integer, the value None - (never timeout), or the default system timeout. - - :return: the connect timeout - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - """ - if self.total is None: - return self._connect - - if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: - return self.total - - return min(self._connect, self.total) - - @property - def read_timeout(self): - """ Get the value for the read timeout. - - This assumes some time has elapsed in the connection timeout and - computes the read timeout appropriately. - - If self.total is set, the read timeout is dependent on the amount of - time taken by the connect timeout. If the connection time has not been - established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be - raised. - - :return: the value to use for the read timeout - :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None - :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` - has not yet been called on this object. - """ - if (self.total is not None and - self.total is not self.DEFAULT_TIMEOUT and - self._read is not None and - self._read is not self.DEFAULT_TIMEOUT): - # in case the connect timeout has not yet been established. - if self._start_connect is None: - return self._read - return max(0, min(self.total - self.get_connect_duration(), - self._read)) - elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: - return max(0, self.total - self.get_connect_duration()) - else: - return self._read - - -class Url(namedtuple('Url', ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'])): - """ - Datastructure for representing an HTTP URL. Used as a return value for - :func:`parse_url`. - """ - slots = () - - def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, query=None, fragment=None): - return super(Url, cls).__new__(cls, scheme, auth, host, port, path, query, fragment) - - @property - def hostname(self): - """For backwards-compatibility with urlparse. We're nice like that.""" - return self.host - - @property - def request_uri(self): - """Absolute path including the query string.""" - uri = self.path or '/' - - if self.query is not None: - uri += '?' + self.query - - return uri - - @property - def netloc(self): - """Network location including host and port""" - if self.port: - return '%s:%d' % (self.host, self.port) - return self.host - - -def split_first(s, delims): - """ - Given a string and an iterable of delimiters, split on the first found - delimiter. Return two split parts and the matched delimiter. - - If not found, then the first part is the full input string. - - Example: :: - - >>> split_first('foo/bar?baz', '?/=') - ('foo', 'bar?baz', '/') - >>> split_first('foo/bar?baz', '123') - ('foo/bar?baz', '', None) - - Scales linearly with number of delims. Not ideal for large number of delims. - """ - min_idx = None - min_delim = None - for d in delims: - idx = s.find(d) - if idx < 0: - continue - - if min_idx is None or idx < min_idx: - min_idx = idx - min_delim = d - - if min_idx is None or min_idx < 0: - return s, '', None - - return s[:min_idx], s[min_idx+1:], min_delim - - -def parse_url(url): - """ - Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is - performed to parse incomplete urls. Fields not provided will be None. - - Partly backwards-compatible with :mod:`urlparse`. - - Example: :: - - >>> parse_url('http://google.com/mail/') - Url(scheme='http', host='google.com', port=None, path='/', ...) - >>> parse_url('google.com:80') - Url(scheme=None, host='google.com', port=80, path=None, ...) - >>> parse_url('/foo?bar') - Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) - """ - - # While this code has overlap with stdlib's urlparse, it is much - # simplified for our needs and less annoying. - # Additionally, this implementations does silly things to be optimal - # on CPython. - - scheme = None - auth = None - host = None - port = None - path = None - fragment = None - query = None - - # Scheme - if '://' in url: - scheme, url = url.split('://', 1) - - # Find the earliest Authority Terminator - # (http://tools.ietf.org/html/rfc3986#section-3.2) - url, path_, delim = split_first(url, ['/', '?', '#']) - - if delim: - # Reassemble the path - path = delim + path_ - - # Auth - if '@' in url: - # Last '@' denotes end of auth part - auth, url = url.rsplit('@', 1) - - # IPv6 - if url and url[0] == '[': - host, url = url.split(']', 1) - host += ']' - - # Port - if ':' in url: - _host, port = url.split(':', 1) - - if not host: - host = _host - - if port: - # If given, ports must be integers. - if not port.isdigit(): - raise LocationParseError("Failed to parse: %s" % url) - port = int(port) - else: - # Blank ports are cool, too. (rfc3986#section-3.2.3) - port = None - - elif not host and url: - host = url - - if not path: - return Url(scheme, auth, host, port, path, query, fragment) - - # Fragment - if '#' in path: - path, fragment = path.split('#', 1) - - # Query - if '?' in path: - path, query = path.split('?', 1) - - return Url(scheme, auth, host, port, path, query, fragment) - - -def get_host(url): - """ - Deprecated. Use :func:`.parse_url` instead. - """ - p = parse_url(url) - return p.scheme or 'http', p.hostname, p.port - - -def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, - basic_auth=None, proxy_basic_auth=None): - """ - Shortcuts for generating request headers. - - :param keep_alive: - If ``True``, adds 'connection: keep-alive' header. - - :param accept_encoding: - Can be a boolean, list, or string. - ``True`` translates to 'gzip,deflate'. - List will get joined by comma. - String will be used as provided. - - :param user_agent: - String representing the user-agent you want, such as - "python-urllib3/0.6" - - :param basic_auth: - Colon-separated username:password string for 'authorization: basic ...' - auth header. - - :param proxy_basic_auth: - Colon-separated username:password string for 'proxy-authorization: basic ...' - auth header. - - Example: :: - - >>> make_headers(keep_alive=True, user_agent="Batman/1.0") - {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} - >>> make_headers(accept_encoding=True) - {'accept-encoding': 'gzip,deflate'} - """ - headers = {} - if accept_encoding: - if isinstance(accept_encoding, str): - pass - elif isinstance(accept_encoding, list): - accept_encoding = ','.join(accept_encoding) - else: - accept_encoding = 'gzip,deflate' - headers['accept-encoding'] = accept_encoding - - if user_agent: - headers['user-agent'] = user_agent - - if keep_alive: - headers['connection'] = 'keep-alive' - - if basic_auth: - headers['authorization'] = 'Basic ' + \ - b64encode(six.b(basic_auth)).decode('utf-8') - - if proxy_basic_auth: - headers['proxy-authorization'] = 'Basic ' + \ - b64encode(six.b(proxy_basic_auth)).decode('utf-8') - - return headers - - -def is_connection_dropped(conn): # Platform-specific - """ - Returns True if the connection is dropped and should be closed. - - :param conn: - :class:`httplib.HTTPConnection` object. - - Note: For platforms like AppEngine, this will always return ``False`` to - let the platform handle connection recycling transparently for us. - """ - sock = getattr(conn, 'sock', False) - if not sock: # Platform-specific: AppEngine - return False - - if not poll: - if not select: # Platform-specific: AppEngine - return False - - try: - return select([sock], [], [], 0.0)[0] - except SocketError: - return True - - # This version is better on platforms that support it. - p = poll() - p.register(sock, POLLIN) - for (fno, ev) in p.poll(0.0): - if fno == sock.fileno(): - # Either data is buffered (bad), or the connection is dropped. - return True - - -def resolve_cert_reqs(candidate): - """ - Resolves the argument to a numeric constant, which can be passed to - the wrap_socket function/method from the ssl module. - Defaults to :data:`ssl.CERT_NONE`. - If given a string it is assumed to be the name of the constant in the - :mod:`ssl` module or its abbrevation. - (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. - If it's neither `None` nor a string we assume it is already the numeric - constant which can directly be passed to wrap_socket. - """ - if candidate is None: - return CERT_NONE - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'CERT_' + candidate) - return res - - return candidate - - -def resolve_ssl_version(candidate): - """ - like resolve_cert_reqs - """ - if candidate is None: - return PROTOCOL_SSLv23 - - if isinstance(candidate, str): - res = getattr(ssl, candidate, None) - if res is None: - res = getattr(ssl, 'PROTOCOL_' + candidate) - return res - - return candidate - - -def assert_fingerprint(cert, fingerprint): - """ - Checks if given fingerprint matches the supplied certificate. - - :param cert: - Certificate as bytes object. - :param fingerprint: - Fingerprint as string of hexdigits, can be interspersed by colons. - """ - - # Maps the length of a digest to a possible hash function producing - # this digest. - hashfunc_map = { - 16: md5, - 20: sha1 - } - - fingerprint = fingerprint.replace(':', '').lower() - - digest_length, rest = divmod(len(fingerprint), 2) - - if rest or digest_length not in hashfunc_map: - raise SSLError('Fingerprint is of invalid length.') - - # We need encode() here for py32; works on py2 and p33. - fingerprint_bytes = unhexlify(fingerprint.encode()) - - hashfunc = hashfunc_map[digest_length] - - cert_digest = hashfunc(cert).digest() - - if not cert_digest == fingerprint_bytes: - raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' - .format(hexlify(fingerprint_bytes), - hexlify(cert_digest))) - -def is_fp_closed(obj): - """ - Checks whether a given file-like object is closed. - - :param obj: - The file-like object to check. - """ - if hasattr(obj, 'fp'): - # Object is a container for another file-like object that gets released - # on exhaustion (e.g. HTTPResponse) - return obj.fp is None - - return obj.closed - - -if SSLContext is not None: # Python 3.2+ - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - """ - All arguments except `server_hostname` have the same meaning as for - :func:`ssl.wrap_socket` - - :param server_hostname: - Hostname of the expected certificate - """ - context = SSLContext(ssl_version) - context.verify_mode = cert_reqs - if ca_certs: - try: - context.load_verify_locations(ca_certs) - # Py32 raises IOError - # Py33 raises FileNotFoundError - except Exception as e: # Reraise as SSLError - raise SSLError(e) - if certfile: - # FIXME: This block needs a test. - context.load_cert_chain(certfile, keyfile) - if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI - return context.wrap_socket(sock, server_hostname=server_hostname) - return context.wrap_socket(sock) - -else: # Python 3.1 and earlier - def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, - ca_certs=None, server_hostname=None, - ssl_version=None): - return wrap_socket(sock, keyfile=keyfile, certfile=certfile, - ca_certs=ca_certs, cert_reqs=cert_reqs, - ssl_version=ssl_version) diff --git a/vendor/requests/packages/urllib3/util/__init__.py b/vendor/requests/packages/urllib3/util/__init__.py new file mode 100644 index 00000000..4778cf99 --- /dev/null +++ b/vendor/requests/packages/urllib3/util/__init__.py @@ -0,0 +1,46 @@ +from __future__ import absolute_import +# For backwards compatibility, provide imports that used to be here. +from .connection import is_connection_dropped +from .request import make_headers +from .response import is_fp_closed +from .ssl_ import ( + SSLContext, + HAS_SNI, + IS_PYOPENSSL, + assert_fingerprint, + resolve_cert_reqs, + resolve_ssl_version, + ssl_wrap_socket, +) +from .timeout import ( + current_time, + Timeout, +) + +from .retry import Retry +from .url import ( + get_host, + parse_url, + split_first, + Url, +) + +__all__ = ( + 'HAS_SNI', + 'IS_PYOPENSSL', + 'SSLContext', + 'Retry', + 'Timeout', + 'Url', + 'assert_fingerprint', + 'current_time', + 'is_connection_dropped', + 'is_fp_closed', + 'get_host', + 'parse_url', + 'make_headers', + 'resolve_cert_reqs', + 'resolve_ssl_version', + 'split_first', + 'ssl_wrap_socket', +) diff --git a/vendor/requests/packages/urllib3/util/connection.py b/vendor/requests/packages/urllib3/util/connection.py new file mode 100644 index 00000000..5e761352 --- /dev/null +++ b/vendor/requests/packages/urllib3/util/connection.py @@ -0,0 +1,144 @@ +from __future__ import absolute_import +import socket +try: + from select import poll, POLLIN +except ImportError: # `poll` doesn't exist on OSX and other platforms + poll = False + try: + from select import select + except ImportError: # `select` doesn't exist on AppEngine. + select = False + + +def is_connection_dropped(conn): # Platform-specific + """ + Returns True if the connection is dropped and should be closed. + + :param conn: + :class:`httplib.HTTPConnection` object. + + Note: For platforms like AppEngine, this will always return ``False`` to + let the platform handle connection recycling transparently for us. + """ + sock = getattr(conn, 'sock', False) + if sock is False: # Platform-specific: AppEngine + return False + if sock is None: # Connection already closed (such as by httplib). + return True + + if not poll: + if not select: # Platform-specific: AppEngine + return False + + try: + return select([sock], [], [], 0.0)[0] + except socket.error: + return True + + # This version is better on platforms that support it. + p = poll() + p.register(sock, POLLIN) + for (fno, ev) in p.poll(0.0): + if fno == sock.fileno(): + # Either data is buffered (bad), or the connection is dropped. + return True + + +# This function is copied from socket.py in the Python 2.7 standard +# library test suite. Added to its signature is only `socket_options`. +# One additional modification is that we avoid binding to IPv6 servers +# discovered in DNS if the system doesn't have IPv6 functionality. +def create_connection(address, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, + source_address=None, socket_options=None): + """Connect to *address* and return the socket object. + + Convenience function. Connect to *address* (a 2-tuple ``(host, + port)``) and return the socket object. Passing the optional + *timeout* parameter will set the timeout on the socket instance + before attempting to connect. If no *timeout* is supplied, the + global default timeout setting returned by :func:`getdefaulttimeout` + is used. If *source_address* is set it must be a tuple of (host, port) + for the socket to bind as a source address before making the connection. + An host of '' or port 0 tells the OS to use the default. + """ + + host, port = address + if host.startswith('['): + host = host.strip('[]') + err = None + + # Using the value from allowed_gai_family() in the context of getaddrinfo lets + # us select whether to work with IPv4 DNS records, IPv6 records, or both. + # The original create_connection function always returns all records. + family = allowed_gai_family() + + for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM): + af, socktype, proto, canonname, sa = res + sock = None + try: + sock = socket.socket(af, socktype, proto) + + # If provided, set socket level options before connecting. + _set_socket_options(sock, socket_options) + + if timeout is not socket._GLOBAL_DEFAULT_TIMEOUT: + sock.settimeout(timeout) + if source_address: + sock.bind(source_address) + sock.connect(sa) + return sock + + except socket.error as e: + err = e + if sock is not None: + sock.close() + sock = None + + if err is not None: + raise err + + raise socket.error("getaddrinfo returns an empty list") + + +def _set_socket_options(sock, options): + if options is None: + return + + for opt in options: + sock.setsockopt(*opt) + + +def allowed_gai_family(): + """This function is designed to work in the context of + getaddrinfo, where family=socket.AF_UNSPEC is the default and + will perform a DNS search for both IPv6 and IPv4 records.""" + + family = socket.AF_INET + if HAS_IPV6: + family = socket.AF_UNSPEC + return family + + +def _has_ipv6(host): + """ Returns True if the system can bind an IPv6 address. """ + sock = None + has_ipv6 = False + + if socket.has_ipv6: + # has_ipv6 returns true if cPython was compiled with IPv6 support. + # It does not tell us if the system has IPv6 support enabled. To + # determine that we must bind to an IPv6 address. + # https://github.com/shazow/urllib3/pull/611 + # https://bugs.python.org/issue658327 + try: + sock = socket.socket(socket.AF_INET6) + sock.bind((host, 0)) + has_ipv6 = True + except Exception: + pass + + if sock: + sock.close() + return has_ipv6 + +HAS_IPV6 = _has_ipv6('::1') diff --git a/vendor/requests/packages/urllib3/util/request.py b/vendor/requests/packages/urllib3/util/request.py new file mode 100644 index 00000000..73779315 --- /dev/null +++ b/vendor/requests/packages/urllib3/util/request.py @@ -0,0 +1,72 @@ +from __future__ import absolute_import +from base64 import b64encode + +from ..packages.six import b + +ACCEPT_ENCODING = 'gzip,deflate' + + +def make_headers(keep_alive=None, accept_encoding=None, user_agent=None, + basic_auth=None, proxy_basic_auth=None, disable_cache=None): + """ + Shortcuts for generating request headers. + + :param keep_alive: + If ``True``, adds 'connection: keep-alive' header. + + :param accept_encoding: + Can be a boolean, list, or string. + ``True`` translates to 'gzip,deflate'. + List will get joined by comma. + String will be used as provided. + + :param user_agent: + String representing the user-agent you want, such as + "python-urllib3/0.6" + + :param basic_auth: + Colon-separated username:password string for 'authorization: basic ...' + auth header. + + :param proxy_basic_auth: + Colon-separated username:password string for 'proxy-authorization: basic ...' + auth header. + + :param disable_cache: + If ``True``, adds 'cache-control: no-cache' header. + + Example:: + + >>> make_headers(keep_alive=True, user_agent="Batman/1.0") + {'connection': 'keep-alive', 'user-agent': 'Batman/1.0'} + >>> make_headers(accept_encoding=True) + {'accept-encoding': 'gzip,deflate'} + """ + headers = {} + if accept_encoding: + if isinstance(accept_encoding, str): + pass + elif isinstance(accept_encoding, list): + accept_encoding = ','.join(accept_encoding) + else: + accept_encoding = ACCEPT_ENCODING + headers['accept-encoding'] = accept_encoding + + if user_agent: + headers['user-agent'] = user_agent + + if keep_alive: + headers['connection'] = 'keep-alive' + + if basic_auth: + headers['authorization'] = 'Basic ' + \ + b64encode(b(basic_auth)).decode('utf-8') + + if proxy_basic_auth: + headers['proxy-authorization'] = 'Basic ' + \ + b64encode(b(proxy_basic_auth)).decode('utf-8') + + if disable_cache: + headers['cache-control'] = 'no-cache' + + return headers diff --git a/vendor/requests/packages/urllib3/util/response.py b/vendor/requests/packages/urllib3/util/response.py new file mode 100644 index 00000000..0b5c75c1 --- /dev/null +++ b/vendor/requests/packages/urllib3/util/response.py @@ -0,0 +1,74 @@ +from __future__ import absolute_import +from ..packages.six.moves import http_client as httplib + +from ..exceptions import HeaderParsingError + + +def is_fp_closed(obj): + """ + Checks whether a given file-like object is closed. + + :param obj: + The file-like object to check. + """ + + try: + # Check via the official file-like-object way. + return obj.closed + except AttributeError: + pass + + try: + # Check if the object is a container for another file-like object that + # gets released on exhaustion (e.g. HTTPResponse). + return obj.fp is None + except AttributeError: + pass + + raise ValueError("Unable to determine whether fp is closed.") + + +def assert_header_parsing(headers): + """ + Asserts whether all headers have been successfully parsed. + Extracts encountered errors from the result of parsing headers. + + Only works on Python 3. + + :param headers: Headers to verify. + :type headers: `httplib.HTTPMessage`. + + :raises urllib3.exceptions.HeaderParsingError: + If parsing errors are found. + """ + + # This will fail silently if we pass in the wrong kind of parameter. + # To make debugging easier add an explicit check. + if not isinstance(headers, httplib.HTTPMessage): + raise TypeError('expected httplib.Message, got {0}.'.format( + type(headers))) + + defects = getattr(headers, 'defects', None) + get_payload = getattr(headers, 'get_payload', None) + + unparsed_data = None + if get_payload: # Platform-specific: Python 3. + unparsed_data = get_payload() + + if defects or unparsed_data: + raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data) + + +def is_response_to_head(response): + """ + Checks whether the request of a response has been a HEAD-request. + Handles the quirks of AppEngine. + + :param conn: + :type conn: :class:`httplib.HTTPResponse` + """ + # FIXME: Can we do this somehow without accessing private httplib _method? + method = response._method + if isinstance(method, int): # Platform-specific: Appengine + return method == 3 + return method.upper() == 'HEAD' diff --git a/vendor/requests/packages/urllib3/util/retry.py b/vendor/requests/packages/urllib3/util/retry.py new file mode 100644 index 00000000..d379833c --- /dev/null +++ b/vendor/requests/packages/urllib3/util/retry.py @@ -0,0 +1,300 @@ +from __future__ import absolute_import +import time +import logging + +from ..exceptions import ( + ConnectTimeoutError, + MaxRetryError, + ProtocolError, + ReadTimeoutError, + ResponseError, +) +from ..packages import six + + +log = logging.getLogger(__name__) + + +class Retry(object): + """ Retry configuration. + + Each retry attempt will create a new Retry object with updated values, so + they can be safely reused. + + Retries can be defined as a default for a pool:: + + retries = Retry(connect=5, read=2, redirect=5) + http = PoolManager(retries=retries) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', retries=Retry(10)) + + Retries can be disabled by passing ``False``:: + + response = http.request('GET', 'http://example.com/', retries=False) + + Errors will be wrapped in :class:`~urllib3.exceptions.MaxRetryError` unless + retries are disabled, in which case the causing exception will be raised. + + :param int total: + Total number of retries to allow. Takes precedence over other counts. + + Set to ``None`` to remove this constraint and fall back on other + counts. It's a good idea to set this to some sensibly-high value to + account for unexpected edge cases and avoid infinite retry loops. + + Set to ``0`` to fail on the first retry. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param int connect: + How many connection-related errors to retry on. + + These are errors raised before the request is sent to the remote server, + which we assume has not triggered the server to process the request. + + Set to ``0`` to fail on the first retry of this type. + + :param int read: + How many times to retry on read errors. + + These errors are raised after the request was sent to the server, so the + request may have side-effects. + + Set to ``0`` to fail on the first retry of this type. + + :param int redirect: + How many redirects to perform. Limit this to avoid infinite redirect + loops. + + A redirect is a HTTP response with a status code 301, 302, 303, 307 or + 308. + + Set to ``0`` to fail on the first retry of this type. + + Set to ``False`` to disable and imply ``raise_on_redirect=False``. + + :param iterable method_whitelist: + Set of uppercased HTTP method verbs that we should retry on. + + By default, we only retry on methods which are considered to be + idempotent (multiple requests with the same parameters end with the + same state). See :attr:`Retry.DEFAULT_METHOD_WHITELIST`. + + Set to a ``False`` value to retry on any verb. + + :param iterable status_forcelist: + A set of integer HTTP status codes that we should force a retry on. + A retry is initiated if the request method is in ``method_whitelist`` + and the response status code is in ``status_forcelist``. + + By default, this is disabled with ``None``. + + :param float backoff_factor: + A backoff factor to apply between attempts after the second try + (most errors are resolved immediately by a second try without a + delay). urllib3 will sleep for:: + + {backoff factor} * (2 ^ ({number of total retries} - 1)) + + seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep + for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer + than :attr:`Retry.BACKOFF_MAX`. + + By default, backoff is disabled (set to 0). + + :param bool raise_on_redirect: Whether, if the number of redirects is + exhausted, to raise a MaxRetryError, or to return a response with a + response code in the 3xx range. + + :param bool raise_on_status: Similar meaning to ``raise_on_redirect``: + whether we should raise an exception, or return a response, + if status falls in ``status_forcelist`` range and retries have + been exhausted. + """ + + DEFAULT_METHOD_WHITELIST = frozenset([ + 'HEAD', 'GET', 'PUT', 'DELETE', 'OPTIONS', 'TRACE']) + + #: Maximum backoff time. + BACKOFF_MAX = 120 + + def __init__(self, total=10, connect=None, read=None, redirect=None, + method_whitelist=DEFAULT_METHOD_WHITELIST, status_forcelist=None, + backoff_factor=0, raise_on_redirect=True, raise_on_status=True, + _observed_errors=0): + + self.total = total + self.connect = connect + self.read = read + + if redirect is False or total is False: + redirect = 0 + raise_on_redirect = False + + self.redirect = redirect + self.status_forcelist = status_forcelist or set() + self.method_whitelist = method_whitelist + self.backoff_factor = backoff_factor + self.raise_on_redirect = raise_on_redirect + self.raise_on_status = raise_on_status + self._observed_errors = _observed_errors # TODO: use .history instead? + + def new(self, **kw): + params = dict( + total=self.total, + connect=self.connect, read=self.read, redirect=self.redirect, + method_whitelist=self.method_whitelist, + status_forcelist=self.status_forcelist, + backoff_factor=self.backoff_factor, + raise_on_redirect=self.raise_on_redirect, + raise_on_status=self.raise_on_status, + _observed_errors=self._observed_errors, + ) + params.update(kw) + return type(self)(**params) + + @classmethod + def from_int(cls, retries, redirect=True, default=None): + """ Backwards-compatibility for the old retries format.""" + if retries is None: + retries = default if default is not None else cls.DEFAULT + + if isinstance(retries, Retry): + return retries + + redirect = bool(redirect) and None + new_retries = cls(retries, redirect=redirect) + log.debug("Converted retries value: %r -> %r", retries, new_retries) + return new_retries + + def get_backoff_time(self): + """ Formula for computing the current backoff + + :rtype: float + """ + if self._observed_errors <= 1: + return 0 + + backoff_value = self.backoff_factor * (2 ** (self._observed_errors - 1)) + return min(self.BACKOFF_MAX, backoff_value) + + def sleep(self): + """ Sleep between retry attempts using an exponential backoff. + + By default, the backoff factor is 0 and this method will return + immediately. + """ + backoff = self.get_backoff_time() + if backoff <= 0: + return + time.sleep(backoff) + + def _is_connection_error(self, err): + """ Errors when we're fairly sure that the server did not receive the + request, so it should be safe to retry. + """ + return isinstance(err, ConnectTimeoutError) + + def _is_read_error(self, err): + """ Errors that occur after the request has been started, so we should + assume that the server began processing it. + """ + return isinstance(err, (ReadTimeoutError, ProtocolError)) + + def is_forced_retry(self, method, status_code): + """ Is this method/status code retryable? (Based on method/codes whitelists) + """ + if self.method_whitelist and method.upper() not in self.method_whitelist: + return False + + return self.status_forcelist and status_code in self.status_forcelist + + def is_exhausted(self): + """ Are we out of retries? """ + retry_counts = (self.total, self.connect, self.read, self.redirect) + retry_counts = list(filter(None, retry_counts)) + if not retry_counts: + return False + + return min(retry_counts) < 0 + + def increment(self, method=None, url=None, response=None, error=None, + _pool=None, _stacktrace=None): + """ Return a new Retry object with incremented retry counters. + + :param response: A response object, or None, if the server did not + return a response. + :type response: :class:`~urllib3.response.HTTPResponse` + :param Exception error: An error encountered during the request, or + None if the response was received successfully. + + :return: A new ``Retry`` object. + """ + if self.total is False and error: + # Disabled, indicate to re-raise the error. + raise six.reraise(type(error), error, _stacktrace) + + total = self.total + if total is not None: + total -= 1 + + _observed_errors = self._observed_errors + connect = self.connect + read = self.read + redirect = self.redirect + cause = 'unknown' + + if error and self._is_connection_error(error): + # Connect retry? + if connect is False: + raise six.reraise(type(error), error, _stacktrace) + elif connect is not None: + connect -= 1 + _observed_errors += 1 + + elif error and self._is_read_error(error): + # Read retry? + if read is False: + raise six.reraise(type(error), error, _stacktrace) + elif read is not None: + read -= 1 + _observed_errors += 1 + + elif response and response.get_redirect_location(): + # Redirect retry? + if redirect is not None: + redirect -= 1 + cause = 'too many redirects' + + else: + # Incrementing because of a server error like a 500 in + # status_forcelist and a the given method is in the whitelist + _observed_errors += 1 + cause = ResponseError.GENERIC_ERROR + if response and response.status: + cause = ResponseError.SPECIFIC_ERROR.format( + status_code=response.status) + + new_retry = self.new( + total=total, + connect=connect, read=read, redirect=redirect, + _observed_errors=_observed_errors) + + if new_retry.is_exhausted(): + raise MaxRetryError(_pool, url, error or ResponseError(cause)) + + log.debug("Incremented Retry for (url='%s'): %r", url, new_retry) + + return new_retry + + def __repr__(self): + return ('{cls.__name__}(total={self.total}, connect={self.connect}, ' + 'read={self.read}, redirect={self.redirect})').format( + cls=type(self), self=self) + + +# For backwards compatibility (equivalent to pre-v1.9): +Retry.DEFAULT = Retry(3) diff --git a/vendor/requests/packages/urllib3/util/ssl_.py b/vendor/requests/packages/urllib3/util/ssl_.py new file mode 100644 index 00000000..4a64d7ef --- /dev/null +++ b/vendor/requests/packages/urllib3/util/ssl_.py @@ -0,0 +1,320 @@ +from __future__ import absolute_import +import errno +import warnings +import hmac + +from binascii import hexlify, unhexlify +from hashlib import md5, sha1, sha256 + +from ..exceptions import SSLError, InsecurePlatformWarning, SNIMissingWarning + + +SSLContext = None +HAS_SNI = False +create_default_context = None +IS_PYOPENSSL = False + +# Maps the length of a digest to a possible hash function producing this digest +HASHFUNC_MAP = { + 32: md5, + 40: sha1, + 64: sha256, +} + + +def _const_compare_digest_backport(a, b): + """ + Compare two digests of equal length in constant time. + + The digests must be of type str/bytes. + Returns True if the digests match, and False otherwise. + """ + result = abs(len(a) - len(b)) + for l, r in zip(bytearray(a), bytearray(b)): + result |= l ^ r + return result == 0 + + +_const_compare_digest = getattr(hmac, 'compare_digest', + _const_compare_digest_backport) + + +try: # Test for SSL features + import ssl + from ssl import wrap_socket, CERT_NONE, PROTOCOL_SSLv23 + from ssl import HAS_SNI # Has SNI? +except ImportError: + pass + + +try: + from ssl import OP_NO_SSLv2, OP_NO_SSLv3, OP_NO_COMPRESSION +except ImportError: + OP_NO_SSLv2, OP_NO_SSLv3 = 0x1000000, 0x2000000 + OP_NO_COMPRESSION = 0x20000 + +# A secure default. +# Sources for more information on TLS ciphers: +# +# - https://wiki.mozilla.org/Security/Server_Side_TLS +# - https://www.ssllabs.com/projects/best-practices/index.html +# - https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/ +# +# The general intent is: +# - Prefer cipher suites that offer perfect forward secrecy (DHE/ECDHE), +# - prefer ECDHE over DHE for better performance, +# - prefer any AES-GCM over any AES-CBC for better performance and security, +# - use 3DES as fallback which is secure but slow, +# - disable NULL authentication, MD5 MACs and DSS for security reasons. +DEFAULT_CIPHERS = ( + 'ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+HIGH:' + 'DH+HIGH:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+HIGH:RSA+3DES:!aNULL:' + '!eNULL:!MD5' +) + +try: + from ssl import SSLContext # Modern SSL? +except ImportError: + import sys + + class SSLContext(object): # Platform-specific: Python 2 & 3.1 + supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or + (3, 2) <= sys.version_info) + + def __init__(self, protocol_version): + self.protocol = protocol_version + # Use default values from a real SSLContext + self.check_hostname = False + self.verify_mode = ssl.CERT_NONE + self.ca_certs = None + self.options = 0 + self.certfile = None + self.keyfile = None + self.ciphers = None + + def load_cert_chain(self, certfile, keyfile): + self.certfile = certfile + self.keyfile = keyfile + + def load_verify_locations(self, cafile=None, capath=None): + self.ca_certs = cafile + + if capath is not None: + raise SSLError("CA directories not supported in older Pythons") + + def set_ciphers(self, cipher_suite): + if not self.supports_set_ciphers: + raise TypeError( + 'Your version of Python does not support setting ' + 'a custom cipher suite. Please upgrade to Python ' + '2.7, 3.2, or later if you need this functionality.' + ) + self.ciphers = cipher_suite + + def wrap_socket(self, socket, server_hostname=None, server_side=False): + warnings.warn( + 'A true SSLContext object is not available. This prevents ' + 'urllib3 from configuring SSL appropriately and may cause ' + 'certain SSL connections to fail. You can upgrade to a newer ' + 'version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/security.html' + '#insecureplatformwarning.', + InsecurePlatformWarning + ) + kwargs = { + 'keyfile': self.keyfile, + 'certfile': self.certfile, + 'ca_certs': self.ca_certs, + 'cert_reqs': self.verify_mode, + 'ssl_version': self.protocol, + 'server_side': server_side, + } + if self.supports_set_ciphers: # Platform-specific: Python 2.7+ + return wrap_socket(socket, ciphers=self.ciphers, **kwargs) + else: # Platform-specific: Python 2.6 + return wrap_socket(socket, **kwargs) + + +def assert_fingerprint(cert, fingerprint): + """ + Checks if given fingerprint matches the supplied certificate. + + :param cert: + Certificate as bytes object. + :param fingerprint: + Fingerprint as string of hexdigits, can be interspersed by colons. + """ + + fingerprint = fingerprint.replace(':', '').lower() + digest_length = len(fingerprint) + hashfunc = HASHFUNC_MAP.get(digest_length) + if not hashfunc: + raise SSLError( + 'Fingerprint of invalid length: {0}'.format(fingerprint)) + + # We need encode() here for py32; works on py2 and p33. + fingerprint_bytes = unhexlify(fingerprint.encode()) + + cert_digest = hashfunc(cert).digest() + + if not _const_compare_digest(cert_digest, fingerprint_bytes): + raise SSLError('Fingerprints did not match. Expected "{0}", got "{1}".' + .format(fingerprint, hexlify(cert_digest))) + + +def resolve_cert_reqs(candidate): + """ + Resolves the argument to a numeric constant, which can be passed to + the wrap_socket function/method from the ssl module. + Defaults to :data:`ssl.CERT_NONE`. + If given a string it is assumed to be the name of the constant in the + :mod:`ssl` module or its abbrevation. + (So you can specify `REQUIRED` instead of `CERT_REQUIRED`. + If it's neither `None` nor a string we assume it is already the numeric + constant which can directly be passed to wrap_socket. + """ + if candidate is None: + return CERT_NONE + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'CERT_' + candidate) + return res + + return candidate + + +def resolve_ssl_version(candidate): + """ + like resolve_cert_reqs + """ + if candidate is None: + return PROTOCOL_SSLv23 + + if isinstance(candidate, str): + res = getattr(ssl, candidate, None) + if res is None: + res = getattr(ssl, 'PROTOCOL_' + candidate) + return res + + return candidate + + +def create_urllib3_context(ssl_version=None, cert_reqs=None, + options=None, ciphers=None): + """All arguments have the same meaning as ``ssl_wrap_socket``. + + By default, this function does a lot of the same work that + ``ssl.create_default_context`` does on Python 3.4+. It: + + - Disables SSLv2, SSLv3, and compression + - Sets a restricted set of server ciphers + + If you wish to enable SSLv3, you can do:: + + from urllib3.util import ssl_ + context = ssl_.create_urllib3_context() + context.options &= ~ssl_.OP_NO_SSLv3 + + You can do the same to enable compression (substituting ``COMPRESSION`` + for ``SSLv3`` in the last line above). + + :param ssl_version: + The desired protocol version to use. This will default to + PROTOCOL_SSLv23 which will negotiate the highest protocol that both + the server and your installation of OpenSSL support. + :param cert_reqs: + Whether to require the certificate verification. This defaults to + ``ssl.CERT_REQUIRED``. + :param options: + Specific OpenSSL options. These default to ``ssl.OP_NO_SSLv2``, + ``ssl.OP_NO_SSLv3``, ``ssl.OP_NO_COMPRESSION``. + :param ciphers: + Which cipher suites to allow the server to select. + :returns: + Constructed SSLContext object with specified options + :rtype: SSLContext + """ + context = SSLContext(ssl_version or ssl.PROTOCOL_SSLv23) + + # Setting the default here, as we may have no ssl module on import + cert_reqs = ssl.CERT_REQUIRED if cert_reqs is None else cert_reqs + + if options is None: + options = 0 + # SSLv2 is easily broken and is considered harmful and dangerous + options |= OP_NO_SSLv2 + # SSLv3 has several problems and is now dangerous + options |= OP_NO_SSLv3 + # Disable compression to prevent CRIME attacks for OpenSSL 1.0+ + # (issue #309) + options |= OP_NO_COMPRESSION + + context.options |= options + + if getattr(context, 'supports_set_ciphers', True): # Platform-specific: Python 2.6 + context.set_ciphers(ciphers or DEFAULT_CIPHERS) + + context.verify_mode = cert_reqs + if getattr(context, 'check_hostname', None) is not None: # Platform-specific: Python 3.2 + # We do our own verification, including fingerprints and alternative + # hostnames. So disable it here + context.check_hostname = False + return context + + +def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None, + ca_certs=None, server_hostname=None, + ssl_version=None, ciphers=None, ssl_context=None, + ca_cert_dir=None): + """ + All arguments except for server_hostname, ssl_context, and ca_cert_dir have + the same meaning as they do when using :func:`ssl.wrap_socket`. + + :param server_hostname: + When SNI is supported, the expected hostname of the certificate + :param ssl_context: + A pre-made :class:`SSLContext` object. If none is provided, one will + be created using :func:`create_urllib3_context`. + :param ciphers: + A string of ciphers we wish the client to support. This is not + supported on Python 2.6 as the ssl module does not support it. + :param ca_cert_dir: + A directory containing CA certificates in multiple separate files, as + supported by OpenSSL's -CApath flag or the capath argument to + SSLContext.load_verify_locations(). + """ + context = ssl_context + if context is None: + context = create_urllib3_context(ssl_version, cert_reqs, + ciphers=ciphers) + + if ca_certs or ca_cert_dir: + try: + context.load_verify_locations(ca_certs, ca_cert_dir) + except IOError as e: # Platform-specific: Python 2.6, 2.7, 3.2 + raise SSLError(e) + # Py33 raises FileNotFoundError which subclasses OSError + # These are not equivalent unless we check the errno attribute + except OSError as e: # Platform-specific: Python 3.3 and beyond + if e.errno == errno.ENOENT: + raise SSLError(e) + raise + + if certfile: + context.load_cert_chain(certfile, keyfile) + if HAS_SNI: # Platform-specific: OpenSSL with enabled SNI + return context.wrap_socket(sock, server_hostname=server_hostname) + + warnings.warn( + 'An HTTPS request has been made, but the SNI (Subject Name ' + 'Indication) extension to TLS is not available on this platform. ' + 'This may cause the server to present an incorrect TLS ' + 'certificate, which can cause validation failures. You can upgrade to ' + 'a newer version of Python to solve this. For more information, see ' + 'https://urllib3.readthedocs.io/en/latest/security.html' + '#snimissingwarning.', + SNIMissingWarning + ) + return context.wrap_socket(sock) diff --git a/vendor/requests/packages/urllib3/util/timeout.py b/vendor/requests/packages/urllib3/util/timeout.py new file mode 100644 index 00000000..ff62f476 --- /dev/null +++ b/vendor/requests/packages/urllib3/util/timeout.py @@ -0,0 +1,242 @@ +from __future__ import absolute_import +# The default socket timeout, used by httplib to indicate that no timeout was +# specified by the user +from socket import _GLOBAL_DEFAULT_TIMEOUT +import time + +from ..exceptions import TimeoutStateError + +# A sentinel value to indicate that no timeout was specified by the user in +# urllib3 +_Default = object() + + +def current_time(): + """ + Retrieve the current time. This function is mocked out in unit testing. + """ + return time.time() + + +class Timeout(object): + """ Timeout configuration. + + Timeouts can be defined as a default for a pool:: + + timeout = Timeout(connect=2.0, read=7.0) + http = PoolManager(timeout=timeout) + response = http.request('GET', 'http://example.com/') + + Or per-request (which overrides the default for the pool):: + + response = http.request('GET', 'http://example.com/', timeout=Timeout(10)) + + Timeouts can be disabled by setting all the parameters to ``None``:: + + no_timeout = Timeout(connect=None, read=None) + response = http.request('GET', 'http://example.com/, timeout=no_timeout) + + + :param total: + This combines the connect and read timeouts into one; the read timeout + will be set to the time leftover from the connect attempt. In the + event that both a connect timeout and a total are specified, or a read + timeout and a total are specified, the shorter timeout will be applied. + + Defaults to None. + + :type total: integer, float, or None + + :param connect: + The maximum amount of time to wait for a connection attempt to a server + to succeed. Omitting the parameter will default the connect timeout to + the system default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout for connection attempts. + + :type connect: integer, float, or None + + :param read: + The maximum amount of time to wait between consecutive + read operations for a response from the server. Omitting + the parameter will default the read timeout to the system + default, probably `the global default timeout in socket.py + `_. + None will set an infinite timeout. + + :type read: integer, float, or None + + .. note:: + + Many factors can affect the total amount of time for urllib3 to return + an HTTP response. + + For example, Python's DNS resolver does not obey the timeout specified + on the socket. Other factors that can affect total request time include + high CPU load, high swap, the program running at a low priority level, + or other behaviors. + + In addition, the read and total timeouts only measure the time between + read operations on the socket connecting the client and the server, + not the total amount of time for the request to return a complete + response. For most requests, the timeout is raised because the server + has not sent the first byte in the specified time. This is not always + the case; if a server streams one byte every fifteen seconds, a timeout + of 20 seconds will not trigger, even though the request will take + several minutes to complete. + + If your goal is to cut off any request after a set amount of wall clock + time, consider having a second "watcher" thread to cut off a slow + request. + """ + + #: A sentinel object representing the default timeout value + DEFAULT_TIMEOUT = _GLOBAL_DEFAULT_TIMEOUT + + def __init__(self, total=None, connect=_Default, read=_Default): + self._connect = self._validate_timeout(connect, 'connect') + self._read = self._validate_timeout(read, 'read') + self.total = self._validate_timeout(total, 'total') + self._start_connect = None + + def __str__(self): + return '%s(connect=%r, read=%r, total=%r)' % ( + type(self).__name__, self._connect, self._read, self.total) + + @classmethod + def _validate_timeout(cls, value, name): + """ Check that a timeout attribute is valid. + + :param value: The timeout value to validate + :param name: The name of the timeout attribute to validate. This is + used to specify in error messages. + :return: The validated and casted version of the given value. + :raises ValueError: If the type is not an integer or a float, or if it + is a numeric value less than zero. + """ + if value is _Default: + return cls.DEFAULT_TIMEOUT + + if value is None or value is cls.DEFAULT_TIMEOUT: + return value + + try: + float(value) + except (TypeError, ValueError): + raise ValueError("Timeout value %s was %s, but it must be an " + "int or float." % (name, value)) + + try: + if value < 0: + raise ValueError("Attempted to set %s timeout to %s, but the " + "timeout cannot be set to a value less " + "than 0." % (name, value)) + except TypeError: # Python 3 + raise ValueError("Timeout value %s was %s, but it must be an " + "int or float." % (name, value)) + + return value + + @classmethod + def from_float(cls, timeout): + """ Create a new Timeout from a legacy timeout value. + + The timeout value used by httplib.py sets the same timeout on the + connect(), and recv() socket requests. This creates a :class:`Timeout` + object that sets the individual timeouts to the ``timeout`` value + passed to this function. + + :param timeout: The legacy timeout value. + :type timeout: integer, float, sentinel default object, or None + :return: Timeout object + :rtype: :class:`Timeout` + """ + return Timeout(read=timeout, connect=timeout) + + def clone(self): + """ Create a copy of the timeout object + + Timeout properties are stored per-pool but each request needs a fresh + Timeout object to ensure each one has its own start/stop configured. + + :return: a copy of the timeout object + :rtype: :class:`Timeout` + """ + # We can't use copy.deepcopy because that will also create a new object + # for _GLOBAL_DEFAULT_TIMEOUT, which socket.py uses as a sentinel to + # detect the user default. + return Timeout(connect=self._connect, read=self._read, + total=self.total) + + def start_connect(self): + """ Start the timeout clock, used during a connect() attempt + + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to start a timer that has been started already. + """ + if self._start_connect is not None: + raise TimeoutStateError("Timeout timer has already been started.") + self._start_connect = current_time() + return self._start_connect + + def get_connect_duration(self): + """ Gets the time elapsed since the call to :meth:`start_connect`. + + :return: Elapsed time. + :rtype: float + :raises urllib3.exceptions.TimeoutStateError: if you attempt + to get duration for a timer that hasn't been started. + """ + if self._start_connect is None: + raise TimeoutStateError("Can't get connect duration for timer " + "that has not started.") + return current_time() - self._start_connect + + @property + def connect_timeout(self): + """ Get the value to use when setting a connection timeout. + + This will be a positive float or integer, the value None + (never timeout), or the default system timeout. + + :return: Connect timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + """ + if self.total is None: + return self._connect + + if self._connect is None or self._connect is self.DEFAULT_TIMEOUT: + return self.total + + return min(self._connect, self.total) + + @property + def read_timeout(self): + """ Get the value for the read timeout. + + This assumes some time has elapsed in the connection timeout and + computes the read timeout appropriately. + + If self.total is set, the read timeout is dependent on the amount of + time taken by the connect timeout. If the connection time has not been + established, a :exc:`~urllib3.exceptions.TimeoutStateError` will be + raised. + + :return: Value to use for the read timeout. + :rtype: int, float, :attr:`Timeout.DEFAULT_TIMEOUT` or None + :raises urllib3.exceptions.TimeoutStateError: If :meth:`start_connect` + has not yet been called on this object. + """ + if (self.total is not None and + self.total is not self.DEFAULT_TIMEOUT and + self._read is not None and + self._read is not self.DEFAULT_TIMEOUT): + # In case the connect timeout has not yet been established. + if self._start_connect is None: + return self._read + return max(0, min(self.total - self.get_connect_duration(), + self._read)) + elif self.total is not None and self.total is not self.DEFAULT_TIMEOUT: + return max(0, self.total - self.get_connect_duration()) + else: + return self._read diff --git a/vendor/requests/packages/urllib3/util/url.py b/vendor/requests/packages/urllib3/util/url.py new file mode 100644 index 00000000..e996204a --- /dev/null +++ b/vendor/requests/packages/urllib3/util/url.py @@ -0,0 +1,217 @@ +from __future__ import absolute_import +from collections import namedtuple + +from ..exceptions import LocationParseError + + +url_attrs = ['scheme', 'auth', 'host', 'port', 'path', 'query', 'fragment'] + + +class Url(namedtuple('Url', url_attrs)): + """ + Datastructure for representing an HTTP URL. Used as a return value for + :func:`parse_url`. + """ + slots = () + + def __new__(cls, scheme=None, auth=None, host=None, port=None, path=None, + query=None, fragment=None): + if path and not path.startswith('/'): + path = '/' + path + return super(Url, cls).__new__(cls, scheme, auth, host, port, path, + query, fragment) + + @property + def hostname(self): + """For backwards-compatibility with urlparse. We're nice like that.""" + return self.host + + @property + def request_uri(self): + """Absolute path including the query string.""" + uri = self.path or '/' + + if self.query is not None: + uri += '?' + self.query + + return uri + + @property + def netloc(self): + """Network location including host and port""" + if self.port: + return '%s:%d' % (self.host, self.port) + return self.host + + @property + def url(self): + """ + Convert self into a url + + This function should more or less round-trip with :func:`.parse_url`. The + returned url may not be exactly the same as the url inputted to + :func:`.parse_url`, but it should be equivalent by the RFC (e.g., urls + with a blank port will have : removed). + + Example: :: + + >>> U = parse_url('http://google.com/mail/') + >>> U.url + 'http://google.com/mail/' + >>> Url('http', 'username:password', 'host.com', 80, + ... '/path', 'query', 'fragment').url + 'http://username:password@host.com:80/path?query#fragment' + """ + scheme, auth, host, port, path, query, fragment = self + url = '' + + # We use "is not None" we want things to happen with empty strings (or 0 port) + if scheme is not None: + url += scheme + '://' + if auth is not None: + url += auth + '@' + if host is not None: + url += host + if port is not None: + url += ':' + str(port) + if path is not None: + url += path + if query is not None: + url += '?' + query + if fragment is not None: + url += '#' + fragment + + return url + + def __str__(self): + return self.url + + +def split_first(s, delims): + """ + Given a string and an iterable of delimiters, split on the first found + delimiter. Return two split parts and the matched delimiter. + + If not found, then the first part is the full input string. + + Example:: + + >>> split_first('foo/bar?baz', '?/=') + ('foo', 'bar?baz', '/') + >>> split_first('foo/bar?baz', '123') + ('foo/bar?baz', '', None) + + Scales linearly with number of delims. Not ideal for large number of delims. + """ + min_idx = None + min_delim = None + for d in delims: + idx = s.find(d) + if idx < 0: + continue + + if min_idx is None or idx < min_idx: + min_idx = idx + min_delim = d + + if min_idx is None or min_idx < 0: + return s, '', None + + return s[:min_idx], s[min_idx + 1:], min_delim + + +def parse_url(url): + """ + Given a url, return a parsed :class:`.Url` namedtuple. Best-effort is + performed to parse incomplete urls. Fields not provided will be None. + + Partly backwards-compatible with :mod:`urlparse`. + + Example:: + + >>> parse_url('http://google.com/mail/') + Url(scheme='http', host='google.com', port=None, path='/mail/', ...) + >>> parse_url('google.com:80') + Url(scheme=None, host='google.com', port=80, path=None, ...) + >>> parse_url('/foo?bar') + Url(scheme=None, host=None, port=None, path='/foo', query='bar', ...) + """ + + # While this code has overlap with stdlib's urlparse, it is much + # simplified for our needs and less annoying. + # Additionally, this implementations does silly things to be optimal + # on CPython. + + if not url: + # Empty + return Url() + + scheme = None + auth = None + host = None + port = None + path = None + fragment = None + query = None + + # Scheme + if '://' in url: + scheme, url = url.split('://', 1) + + # Find the earliest Authority Terminator + # (http://tools.ietf.org/html/rfc3986#section-3.2) + url, path_, delim = split_first(url, ['/', '?', '#']) + + if delim: + # Reassemble the path + path = delim + path_ + + # Auth + if '@' in url: + # Last '@' denotes end of auth part + auth, url = url.rsplit('@', 1) + + # IPv6 + if url and url[0] == '[': + host, url = url.split(']', 1) + host += ']' + + # Port + if ':' in url: + _host, port = url.split(':', 1) + + if not host: + host = _host + + if port: + # If given, ports must be integers. + if not port.isdigit(): + raise LocationParseError(url) + port = int(port) + else: + # Blank ports are cool, too. (rfc3986#section-3.2.3) + port = None + + elif not host and url: + host = url + + if not path: + return Url(scheme, auth, host, port, path, query, fragment) + + # Fragment + if '#' in path: + path, fragment = path.split('#', 1) + + # Query + if '?' in path: + path, query = path.split('?', 1) + + return Url(scheme, auth, host, port, path, query, fragment) + + +def get_host(url): + """ + Deprecated. Use :func:`.parse_url` instead. + """ + p = parse_url(url) + return p.scheme or 'http', p.hostname, p.port diff --git a/vendor/requests/sessions.py b/vendor/requests/sessions.py index 2aae6e40..bcbcc880 100644 --- a/vendor/requests/sessions.py +++ b/vendor/requests/sessions.py @@ -6,39 +6,41 @@ requests.session This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). - """ import os from collections import Mapping from datetime import datetime -from .compat import cookielib, OrderedDict, urljoin, urlparse, builtin_str +from .auth import _basic_auth_str +from .compat import cookielib, OrderedDict, urljoin, urlparse from .cookies import ( cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) -from .models import Request, PreparedRequest +from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT from .hooks import default_hooks, dispatch_hook -from .utils import to_key_val_list, default_headers -from .exceptions import TooManyRedirects, InvalidSchema +from .utils import to_key_val_list, default_headers, to_native_string +from .exceptions import ( + TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) +from .packages.urllib3._collections import RecentlyUsedContainer from .structures import CaseInsensitiveDict from .adapters import HTTPAdapter -from .utils import requote_uri, get_environ_proxies, get_netrc_auth +from .utils import ( + requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, + get_auth_from_url +) from .status_codes import codes -REDIRECT_STATI = ( - codes.moved, # 301 - codes.found, # 302 - codes.other, # 303 - codes.temporary_moved, # 307 -) -DEFAULT_REDIRECT_LIMIT = 30 + +# formerly defined here, reexposed here for backward compatibility +from .models import REDIRECT_STATI + +REDIRECT_CACHE_SIZE = 1000 def merge_setting(request_setting, session_setting, dict_class=OrderedDict): - """ - Determines appropriate setting for a given request, taking into account the - explicit setting on that request, and the setting in the session. If a + """Determines appropriate setting for a given request, taking into account + the explicit setting on that request, and the setting in the session. If a setting is a dictionary, they will be merged together using `dict_class` """ @@ -58,17 +60,17 @@ def merge_setting(request_setting, session_setting, dict_class=OrderedDict): merged_setting = dict_class(to_key_val_list(session_setting)) merged_setting.update(to_key_val_list(request_setting)) - # Remove keys that are set to None. - for (k, v) in request_setting.items(): - if v is None: - del merged_setting[k] + # Remove keys that are set to None. Extract keys first to avoid altering + # the dictionary during iteration. + none_keys = [k for (k, v) in merged_setting.items() if v is None] + for key in none_keys: + del merged_setting[key] return merged_setting def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): - """ - Properly merges both requests and session hooks. + """Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. @@ -84,25 +86,33 @@ def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): class SessionRedirectMixin(object): def resolve_redirects(self, resp, req, stream=False, timeout=None, - verify=True, cert=None, proxies=None): + verify=True, cert=None, proxies=None, **adapter_kwargs): """Receives a Response. Returns a generator of Responses.""" i = 0 + hist = [] # keep track of history - # ((resp.status_code is codes.see_other)) - while ('location' in resp.headers and resp.status_code in REDIRECT_STATI): + while resp.is_redirect: prepared_request = req.copy() - resp.content # Consume socket so it can be released + if i > 0: + # Update history and keep track of redirects. + hist.append(resp) + new_hist = list(hist) + resp.history = new_hist + + try: + resp.content # Consume socket so it can be released + except (ChunkedEncodingError, ContentDecodingError, RuntimeError): + resp.raw.read(decode_content=False) if i >= self.max_redirects: - raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) + raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects, response=resp) # Release the connection back into the pool. resp.close() url = resp.headers['location'] - method = req.method # Handle redirection without scheme (see: RFC 1808 Section 4) if url.startswith('//'): @@ -113,38 +123,27 @@ class SessionRedirectMixin(object): parsed = urlparse(url) url = parsed.geturl() - # Facilitate non-RFC2616-compliant 'location' headers + # Facilitate relative 'location' headers, as allowed by RFC 7231. # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') # Compliant with RFC3986, we percent encode the url. - if not urlparse(url).netloc: + if not parsed.netloc: url = urljoin(resp.url, requote_uri(url)) else: url = requote_uri(url) - prepared_request.url = url + prepared_request.url = to_native_string(url) + # Cache the url, unless it redirects to itself. + if resp.is_permanent_redirect and req.url != prepared_request.url: + self.redirect_cache[req.url] = prepared_request.url - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4 - if (resp.status_code == codes.see_other and - method != 'HEAD'): - method = 'GET' - - # Do what the browsers do, despite standards... - # First, turn 302s into GETs. - if resp.status_code == codes.found and method != 'HEAD': - method = 'GET' - - # Second, if a POST is responded to with a 301, turn it into a GET. - # This bizarre behaviour is explained in Issue 1704. - if resp.status_code == codes.moved and method == 'POST': - method = 'GET' - - prepared_request.method = method + self.rebuild_method(prepared_request, resp) # https://github.com/kennethreitz/requests/issues/1084 - if resp.status_code not in (codes.temporary, codes.resume): - if 'Content-Length' in prepared_request.headers: - del prepared_request.headers['Content-Length'] - + if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): + # https://github.com/kennethreitz/requests/issues/3490 + purged_headers = ('Content-Length', 'Content-Type', 'Transfer-Encoding') + for header in purged_headers: + prepared_request.headers.pop(header, None) prepared_request.body = None headers = prepared_request.headers @@ -153,19 +152,29 @@ class SessionRedirectMixin(object): except KeyError: pass - extract_cookies_to_jar(prepared_request._cookies, - prepared_request, resp.raw) + # Extract any cookies sent on the response to the cookiejar + # in the new request. Because we've mutated our copied prepared + # request, use the old one that we haven't yet touched. + extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) prepared_request._cookies.update(self.cookies) prepared_request.prepare_cookies(prepared_request._cookies) + # Rebuild auth and proxy information. + proxies = self.rebuild_proxies(prepared_request, proxies) + self.rebuild_auth(prepared_request, resp) + + # Override the original request. + req = prepared_request + resp = self.send( - prepared_request, + req, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies, allow_redirects=False, + **adapter_kwargs ) extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) @@ -173,6 +182,90 @@ class SessionRedirectMixin(object): i += 1 yield resp + def rebuild_auth(self, prepared_request, response): + """When being redirected we may want to strip authentication from the + request to avoid leaking credentials. This method intelligently removes + and reapplies authentication where possible to avoid credential loss. + """ + headers = prepared_request.headers + url = prepared_request.url + + if 'Authorization' in headers: + # If we get redirected to a new host, we should strip out any + # authentication headers. + original_parsed = urlparse(response.request.url) + redirect_parsed = urlparse(url) + + if (original_parsed.hostname != redirect_parsed.hostname): + del headers['Authorization'] + + # .netrc might have more auth for us on our new host. + new_auth = get_netrc_auth(url) if self.trust_env else None + if new_auth is not None: + prepared_request.prepare_auth(new_auth) + + return + + def rebuild_proxies(self, prepared_request, proxies): + """This method re-evaluates the proxy configuration by considering the + environment variables. If we are redirected to a URL covered by + NO_PROXY, we strip the proxy configuration. Otherwise, we set missing + proxy keys for this URL (in case they were stripped by a previous + redirect). + + This method also replaces the Proxy-Authorization header where + necessary. + + :rtype: dict + """ + headers = prepared_request.headers + url = prepared_request.url + scheme = urlparse(url).scheme + new_proxies = proxies.copy() if proxies is not None else {} + + if self.trust_env and not should_bypass_proxies(url): + environ_proxies = get_environ_proxies(url) + + proxy = environ_proxies.get('all', environ_proxies.get(scheme)) + + if proxy: + new_proxies.setdefault(scheme, proxy) + + if 'Proxy-Authorization' in headers: + del headers['Proxy-Authorization'] + + try: + username, password = get_auth_from_url(new_proxies[scheme]) + except KeyError: + username, password = None, None + + if username and password: + headers['Proxy-Authorization'] = _basic_auth_str(username, password) + + return new_proxies + + def rebuild_method(self, prepared_request, response): + """When being redirected we may want to change the method of the request + based on certain specs or browser behavior. + """ + method = prepared_request.method + + # http://tools.ietf.org/html/rfc7231#section-6.4.4 + if response.status_code == codes.see_other and method != 'HEAD': + method = 'GET' + + # Do what the browsers do, despite standards... + # First, turn 302s into GETs. + if response.status_code == codes.found and method != 'HEAD': + method = 'GET' + + # Second, if a POST is responded to with a 301, turn it into a GET. + # This bizarre behaviour is explained in Issue 1704. + if response.status_code == codes.moved and method == 'POST': + method = 'GET' + + prepared_request.method = method + class Session(SessionRedirectMixin): """A Requests session. @@ -184,13 +277,20 @@ class Session(SessionRedirectMixin): >>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') - 200 + + + Or as a context manager:: + + >>> with requests.Session() as s: + >>> s.get('http://httpbin.org/get') + """ __attrs__ = [ - 'headers', 'cookies', 'auth', 'timeout', 'proxies', 'hooks', - 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', - 'trust_env', 'max_redirects'] + 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', + 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', + 'max_redirects', + ] def __init__(self): @@ -203,9 +303,9 @@ class Session(SessionRedirectMixin): #: :class:`Request `. self.auth = None - #: Dictionary mapping protocol to the URL of the proxy (e.g. - #: {'http': 'foo.bar:3128'}) to be used on each - #: :class:`Request `. + #: Dictionary mapping protocol or protocol and host to the URL of the proxy + #: (e.g. {'http': 'foo.bar:3128', 'http://host.name': 'foo.bar:4012'}) to + #: be used on each :class:`Request `. self.proxies = {} #: Event-handling hooks. @@ -227,9 +327,12 @@ class Session(SessionRedirectMixin): #: Maximum number of redirects allowed. If the request exceeds this #: limit, a :class:`TooManyRedirects` exception is raised. + #: This defaults to requests.models.DEFAULT_REDIRECT_LIMIT, which is + #: 30. self.max_redirects = DEFAULT_REDIRECT_LIMIT - #: Should we trust the environment? + #: Trust environment settings for proxy configuration, default + #: authentication and similar. self.trust_env = True #: A CookieJar containing all currently outstanding cookies set on this @@ -243,6 +346,9 @@ class Session(SessionRedirectMixin): self.mount('https://', HTTPAdapter()) self.mount('http://', HTTPAdapter()) + # Only store 1000 redirects to prevent using infinite memory + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + def __enter__(self): return self @@ -256,7 +362,8 @@ class Session(SessionRedirectMixin): :class:`Session`. :param request: :class:`Request` instance to prepare with this - session's settings. + session's settings. + :rtype: requests.PreparedRequest """ cookies = request.cookies or {} @@ -268,7 +375,6 @@ class Session(SessionRedirectMixin): merged_cookies = merge_cookies( merge_cookies(RequestsCookieJar(), self.cookies), cookies) - # Set environment's basic authentication if not explicitly set. auth = request.auth if self.trust_env and not auth and not self.auth: @@ -280,6 +386,7 @@ class Session(SessionRedirectMixin): url=request.url, files=request.files, data=request.data, + json=request.json, headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), params=merge_setting(request.params, self.params), auth=merge_setting(auth, self.auth), @@ -301,7 +408,8 @@ class Session(SessionRedirectMixin): hooks=None, stream=None, verify=None, - cert=None): + cert=None, + json=None): """Constructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. @@ -309,31 +417,34 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. - :param data: (optional) Dictionary or bytes to send in the body of the + :param data: (optional) Dictionary, bytes, or file-like object to send + in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. - :param files: (optional) Dictionary of 'filename': file-like-objects + :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. - :param timeout: (optional) Float describing the timeout of the - request. - :param allow_redirects: (optional) Boolean. Set to True by default. - :param proxies: (optional) Dictionary mapping protocol to the URL of - the proxy. + :param timeout: (optional) How long to wait for the server to send + data before giving up, as a float, or a :ref:`(connect timeout, + read timeout) ` tuple. + :type timeout: float or tuple + :param allow_redirects: (optional) Set to True by default. + :type allow_redirects: bool + :param proxies: (optional) Dictionary mapping protocol or protocol and + hostname to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. - :param verify: (optional) if ``True``, the SSL cert will be verified. - A CA_BUNDLE path can also be provided. + :param verify: (optional) whether the SSL cert will be verified. + A CA_BUNDLE path can also be provided. Defaults to ``True``. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. + :rtype: requests.Response """ - - method = builtin_str(method) - # Create the Request. req = Request( method = method.upper(), @@ -341,6 +452,7 @@ class Session(SessionRedirectMixin): headers = headers, files = files, data = data or {}, + json = json, params = params or {}, auth = auth, cookies = cookies, @@ -350,36 +462,16 @@ class Session(SessionRedirectMixin): proxies = proxies or {} - # Gather clues from the surrounding environment. - if self.trust_env: - # Set environment's proxies. - env_proxies = get_environ_proxies(url) or {} - for (k, v) in env_proxies.items(): - proxies.setdefault(k, v) - - # Look for configuration. - if not verify and verify is not False: - verify = os.environ.get('REQUESTS_CA_BUNDLE') - - # Curl compatibility. - if not verify and verify is not False: - verify = os.environ.get('CURL_CA_BUNDLE') - - # Merge all the kwargs. - proxies = merge_setting(proxies, self.proxies) - stream = merge_setting(stream, self.stream) - verify = merge_setting(verify, self.verify) - cert = merge_setting(cert, self.cert) + settings = self.merge_environment_settings( + prep.url, proxies, stream, verify, cert + ) # Send the request. send_kwargs = { - 'stream': stream, 'timeout': timeout, - 'verify': verify, - 'cert': cert, - 'proxies': proxies, 'allow_redirects': allow_redirects, } + send_kwargs.update(settings) resp = self.send(prep, **send_kwargs) return resp @@ -389,6 +481,7 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) @@ -399,6 +492,7 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) @@ -409,20 +503,23 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ kwargs.setdefault('allow_redirects', False) return self.request('HEAD', url, **kwargs) - def post(self, url, data=None, **kwargs): + def post(self, url, data=None, json=None, **kwargs): """Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. + :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ - return self.request('POST', url, data=data, **kwargs) + return self.request('POST', url, data=data, json=json, **kwargs) def put(self, url, data=None, **kwargs): """Sends a PUT request. Returns :class:`Response` object. @@ -430,6 +527,7 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ return self.request('PUT', url, data=data, **kwargs) @@ -440,6 +538,7 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ return self.request('PATCH', url, data=data, **kwargs) @@ -449,12 +548,17 @@ class Session(SessionRedirectMixin): :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. + :rtype: requests.Response """ return self.request('DELETE', url, **kwargs) def send(self, request, **kwargs): - """Send a given PreparedRequest.""" + """ + Send a given PreparedRequest. + + :rtype: requests.Response + """ # Set defaults that the hooks can utilize to ensure they always have # the correct parameters to reproduce the previous request. kwargs.setdefault('stream', self.stream) @@ -464,26 +568,33 @@ class Session(SessionRedirectMixin): # It's possible that users might accidentally send a Request object. # Guard against that specific failure case. - if not isinstance(request, PreparedRequest): + if isinstance(request, Request): raise ValueError('You can only send PreparedRequests.') - # Set up variables needed for resolve_redirects and dispatching of - # hooks + # Set up variables needed for resolve_redirects and dispatching of hooks allow_redirects = kwargs.pop('allow_redirects', True) stream = kwargs.get('stream') - timeout = kwargs.get('timeout') - verify = kwargs.get('verify') - cert = kwargs.get('cert') - proxies = kwargs.get('proxies') hooks = request.hooks + # Resolve URL in redirect cache, if available. + if allow_redirects: + checked_urls = set() + while request.url in self.redirect_cache: + checked_urls.add(request.url) + new_url = self.redirect_cache.get(request.url) + if new_url in checked_urls: + break + request.url = new_url + # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) # Start time (approximately) of the request start = datetime.utcnow() + # Send the request r = adapter.send(request, **kwargs) + # Total elapsed time of the request (approximately) r.elapsed = datetime.utcnow() - start @@ -492,15 +603,15 @@ class Session(SessionRedirectMixin): # Persist cookies if r.history: + # If the hooks create history then we want those cookies too for resp in r.history: extract_cookies_to_jar(self.cookies, resp.request, resp.raw) + extract_cookies_to_jar(self.cookies, request, r.raw) # Redirect resolving generator. - gen = self.resolve_redirects(r, request, stream=stream, - timeout=timeout, verify=verify, cert=cert, - proxies=proxies) + gen = self.resolve_redirects(r, request, **kwargs) # Resolve redirects if allowed. history = [resp for resp in gen] if allow_redirects else [] @@ -511,12 +622,47 @@ class Session(SessionRedirectMixin): history.insert(0, r) # Get the last request made r = history.pop() - r.history = tuple(history) + r.history = history + + if not stream: + r.content return r + def merge_environment_settings(self, url, proxies, stream, verify, cert): + """ + Check the environment and merge it with some settings. + + :rtype: dict + """ + # Gather clues from the surrounding environment. + if self.trust_env: + # Set environment's proxies. + env_proxies = get_environ_proxies(url) or {} + for (k, v) in env_proxies.items(): + proxies.setdefault(k, v) + + # Look for requests environment configuration and be compatible + # with cURL. + if verify is True or verify is None: + verify = (os.environ.get('REQUESTS_CA_BUNDLE') or + os.environ.get('CURL_CA_BUNDLE')) + + # Merge all the kwargs. + proxies = merge_setting(proxies, self.proxies) + stream = merge_setting(stream, self.stream) + verify = merge_setting(verify, self.verify) + cert = merge_setting(cert, self.cert) + + return {'verify': verify, 'proxies': proxies, 'stream': stream, + 'cert': cert} + def get_adapter(self, url): - """Returns the appropriate connnection adapter for the given URL.""" + """ + Returns the appropriate connection adapter for the given URL. + + :rtype: requests.adapters.BaseAdapter + """ for (prefix, adapter) in self.adapters.items(): if url.lower().startswith(prefix): @@ -533,21 +679,34 @@ class Session(SessionRedirectMixin): def mount(self, prefix, adapter): """Registers a connection adapter to a prefix. - Adapters are sorted in descending order by key length.""" + Adapters are sorted in descending order by key length. + """ self.adapters[prefix] = adapter keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] + for key in keys_to_move: self.adapters[key] = self.adapters.pop(key) def __getstate__(self): - return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) + state['redirect_cache'] = dict(self.redirect_cache) + return state def __setstate__(self, state): + redirect_cache = state.pop('redirect_cache', {}) for attr, value in state.items(): setattr(self, attr, value) + self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) + for redirect, to in redirect_cache.items(): + self.redirect_cache[redirect] = to + def session(): - """Returns a :class:`Session` for context-management.""" + """ + Returns a :class:`Session` for context-management. + + :rtype: Session + """ return Session() diff --git a/vendor/requests/status_codes.py b/vendor/requests/status_codes.py index ed7a8660..db2986bb 100644 --- a/vendor/requests/status_codes.py +++ b/vendor/requests/status_codes.py @@ -30,7 +30,8 @@ _codes = { 305: ('use_proxy',), 306: ('switch_proxy',), 307: ('temporary_redirect', 'temporary_moved', 'temporary'), - 308: ('resume_incomplete', 'resume'), + 308: ('permanent_redirect', + 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 # Client Error. 400: ('bad_request', 'bad'), @@ -52,6 +53,7 @@ _codes = { 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 417: ('expectation_failed',), 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), + 421: ('misdirected_request',), 422: ('unprocessable_entity', 'unprocessable'), 423: ('locked',), 424: ('failed_dependency', 'dependency'), @@ -77,11 +79,12 @@ _codes = { 507: ('insufficient_storage',), 509: ('bandwidth_limit_exceeded', 'bandwidth'), 510: ('not_extended',), + 511: ('network_authentication_required', 'network_auth', 'network_authentication'), } codes = LookupDict(name='status_codes') -for (code, titles) in list(_codes.items()): +for code, titles in _codes.items(): for title in titles: setattr(codes, title, code) if not title.startswith('\\'): diff --git a/vendor/requests/structures.py b/vendor/requests/structures.py index a1759137..05d2b3f5 100644 --- a/vendor/requests/structures.py +++ b/vendor/requests/structures.py @@ -5,38 +5,15 @@ requests.structures ~~~~~~~~~~~~~~~~~~~ Data structures that power Requests. - """ -import os import collections -from itertools import islice - -class IteratorProxy(object): - """docstring for IteratorProxy""" - def __init__(self, i): - self.i = i - # self.i = chain.from_iterable(i) - - def __iter__(self): - return self.i - - def __len__(self): - if hasattr(self.i, '__len__'): - return len(self.i) - if hasattr(self.i, 'len'): - return self.i.len - if hasattr(self.i, 'fileno'): - return os.fstat(self.i.fileno()).st_size - - def read(self, n): - return "".join(islice(self.i, None, n)) +from .compat import OrderedDict class CaseInsensitiveDict(collections.MutableMapping): - """ - A case-insensitive ``dict``-like object. + """A case-insensitive ``dict``-like object. Implements all methods and operations of ``collections.MutableMapping`` as well as dict's ``copy``. Also @@ -46,7 +23,7 @@ class CaseInsensitiveDict(collections.MutableMapping): case of the last key to be set, and ``iter(instance)``, ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` will contain case-sensitive keys. However, querying and contains - testing is case insensitive: + testing is case insensitive:: cid = CaseInsensitiveDict() cid['Accept'] = 'application/json' @@ -60,10 +37,10 @@ class CaseInsensitiveDict(collections.MutableMapping): If the constructor, ``.update``, or equality comparison operations are given keys that have equal ``.lower()``s, the behavior is undefined. - """ + def __init__(self, data=None, **kwargs): - self._store = dict() + self._store = OrderedDict() if data is None: data = {} self.update(data, **kwargs) @@ -106,7 +83,7 @@ class CaseInsensitiveDict(collections.MutableMapping): return CaseInsensitiveDict(self._store.values()) def __repr__(self): - return '%s(%r)' % (self.__class__.__name__, dict(self.items())) + return str(dict(self.items())) class LookupDict(dict): diff --git a/vendor/requests/utils.py b/vendor/requests/utils.py index c7e2b089..dfeb77d9 100644 --- a/vendor/requests/utils.py +++ b/vendor/requests/utils.py @@ -6,7 +6,6 @@ requests.utils This module provides utility functions that are used within Requests that are also useful for external consumption. - """ import cgi @@ -14,20 +13,20 @@ import codecs import collections import io import os -import platform import re -import sys import socket import struct +import warnings from . import __version__ from . import certs from .compat import parse_http_list as _parse_list_header from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2, - builtin_str, getproxies, proxy_bypass) + builtin_str, getproxies, proxy_bypass, urlunparse, + basestring) from .cookies import RequestsCookieJar, cookiejar_from_dict from .structures import CaseInsensitiveDict -from .exceptions import MissingSchema, InvalidURL +from .exceptions import InvalidURL, InvalidHeader, FileModeWarning _hush_pyflakes = (RequestsCookieJar,) @@ -46,45 +45,86 @@ def dict_to_sequence(d): def super_len(o): + total_length = 0 + current_position = 0 + if hasattr(o, '__len__'): - return len(o) + total_length = len(o) - if hasattr(o, 'len'): - return o.len + elif hasattr(o, 'len'): + total_length = o.len - if hasattr(o, 'fileno'): + elif hasattr(o, 'getvalue'): + # e.g. BytesIO, cStringIO.StringIO + total_length = len(o.getvalue()) + + elif hasattr(o, 'fileno'): try: fileno = o.fileno() except io.UnsupportedOperation: pass else: - return os.fstat(fileno).st_size + total_length = os.fstat(fileno).st_size - if hasattr(o, 'getvalue'): - # e.g. BytesIO, cStringIO.StringI - return len(o.getvalue()) + # Having used fstat to determine the file length, we need to + # confirm that this file was opened up in binary mode. + if 'b' not in o.mode: + warnings.warn(( + "Requests has determined the content-length for this " + "request using the binary size of the file: however, the " + "file has been opened in text mode (i.e. without the 'b' " + "flag in the mode). This may lead to an incorrect " + "content-length. In Requests 3.0, support will be removed " + "for files in text mode."), + FileModeWarning + ) -def get_netrc_auth(url): + if hasattr(o, 'tell'): + try: + current_position = o.tell() + except (OSError, IOError): + # This can happen in some weird situations, such as when the file + # is actually a special file descriptor like stdin. In this + # instance, we don't know what the length is, so set it to zero and + # let requests chunk it instead. + current_position = total_length + + return max(0, total_length - current_position) + + +def get_netrc_auth(url, raise_errors=False): """Returns the Requests tuple auth for a given url from netrc.""" try: from netrc import netrc, NetrcParseError - locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES) netrc_path = None - for loc in locations: - if os.path.exists(loc) and not netrc_path: + for f in NETRC_FILES: + try: + loc = os.path.expanduser('~/{0}'.format(f)) + except KeyError: + # os.path.expanduser can fail when $HOME is undefined and + # getpwuid fails. See http://bugs.python.org/issue20164 & + # https://github.com/kennethreitz/requests/issues/1846 + return + + if os.path.exists(loc): netrc_path = loc + break # Abort early if there isn't one. if netrc_path is None: - return netrc_path + return ri = urlparse(url) - # Strip port numbers from netloc - host = ri.netloc.split(':')[0] + # Strip port numbers from netloc. This weird `if...encode`` dance is + # used for Python 3.2, which doesn't support unicode literals. + splitstr = b':' + if isinstance(url, str): + splitstr = splitstr.decode('ascii') + host = ri.netloc.split(splitstr)[0] try: _netrc = netrc(netrc_path).authenticators(host) @@ -94,8 +134,9 @@ def get_netrc_auth(url): return (_netrc[login_i], _netrc[2]) except (NetrcParseError, IOError): # If there was a parsing error or a permissions issue reading the file, - # we'll just skip netrc auth - pass + # we'll just skip netrc auth unless explicitly asked to raise errors. + if raise_errors: + raise # AppEngine hackiness. except (ImportError, AttributeError): @@ -105,7 +146,8 @@ def get_netrc_auth(url): def guess_filename(obj): """Tries to guess the filename of the given object.""" name = getattr(obj, 'name', None) - if name and name[0] != '<' and name[-1] != '>': + if (name and isinstance(name, basestring) and name[0] != '<' and + name[-1] != '>'): return os.path.basename(name) @@ -122,6 +164,8 @@ def from_key_val_list(value): ValueError: need more than 1 value to unpack >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) + + :rtype: OrderedDict """ if value is None: return None @@ -144,6 +188,8 @@ def to_key_val_list(value): [('key', 'val')] >>> to_key_val_list('string') ValueError: cannot encode objects that are not 2-tuples. + + :rtype: list """ if value is None: return None @@ -179,6 +225,7 @@ def parse_list_header(value): :param value: a string with a list header. :return: :class:`list` + :rtype: list """ result = [] for item in _parse_list_header(value): @@ -209,6 +256,7 @@ def parse_dict_header(value): :param value: a string with a dict header. :return: :class:`dict` + :rtype: dict """ result = {} for item in _parse_list_header(value): @@ -229,6 +277,7 @@ def unquote_header_value(value, is_filename=False): using for quoting. :param value: the header value to unquote. + :rtype: str """ if value and value[0] == value[-1] == '"': # this is not the real unquoting, but fixing this so that the @@ -251,6 +300,7 @@ def dict_from_cookiejar(cj): """Returns a key/value dictionary from a CookieJar. :param cj: CookieJar object to extract cookies from. + :rtype: dict """ cookie_dict = {} @@ -266,6 +316,7 @@ def add_dict_to_cookiejar(cj, cookie_dict): :param cj: CookieJar to insert cookies into. :param cookie_dict: Dict of key/values to insert into CookieJar. + :rtype: CookieJar """ cj2 = cookiejar_from_dict(cookie_dict) @@ -278,6 +329,11 @@ def get_encodings_from_content(content): :param content: bytestring to extract encodings from. """ + warnings.warn(( + 'In requests 3.0, get_encodings_from_content will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) charset_re = re.compile(r']', flags=re.I) pragma_re = re.compile(r']', flags=re.I) @@ -292,6 +348,7 @@ def get_encoding_from_headers(headers): """Returns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. + :rtype: str """ content_type = headers.get('content-type') @@ -329,6 +386,8 @@ def stream_decode_response_unicode(iterator, r): def iter_slices(string, slice_length): """Iterate over slices of a string.""" pos = 0 + if slice_length is None or slice_length <= 0: + slice_length = len(string) while pos < len(string): yield string[pos:pos + slice_length] pos += slice_length @@ -342,12 +401,15 @@ def get_unicode_from_response(r): Tried: 1. charset from content-type + 2. fall back and replace all unicode characters - 2. every encodings from ```` - - 3. fall back and replace all unicode characters - + :rtype: str """ + warnings.warn(( + 'In requests 3.0, get_unicode_from_response will be removed. For ' + 'more information, please see the discussion on issue #2266. (This' + ' warning should only appear once.)'), + DeprecationWarning) tried_encodings = [] @@ -376,6 +438,8 @@ UNRESERVED_SET = frozenset( def unquote_unreserved(uri): """Un-escape any percent-escape sequences in a URI that are unreserved characters. This leaves all reserved, illegal and non-ASCII bytes encoded. + + :rtype: str """ parts = uri.split('%') for i in range(1, len(parts)): @@ -400,18 +464,30 @@ def requote_uri(uri): This function passes the given URI through an unquote/quote cycle to ensure that it is fully and consistently quoted. + + :rtype: str """ - # Unquote only the unreserved characters - # Then quote only illegal characters (do not quote reserved, unreserved, - # or '%') - return quote(unquote_unreserved(uri), safe="!#$%&'()*+,/:;=?@[]~") + safe_with_percent = "!#$%&'()*+,/:;=?@[]~" + safe_without_percent = "!#$&'()*+,/:;=?@[]~" + try: + # Unquote only the unreserved characters + # Then quote only illegal characters (do not quote reserved, + # unreserved, or '%') + return quote(unquote_unreserved(uri), safe=safe_with_percent) + except InvalidURL: + # We couldn't unquote the given URI, so let's try quoting it, but + # there may be unquoted '%'s in the URI. We need to make sure they're + # properly quoted so they do not cause issues elsewhere. + return quote(uri, safe=safe_without_percent) def address_in_network(ip, net): - """ - This function allows you to check if on IP belongs to a network subnet + """This function allows you to check if on IP belongs to a network subnet + Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 + + :rtype: bool """ ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] netaddr, bits = net.split('/') @@ -421,15 +497,20 @@ def address_in_network(ip, net): def dotted_netmask(mask): - """ - Converts mask from /xx format to xxx.xxx.xxx.xxx + """Converts mask from /xx format to xxx.xxx.xxx.xxx + Example: if mask is 24 function returns 255.255.255.0 + + :rtype: str """ bits = 0xffffffff ^ (1 << 32 - mask) - 1 return socket.inet_ntoa(struct.pack('>I', bits)) def is_ipv4_address(string_ip): + """ + :rtype: bool + """ try: socket.inet_aton(string_ip) except socket.error: @@ -438,7 +519,11 @@ def is_ipv4_address(string_ip): def is_valid_cidr(string_network): - """Very simple check of the cidr format in no_proxy variable""" + """ + Very simple check of the cidr format in no_proxy variable. + + :rtype: bool + """ if string_network.count('/') == 1: try: mask = int(string_network.split('/')[1]) @@ -457,9 +542,12 @@ def is_valid_cidr(string_network): return True -def get_environ_proxies(url): - """Return a dict of environment proxies.""" +def should_bypass_proxies(url): + """ + Returns whether we should bypass proxies or not. + :rtype: bool + """ get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) # First check whether no_proxy is defined. If it is, check that the URL @@ -470,68 +558,100 @@ def get_environ_proxies(url): if no_proxy: # We need to check whether we match here. We need to see if we match # the end of the netloc, both with and without the port. - no_proxy = no_proxy.replace(' ', '').split(',') + no_proxy = ( + host for host in no_proxy.replace(' ', '').split(',') if host + ) ip = netloc.split(':')[0] if is_ipv4_address(ip): for proxy_ip in no_proxy: if is_valid_cidr(proxy_ip): if address_in_network(ip, proxy_ip): - return {} + return True + elif ip == proxy_ip: + # If no_proxy ip was defined in plain IP notation instead of cidr notation & + # matches the IP of the index + return True else: for host in no_proxy: if netloc.endswith(host) or netloc.split(':')[0].endswith(host): # The URL does match something in no_proxy, so we don't want # to apply the proxies on this URL. - return {} + return True # If the system proxy settings indicate that this URL should be bypassed, # don't proxy. - if proxy_bypass(netloc): - return {} + # The proxy_bypass function is incredibly buggy on OS X in early versions + # of Python 2.6, so allow this call to fail. Only catch the specific + # exceptions we've seen, though: this call failing in other ways can reveal + # legitimate problems. + try: + bypass = proxy_bypass(netloc) + except (TypeError, socket.gaierror): + bypass = False - # If we get here, we either didn't have no_proxy set or we're not going - # anywhere that no_proxy applies to, and the system settings don't require - # bypassing the proxy for the current URL. - return getproxies() + if bypass: + return True + + return False + + +def get_environ_proxies(url): + """ + Return a dict of environment proxies. + + :rtype: dict + """ + if should_bypass_proxies(url): + return {} + else: + return getproxies() + + +def select_proxy(url, proxies): + """Select a proxy for the url, if applicable. + + :param url: The url being for the request + :param proxies: A dictionary of schemes or schemes and hosts to proxy URLs + """ + proxies = proxies or {} + urlparts = urlparse(url) + if urlparts.hostname is None: + return proxies.get('all', proxies.get(urlparts.scheme)) + + proxy_keys = [ + 'all://' + urlparts.hostname, + 'all', + urlparts.scheme + '://' + urlparts.hostname, + urlparts.scheme, + ] + proxy = None + for proxy_key in proxy_keys: + if proxy_key in proxies: + proxy = proxies[proxy_key] + break + + return proxy def default_user_agent(name="python-requests"): - """Return a string representing the default user agent.""" - _implementation = platform.python_implementation() + """ + Return a string representing the default user agent. - if _implementation == 'CPython': - _implementation_version = platform.python_version() - elif _implementation == 'PyPy': - _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, - sys.pypy_version_info.minor, - sys.pypy_version_info.micro) - if sys.pypy_version_info.releaselevel != 'final': - _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) - elif _implementation == 'Jython': - _implementation_version = platform.python_version() # Complete Guess - elif _implementation == 'IronPython': - _implementation_version = platform.python_version() # Complete Guess - else: - _implementation_version = 'Unknown' - - try: - p_system = platform.system() - p_release = platform.release() - except IOError: - p_system = 'Unknown' - p_release = 'Unknown' - - return " ".join(['%s/%s' % (name, __version__), - '%s/%s' % (_implementation, _implementation_version), - '%s/%s' % (p_system, p_release)]) + :rtype: str + """ + return '%s/%s' % (name, __version__) def default_headers(): + """ + :rtype: requests.structures.CaseInsensitiveDict + """ return CaseInsensitiveDict({ 'User-Agent': default_user_agent(), - 'Accept-Encoding': ', '.join(('gzip', 'deflate', 'compress')), - 'Accept': '*/*' + 'Accept-Encoding': ', '.join(('gzip', 'deflate')), + 'Accept': '*/*', + 'Connection': 'keep-alive', }) @@ -540,25 +660,24 @@ def parse_header_links(value): i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" + :rtype: list """ links = [] - replace_chars = " '\"" + replace_chars = ' \'"' - for val in value.split(","): + for val in re.split(', *<', value): try: - url, params = val.split(";", 1) + url, params = val.split(';', 1) except ValueError: url, params = val, '' - link = {} + link = {'url': url.strip('<> \'"')} - link["url"] = url.strip("<> '\"") - - for param in params.split(";"): + for param in params.split(';'): try: - key, value = param.split("=") + key, value = param.split('=') except ValueError: break @@ -576,6 +695,9 @@ _null3 = _null * 3 def guess_json_utf(data): + """ + :rtype: str + """ # JSON always starts with two ASCII characters, so detection is as # easy as counting the nulls and from their location and count # determine the encoding. Also detect a BOM, if present. @@ -604,34 +726,44 @@ def guess_json_utf(data): return None -def except_on_missing_scheme(url): - """Given a URL, raise a MissingSchema exception if the scheme is missing. - """ - scheme, netloc, path, params, query, fragment = urlparse(url) +def prepend_scheme_if_needed(url, new_scheme): + """Given a URL that may or may not have a scheme, prepend the given scheme. + Does not replace a present scheme with the one provided as an argument. - if not scheme: - raise MissingSchema('Proxy URLs must have explicit schemes.') + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) + + # urlparse is a finicky beast, and sometimes decides that there isn't a + # netloc present. Assume that it's being over-cautious, and switch netloc + # and path if urlparse decided there was no netloc. + if not netloc: + netloc, path = path, netloc + + return urlunparse((scheme, netloc, path, params, query, fragment)) def get_auth_from_url(url): """Given a url with authentication components, extract them into a tuple of - username,password.""" - if url: - url = unquote(url) - parsed = urlparse(url) - return (parsed.username, parsed.password) - else: - return ('', '') + username,password. + + :rtype: (str,str) + """ + parsed = urlparse(url) + + try: + auth = (unquote(parsed.username), unquote(parsed.password)) + except (AttributeError, TypeError): + auth = ('', '') + + return auth def to_native_string(string, encoding='ascii'): + """Given a string object, regardless of type, returns a representation of + that string in the native string type, encoding and decoding where + necessary. This assumes ASCII unless told otherwise. """ - Given a string object, regardless of type, returns a representation of that - string in the native string type, encoding and decoding where necessary. - This assumes ASCII unless told otherwise. - """ - out = None - if isinstance(string, builtin_str): out = string else: @@ -641,3 +773,45 @@ def to_native_string(string, encoding='ascii'): out = string.decode(encoding) return out + + +# Moved outside of function to avoid recompile every call +_CLEAN_HEADER_REGEX_BYTE = re.compile(b'^\\S[^\\r\\n]*$|^$') +_CLEAN_HEADER_REGEX_STR = re.compile(r'^\S[^\r\n]*$|^$') + +def check_header_validity(header): + """Verifies that header value is a string which doesn't contain + leading whitespace or return characters. This prevents unintended + header injection. + + :param header: tuple, in the format (name, value). + """ + name, value = header + + if isinstance(value, bytes): + pat = _CLEAN_HEADER_REGEX_BYTE + else: + pat = _CLEAN_HEADER_REGEX_STR + try: + if not pat.match(value): + raise InvalidHeader("Invalid return character or leading space in header: %s" % name) + except TypeError: + raise InvalidHeader("Header value %s must be of type str or bytes, " + "not %s" % (value, type(value))) + + +def urldefragauth(url): + """ + Given a url remove the fragment and the authentication part. + + :rtype: str + """ + scheme, netloc, path, params, query, fragment = urlparse(url) + + # see func:`prepend_scheme_if_needed` + if not netloc: + netloc, path = path, netloc + + netloc = netloc.rsplit('@', 1)[-1] + + return urlunparse((scheme, netloc, path, params, query, '')) diff --git a/vendor/singledispatch/PKG-INFO b/vendor/singledispatch/PKG-INFO new file mode 100644 index 00000000..106510f1 --- /dev/null +++ b/vendor/singledispatch/PKG-INFO @@ -0,0 +1,242 @@ +Metadata-Version: 1.1 +Name: singledispatch +Version: 3.4.0.3 +Summary: This library brings functools.singledispatch from Python 3.4 to Python 2.6-3.3. +Home-page: http://docs.python.org/3/library/functools.html#functools.singledispatch +Author: Łukasz Langa +Author-email: lukasz@langa.pl +License: MIT +Description: ============== + singledispatch + ============== + + `PEP 443 `_ proposed to expose + a mechanism in the ``functools`` standard library module in Python 3.4 + that provides a simple form of generic programming known as + single-dispatch generic functions. + + This library is a backport of this functionality to Python 2.6 - 3.3. + + To define a generic function, decorate it with the ``@singledispatch`` + decorator. Note that the dispatch happens on the type of the first + argument, create your function accordingly:: + + >>> from singledispatch import singledispatch + >>> @singledispatch + ... def fun(arg, verbose=False): + ... if verbose: + ... print("Let me just say,", end=" ") + ... print(arg) + + To add overloaded implementations to the function, use the + ``register()`` attribute of the generic function. It is a decorator, + taking a type parameter and decorating a function implementing the + operation for that type:: + + >>> @fun.register(int) + ... def _(arg, verbose=False): + ... if verbose: + ... print("Strength in numbers, eh?", end=" ") + ... print(arg) + ... + >>> @fun.register(list) + ... def _(arg, verbose=False): + ... if verbose: + ... print("Enumerate this:") + ... for i, elem in enumerate(arg): + ... print(i, elem) + + To enable registering lambdas and pre-existing functions, the + ``register()`` attribute can be used in a functional form:: + + >>> def nothing(arg, verbose=False): + ... print("Nothing.") + ... + >>> fun.register(type(None), nothing) + + The ``register()`` attribute returns the undecorated function which + enables decorator stacking, pickling, as well as creating unit tests for + each variant independently:: + + >>> @fun.register(float) + ... @fun.register(Decimal) + ... def fun_num(arg, verbose=False): + ... if verbose: + ... print("Half of your number:", end=" ") + ... print(arg / 2) + ... + >>> fun_num is fun + False + + When called, the generic function dispatches on the type of the first + argument:: + + >>> fun("Hello, world.") + Hello, world. + >>> fun("test.", verbose=True) + Let me just say, test. + >>> fun(42, verbose=True) + Strength in numbers, eh? 42 + >>> fun(['spam', 'spam', 'eggs', 'spam'], verbose=True) + Enumerate this: + 0 spam + 1 spam + 2 eggs + 3 spam + >>> fun(None) + Nothing. + >>> fun(1.23) + 0.615 + + Where there is no registered implementation for a specific type, its + method resolution order is used to find a more generic implementation. + The original function decorated with ``@singledispatch`` is registered + for the base ``object`` type, which means it is used if no better + implementation is found. + + To check which implementation will the generic function choose for + a given type, use the ``dispatch()`` attribute:: + + >>> fun.dispatch(float) + + >>> fun.dispatch(dict) # note: default implementation + + + To access all registered implementations, use the read-only ``registry`` + attribute:: + + >>> fun.registry.keys() + dict_keys([, , , + , , + ]) + >>> fun.registry[float] + + >>> fun.registry[object] + + + The vanilla documentation is available at + http://docs.python.org/3/library/functools.html#functools.singledispatch. + + + Versioning + ---------- + + This backport is intended to keep 100% compatibility with the vanilla + release in Python 3.4+. To help maintaining a version you want and + expect, a versioning scheme is used where: + + * the first three numbers indicate the version of Python 3.x from which the + backport is done + + * a backport release number is provided after the last dot + + For example, ``3.4.0.0`` is the **first** release of ``singledispatch`` + compatible with the library found in Python **3.4.0**. + + A single exception from the 100% compatibility principle is that bugs + fixed before releasing another minor Python 3.x.y version **will be + included** in the backport releases done in the mean time. This rule + applies to bugs only. + + + Maintenance + ----------- + + This backport is maintained on BitBucket by Łukasz Langa, one of the + members of the core CPython team: + + * `singledispatch Mercurial repository `_ + + * `singledispatch issue tracker `_ + + + Change Log + ---------- + + 3.4.0.3 + ~~~~~~~ + + Should now install flawlessly on PyPy as well. Thanks to Ryan Petrello + for finding and fixing the ``setup.py`` issue. + + 3.4.0.2 + ~~~~~~~ + + Updated to the reference implementation as of 02-July-2013. + + * more predictable dispatch order when abstract base classes are in use: + abstract base classes are now inserted into the MRO of the argument's + class where their functionality is introduced, i.e. issubclass(cls, + abc) returns True for the class itself but returns False for all its + direct base classes. Implicit ABCs for a given class (either + registered or inferred from the presence of a special method like + __len__) are inserted directly after the last ABC explicitly listed in + the MRO of said class. This also means there are less "ambiguous + dispatch" exceptions raised. + + * better test coverage and improved docstrings + + 3.4.0.1 + ~~~~~~~ + + Updated to the reference implementation as of 31-May-2013. + + * better performance + + * fixed a corner case with PEP 435 enums + + * calls to `dispatch()` also cached + + * dispatching algorithm now now a module-level routine called `_find_impl()` + with a simplified implementation and proper documentation + + * `dispatch()` now handles all caching-related activities + + * terminology more consistent: "overload" -> "implementation" + + 3.4.0.0 + ~~~~~~~ + + * the first public release compatible with 3.4.0 + + + Conversion Process + ------------------ + + This section is technical and should bother you only if you are + wondering how this backport is produced. If the implementation details + of this backport are not important for you, feel free to ignore the + following content. + + ``singledispatch`` is converted using `six + `_ so that a single codebase can be + used for all compatible Python versions. Because a fully automatic + conversion was not doable, I took the following branching approach: + + * the ``upstream`` branch holds unchanged files synchronized from the + upstream CPython repository. The synchronization is currently done by + manually copying the required code parts and stating from which + CPython changeset they come from. The tests should pass on Python 3.4 + on this branch. + + * the ``default`` branch holds the manually translated version and this + is where all tests are run for all supported Python versions using + Tox. + +Keywords: single dispatch generic functions singledispatch genericfunctions decorator backport +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 2 +Classifier: Programming Language :: Python :: 2.6 +Classifier: Programming Language :: Python :: 2.7 +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.2 +Classifier: Programming Language :: Python :: 3.3 +Classifier: Programming Language :: Python :: 3.4 +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/vendor/singledispatch/singledispatch.py b/vendor/singledispatch/singledispatch.py new file mode 100644 index 00000000..87603fd0 --- /dev/null +++ b/vendor/singledispatch/singledispatch.py @@ -0,0 +1,219 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +__all__ = ['singledispatch'] + +from functools import update_wrapper +from weakref import WeakKeyDictionary +from singledispatch_helpers import MappingProxyType, get_cache_token + +################################################################################ +### singledispatch() - single-dispatch generic function decorator +################################################################################ + +def _c3_merge(sequences): + """Merges MROs in *sequences* to a single MRO using the C3 algorithm. + + Adapted from http://www.python.org/download/releases/2.3/mro/. + + """ + result = [] + while True: + sequences = [s for s in sequences if s] # purge empty sequences + if not sequences: + return result + for s1 in sequences: # find merge candidates among seq heads + candidate = s1[0] + for s2 in sequences: + if candidate in s2[1:]: + candidate = None + break # reject the current head, it appears later + else: + break + if not candidate: + raise RuntimeError("Inconsistent hierarchy") + result.append(candidate) + # remove the chosen candidate + for seq in sequences: + if seq[0] == candidate: + del seq[0] + +def _c3_mro(cls, abcs=None): + """Computes the method resolution order using extended C3 linearization. + + If no *abcs* are given, the algorithm works exactly like the built-in C3 + linearization used for method resolution. + + If given, *abcs* is a list of abstract base classes that should be inserted + into the resulting MRO. Unrelated ABCs are ignored and don't end up in the + result. The algorithm inserts ABCs where their functionality is introduced, + i.e. issubclass(cls, abc) returns True for the class itself but returns + False for all its direct base classes. Implicit ABCs for a given class + (either registered or inferred from the presence of a special method like + __len__) are inserted directly after the last ABC explicitly listed in the + MRO of said class. If two implicit ABCs end up next to each other in the + resulting MRO, their ordering depends on the order of types in *abcs*. + + """ + for i, base in enumerate(reversed(cls.__bases__)): + if hasattr(base, '__abstractmethods__'): + boundary = len(cls.__bases__) - i + break # Bases up to the last explicit ABC are considered first. + else: + boundary = 0 + abcs = list(abcs) if abcs else [] + explicit_bases = list(cls.__bases__[:boundary]) + abstract_bases = [] + other_bases = list(cls.__bases__[boundary:]) + for base in abcs: + if issubclass(cls, base) and not any( + issubclass(b, base) for b in cls.__bases__ + ): + # If *cls* is the class that introduces behaviour described by + # an ABC *base*, insert said ABC to its MRO. + abstract_bases.append(base) + for base in abstract_bases: + abcs.remove(base) + explicit_c3_mros = [_c3_mro(base, abcs=abcs) for base in explicit_bases] + abstract_c3_mros = [_c3_mro(base, abcs=abcs) for base in abstract_bases] + other_c3_mros = [_c3_mro(base, abcs=abcs) for base in other_bases] + return _c3_merge( + [[cls]] + + explicit_c3_mros + abstract_c3_mros + other_c3_mros + + [explicit_bases] + [abstract_bases] + [other_bases] + ) + +def _compose_mro(cls, types): + """Calculates the method resolution order for a given class *cls*. + + Includes relevant abstract base classes (with their respective bases) from + the *types* iterable. Uses a modified C3 linearization algorithm. + + """ + bases = set(cls.__mro__) + # Remove entries which are already present in the __mro__ or unrelated. + def is_related(typ): + return (typ not in bases and hasattr(typ, '__mro__') + and issubclass(cls, typ)) + types = [n for n in types if is_related(n)] + # Remove entries which are strict bases of other entries (they will end up + # in the MRO anyway. + def is_strict_base(typ): + for other in types: + if typ != other and typ in other.__mro__: + return True + return False + types = [n for n in types if not is_strict_base(n)] + # Subclasses of the ABCs in *types* which are also implemented by + # *cls* can be used to stabilize ABC ordering. + type_set = set(types) + mro = [] + for typ in types: + found = [] + for sub in typ.__subclasses__(): + if sub not in bases and issubclass(cls, sub): + found.append([s for s in sub.__mro__ if s in type_set]) + if not found: + mro.append(typ) + continue + # Favor subclasses with the biggest number of useful bases + found.sort(key=len, reverse=True) + for sub in found: + for subcls in sub: + if subcls not in mro: + mro.append(subcls) + return _c3_mro(cls, abcs=mro) + +def _find_impl(cls, registry): + """Returns the best matching implementation from *registry* for type *cls*. + + Where there is no registered implementation for a specific type, its method + resolution order is used to find a more generic implementation. + + Note: if *registry* does not contain an implementation for the base + *object* type, this function may return None. + + """ + mro = _compose_mro(cls, registry.keys()) + match = None + for t in mro: + if match is not None: + # If *match* is an implicit ABC but there is another unrelated, + # equally matching implicit ABC, refuse the temptation to guess. + if (t in registry and t not in cls.__mro__ + and match not in cls.__mro__ + and not issubclass(match, t)): + raise RuntimeError("Ambiguous dispatch: {0} or {1}".format( + match, t)) + break + if t in registry: + match = t + return registry.get(match) + +def singledispatch(func): + """Single-dispatch generic function decorator. + + Transforms a function into a generic function, which can have different + behaviours depending upon the type of its first argument. The decorated + function acts as the default implementation, and additional + implementations can be registered using the register() attribute of the + generic function. + + """ + registry = {} + dispatch_cache = WeakKeyDictionary() + def ns(): pass + ns.cache_token = None + + def dispatch(cls): + """generic_func.dispatch(cls) -> + + Runs the dispatch algorithm to return the best available implementation + for the given *cls* registered on *generic_func*. + + """ + if ns.cache_token is not None: + current_token = get_cache_token() + if ns.cache_token != current_token: + dispatch_cache.clear() + ns.cache_token = current_token + try: + impl = dispatch_cache[cls] + except KeyError: + try: + impl = registry[cls] + except KeyError: + impl = _find_impl(cls, registry) + dispatch_cache[cls] = impl + return impl + + def register(cls, func=None): + """generic_func.register(cls, func) -> func + + Registers a new implementation for the given *cls* on a *generic_func*. + + """ + if func is None: + return lambda f: register(cls, f) + registry[cls] = func + if ns.cache_token is None and hasattr(cls, '__abstractmethods__'): + ns.cache_token = get_cache_token() + dispatch_cache.clear() + return func + + def wrapper(*args, **kw): + return dispatch(args[0].__class__)(*args, **kw) + + registry[object] = func + wrapper.register = register + wrapper.dispatch = dispatch + wrapper.registry = MappingProxyType(registry) + wrapper._clear_cache = dispatch_cache.clear + update_wrapper(wrapper, func) + return wrapper + diff --git a/vendor/singledispatch/singledispatch_helpers.py b/vendor/singledispatch/singledispatch_helpers.py new file mode 100644 index 00000000..8fcdce40 --- /dev/null +++ b/vendor/singledispatch/singledispatch_helpers.py @@ -0,0 +1,170 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +from __future__ import absolute_import +from __future__ import division +from __future__ import print_function +from __future__ import unicode_literals + +from abc import ABCMeta +from collections import MutableMapping +import sys +try: + from collections import UserDict +except ImportError: + from UserDict import UserDict +try: + from collections import OrderedDict +except ImportError: + from ordereddict import OrderedDict +try: + from thread import get_ident +except ImportError: + try: + from _thread import get_ident + except ImportError: + from _dummy_thread import get_ident + + +def recursive_repr(fillvalue='...'): + 'Decorator to make a repr function return fillvalue for a recursive call' + + def decorating_function(user_function): + repr_running = set() + + def wrapper(self): + key = id(self), get_ident() + if key in repr_running: + return fillvalue + repr_running.add(key) + try: + result = user_function(self) + finally: + repr_running.discard(key) + return result + + # Can't use functools.wraps() here because of bootstrap issues + wrapper.__module__ = getattr(user_function, '__module__') + wrapper.__doc__ = getattr(user_function, '__doc__') + wrapper.__name__ = getattr(user_function, '__name__') + wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + return wrapper + + return decorating_function + + +class ChainMap(MutableMapping): + ''' A ChainMap groups multiple dicts (or other mappings) together + to create a single, updateable view. + + The underlying mappings are stored in a list. That list is public and can + accessed or updated using the *maps* attribute. There is no other state. + + Lookups search the underlying mappings successively until a key is found. + In contrast, writes, updates, and deletions only operate on the first + mapping. + + ''' + + def __init__(self, *maps): + '''Initialize a ChainMap by setting *maps* to the given mappings. + If no mappings are provided, a single empty dictionary is used. + + ''' + self.maps = list(maps) or [{}] # always at least one map + + def __missing__(self, key): + raise KeyError(key) + + def __getitem__(self, key): + for mapping in self.maps: + try: + return mapping[key] # can't use 'key in mapping' with defaultdict + except KeyError: + pass + return self.__missing__(key) # support subclasses that define __missing__ + + def get(self, key, default=None): + return self[key] if key in self else default + + def __len__(self): + return len(set().union(*self.maps)) # reuses stored hash values if possible + + def __iter__(self): + return iter(set().union(*self.maps)) + + def __contains__(self, key): + return any(key in m for m in self.maps) + + @recursive_repr() + def __repr__(self): + return '{0.__class__.__name__}({1})'.format( + self, ', '.join(map(repr, self.maps))) + + @classmethod + def fromkeys(cls, iterable, *args): + 'Create a ChainMap with a single dict created from the iterable.' + return cls(dict.fromkeys(iterable, *args)) + + def copy(self): + 'New ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]' + return self.__class__(self.maps[0].copy(), *self.maps[1:]) + + __copy__ = copy + + def new_child(self): # like Django's Context.push() + 'New ChainMap with a new dict followed by all previous maps.' + return self.__class__({}, *self.maps) + + @property + def parents(self): # like Django's Context.pop() + 'New ChainMap from maps[1:].' + return self.__class__(*self.maps[1:]) + + def __setitem__(self, key, value): + self.maps[0][key] = value + + def __delitem__(self, key): + try: + del self.maps[0][key] + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def popitem(self): + 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' + try: + return self.maps[0].popitem() + except KeyError: + raise KeyError('No keys found in the first mapping.') + + def pop(self, key, *args): + 'Remove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].' + try: + return self.maps[0].pop(key, *args) + except KeyError: + raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + + def clear(self): + 'Clear maps[0], leaving maps[1:] intact.' + self.maps[0].clear() + + +class MappingProxyType(UserDict): + def __init__(self, data): + UserDict.__init__(self) + self.data = data + + +def get_cache_token(): + return ABCMeta._abc_invalidation_counter + + + +class Support(object): + def dummy(self): + pass + + def cpython_only(self, func): + if 'PyPy' in sys.version: + return self.dummy + return func diff --git a/vendor/sqlalchemy_fulltext/__init__.py b/vendor/sqlalchemy_fulltext/__init__.py deleted file mode 100644 index a4cdc138..00000000 --- a/vendor/sqlalchemy_fulltext/__init__.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*-s -import re - -from sqlalchemy import event -from sqlalchemy.schema import DDL -from sqlalchemy.orm.mapper import Mapper -from sqlalchemy.ext.compiler import compiles -from sqlalchemy.sql.expression import ClauseElement -import modes as FullTextMode - -MYSQL = "mysql" -MYSQL_BUILD_INDEX_QUERY = u"""ALTER TABLE {0.__tablename__} ADD FULLTEXT ({1})""" -MYSQL_MATCH_AGAINST = u""" - MATCH ({0}) - AGAINST ("{1}" {2}) - """ - -def escape_quote(string): - return re.sub(r"[\"\']+", "", string) - - -class FullTextSearch(ClauseElement): - """ - Search FullText - :param against: the search query - :param table: the table needs to be query - - FullText support with in query, i.e. - >>> from sqlalchemy_fulltext import FullTextSearch - >>> session.query(Foo).filter(FullTextSearch('Spam', Foo)) - """ - def __init__(self, against, model, mode=FullTextMode.DEFAULT): - self.model = model - self.against = escape_quote(against) - self.mode = mode - -@compiles(FullTextSearch, MYSQL) -def __mysql_fulltext_search(element, compiler, **kw): - assert issubclass(element.model, FullText), "{0} not FullTextable".format(element.model) - return MYSQL_MATCH_AGAINST.format(",".join( - element.model.__fulltext_columns__), - element.against, - element.mode) - - -class FullText(object): - """ - FullText Minxin object for SQLAlchemy - - >>> from sqlalchemy_fulltext import FullText - >>> class Foo(FullText, Base): - >>> __fulltext_columns__ = ('spam', 'ham') - >>> ... - - fulltext search spam and ham now - """ - - __fulltext_columns__ = tuple() - - @classmethod - def build_fulltext(cls): - """ - build up fulltext index after table is created - """ - if FullText not in cls.__bases__: - return - assert cls.__fulltext_columns__, "Model:{0.__name__} No FullText columns defined".format(cls) - - event.listen(cls.__table__, - 'after_create', - DDL(MYSQL_BUILD_INDEX_QUERY.format(cls, - ", ".join((escape_quote(c) - for c in cls.__fulltext_columns__))) - ) - ) - """ - TODO: black magic in the future - @classmethod - @declared_attr - def __contains__(*arg): - return True - """ -def __build_fulltext_index(mapper, class_): - if issubclass(class_, FullText): - class_.build_fulltext() - - -event.listen(Mapper, 'instrument_class', __build_fulltext_index) diff --git a/vendor/sqlalchemy_fulltext/modes.py b/vendor/sqlalchemy_fulltext/modes.py deleted file mode 100644 index cd68605b..00000000 --- a/vendor/sqlalchemy_fulltext/modes.py +++ /dev/null @@ -1,4 +0,0 @@ -BOOLEAN='IN BOOLEAN MODE' -NATURAL='IN NATURAL LANGUAGE MODE' -QUERY_EXPANSION='WITH QUERY EXPANSION' -DEFAULT = '' \ No newline at end of file diff --git a/vendor/tornado/__init__.py b/vendor/tornado/__init__.py index de9f4548..6f4f47d2 100644 --- a/vendor/tornado/__init__.py +++ b/vendor/tornado/__init__.py @@ -25,5 +25,5 @@ from __future__ import absolute_import, division, print_function, with_statement # is zero for an official release, positive for a development branch, # or negative for a release candidate or beta (after the base version # number has been incremented) -version = "3.1.1" -version_info = (3, 1, 1, 0) +version = "4.1" +version_info = (4, 1, 0, 0) diff --git a/vendor/tornado/auth.py b/vendor/tornado/auth.py index 0cc707fd..ac2fd0d1 100644 --- a/vendor/tornado/auth.py +++ b/vendor/tornado/auth.py @@ -34,16 +34,29 @@ See the individual service classes below for complete documentation. Example usage for Google OpenID:: - class GoogleLoginHandler(tornado.web.RequestHandler, - tornado.auth.GoogleMixin): - @tornado.web.asynchronous + class GoogleOAuth2LoginHandler(tornado.web.RequestHandler, + tornado.auth.GoogleOAuth2Mixin): @tornado.gen.coroutine def get(self): - if self.get_argument("openid.mode", None): - user = yield self.get_authenticated_user() - # Save the user with e.g. set_secure_cookie() + if self.get_argument('code', False): + user = yield self.get_authenticated_user( + redirect_uri='http://your.site.com/auth/google', + code=self.get_argument('code')) + # Save the user with e.g. set_secure_cookie else: - yield self.authenticate_redirect() + yield self.authorize_redirect( + redirect_uri='http://your.site.com/auth/google', + client_id=self.settings['google_oauth']['key'], + scope=['profile', 'email'], + response_type='code', + extra_params={'approval_prompt': 'auto'}) + +.. versionchanged:: 4.0 + All of the callback interfaces in this module are now guaranteed + to run their callback with an argument of ``None`` on error. + Previously some functions would do this while others would simply + terminate the request on their own. This change also ensures that + errors are more consistently reported through the ``Future`` interfaces. """ from __future__ import absolute_import, division, print_function, with_statement @@ -56,13 +69,14 @@ import hmac import time import uuid -from tornado.concurrent import Future, chain_future, return_future +from tornado.concurrent import TracebackFuture, chain_future, return_future from tornado import gen from tornado import httpclient from tornado import escape from tornado.httputil import url_concat from tornado.log import gen_log -from tornado.util import bytes_type, u, unicode_type, ArgReplacer +from tornado.stack_context import ExceptionStackContext +from tornado.util import u, unicode_type, ArgReplacer try: import urlparse # py2 @@ -74,6 +88,11 @@ try: except ImportError: import urllib as urllib_parse # py2 +try: + long # py2 +except NameError: + long = int # py3 + class AuthError(Exception): pass @@ -99,12 +118,19 @@ def _auth_return_future(f): @functools.wraps(f) def wrapper(*args, **kwargs): - future = Future() + future = TracebackFuture() callback, args, kwargs = replacer.replace(future, args, kwargs) if callback is not None: future.add_done_callback( functools.partial(_auth_future_to_callback, callback)) - f(*args, **kwargs) + def handle_exception(typ, value, tb): + if future.done(): + return False + else: + future.set_exc_info((typ, value, tb)) + return True + with ExceptionStackContext(handle_exception): + f(*args, **kwargs) return future return wrapper @@ -162,7 +188,7 @@ class OpenIdMixin(object): url = self._OPENID_ENDPOINT if http_client is None: http_client = self.get_auth_http_client() - http_client.fetch(url, self.async_callback( + http_client.fetch(url, functools.partial( self._on_authentication_verified, callback), method="POST", body=urllib_parse.urlencode(args)) @@ -307,7 +333,7 @@ class OAuthMixin(object): The ``callback_uri`` may be omitted if you have previously registered a callback URI with the third-party service. For - some sevices (including Friendfeed), you must use a + some services (including Friendfeed), you must use a previously-registered callback URI and cannot specify a callback via this method. @@ -334,7 +360,7 @@ class OAuthMixin(object): http_client.fetch( self._oauth_request_token_url(callback_uri=callback_uri, extra_params=extra_params), - self.async_callback( + functools.partial( self._on_request_token, self._OAUTH_AUTHORIZE_URL, callback_uri, @@ -342,7 +368,7 @@ class OAuthMixin(object): else: http_client.fetch( self._oauth_request_token_url(), - self.async_callback( + functools.partial( self._on_request_token, self._OAUTH_AUTHORIZE_URL, callback_uri, callback)) @@ -379,7 +405,7 @@ class OAuthMixin(object): if http_client is None: http_client = self.get_auth_http_client() http_client.fetch(self._oauth_access_token_url(token), - self.async_callback(self._on_access_token, callback)) + functools.partial(self._on_access_token, callback)) def _oauth_request_token_url(self, callback_uri=None, extra_params=None): consumer_token = self._oauth_consumer_token() @@ -456,7 +482,7 @@ class OAuthMixin(object): access_token = _oauth_parse_response(response.body) self._oauth_get_user_future(access_token).add_done_callback( - self.async_callback(self._on_oauth_get_user, access_token, future)) + functools.partial(self._on_oauth_get_user, access_token, future)) def _oauth_consumer_token(self): """Subclasses must override this to return their OAuth consumer keys. @@ -549,7 +575,7 @@ class OAuth2Mixin(object): @return_future def authorize_redirect(self, redirect_uri=None, client_id=None, client_secret=None, extra_params=None, - callback=None): + callback=None, scope=None, response_type="code"): """Redirects the user to obtain OAuth authorization for this service. Some providers require that you register a redirect URL with @@ -566,10 +592,13 @@ class OAuth2Mixin(object): """ args = { "redirect_uri": redirect_uri, - "client_id": client_id + "client_id": client_id, + "response_type": response_type } if extra_params: args.update(extra_params) + if scope: + args['scope'] = ' '.join(scope) self.redirect( url_concat(self._OAUTH_AUTHORIZE_URL, args)) callback() @@ -604,7 +633,6 @@ class TwitterMixin(OAuthMixin): class TwitterLoginHandler(tornado.web.RequestHandler, tornado.auth.TwitterMixin): - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): if self.get_argument("oauth_token", None): @@ -639,7 +667,7 @@ class TwitterMixin(OAuthMixin): """ http = self.get_auth_http_client() http.fetch(self._oauth_request_token_url(callback_uri=callback_uri), - self.async_callback( + functools.partial( self._on_request_token, self._OAUTH_AUTHENTICATE_URL, None, callback)) @@ -666,7 +694,6 @@ class TwitterMixin(OAuthMixin): class MainHandler(tornado.web.RequestHandler, tornado.auth.TwitterMixin): @tornado.web.authenticated - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): new_entry = yield self.twitter_request( @@ -698,7 +725,7 @@ class TwitterMixin(OAuthMixin): if args: url += "?" + urllib_parse.urlencode(args) http = self.get_auth_http_client() - http_callback = self.async_callback(self._on_twitter_request, callback) + http_callback = functools.partial(self._on_twitter_request, callback) if post_args is not None: http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), callback=http_callback) @@ -745,7 +772,6 @@ class FriendFeedMixin(OAuthMixin): class FriendFeedLoginHandler(tornado.web.RequestHandler, tornado.auth.FriendFeedMixin): - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): if self.get_argument("oauth_token", None): @@ -790,7 +816,6 @@ class FriendFeedMixin(OAuthMixin): class MainHandler(tornado.web.RequestHandler, tornado.auth.FriendFeedMixin): @tornado.web.authenticated - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): new_entry = yield self.friendfeed_request( @@ -817,7 +842,7 @@ class FriendFeedMixin(OAuthMixin): args.update(oauth) if args: url += "?" + urllib_parse.urlencode(args) - callback = self.async_callback(self._on_friendfeed_request, callback) + callback = functools.partial(self._on_friendfeed_request, callback) http = self.get_auth_http_client() if post_args is not None: http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), @@ -858,6 +883,11 @@ class FriendFeedMixin(OAuthMixin): class GoogleMixin(OpenIdMixin, OAuthMixin): """Google Open ID / OAuth authentication. + .. deprecated:: 4.0 + New applications should use `GoogleOAuth2Mixin` + below instead of this class. As of May 19, 2014, Google has stopped + supporting registration-free authentication. + No application registration is necessary to use Google for authentication or to access Google resources on behalf of a user. @@ -874,7 +904,6 @@ class GoogleMixin(OpenIdMixin, OAuthMixin): class GoogleLoginHandler(tornado.web.RequestHandler, tornado.auth.GoogleMixin): - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): if self.get_argument("openid.mode", None): @@ -929,7 +958,7 @@ class GoogleMixin(OpenIdMixin, OAuthMixin): http = self.get_auth_http_client() token = dict(key=token, secret="") http.fetch(self._oauth_access_token_url(token), - self.async_callback(self._on_access_token, callback)) + functools.partial(self._on_access_token, callback)) else: chain_future(OpenIdMixin.get_authenticated_user(self), callback) @@ -945,12 +974,90 @@ class GoogleMixin(OpenIdMixin, OAuthMixin): return OpenIdMixin.get_authenticated_user(self) +class GoogleOAuth2Mixin(OAuth2Mixin): + """Google authentication using OAuth2. + + In order to use, register your application with Google and copy the + relevant parameters to your application settings. + + * Go to the Google Dev Console at http://console.developers.google.com + * Select a project, or create a new one. + * In the sidebar on the left, select APIs & Auth. + * In the list of APIs, find the Google+ API service and set it to ON. + * In the sidebar on the left, select Credentials. + * In the OAuth section of the page, select Create New Client ID. + * Set the Redirect URI to point to your auth handler + * Copy the "Client secret" and "Client ID" to the application settings as + {"google_oauth": {"key": CLIENT_ID, "secret": CLIENT_SECRET}} + + .. versionadded:: 3.2 + """ + _OAUTH_AUTHORIZE_URL = "https://accounts.google.com/o/oauth2/auth" + _OAUTH_ACCESS_TOKEN_URL = "https://accounts.google.com/o/oauth2/token" + _OAUTH_NO_CALLBACKS = False + _OAUTH_SETTINGS_KEY = 'google_oauth' + + @_auth_return_future + def get_authenticated_user(self, redirect_uri, code, callback): + """Handles the login for the Google user, returning a user object. + + Example usage:: + + class GoogleOAuth2LoginHandler(tornado.web.RequestHandler, + tornado.auth.GoogleOAuth2Mixin): + @tornado.gen.coroutine + def get(self): + if self.get_argument('code', False): + user = yield self.get_authenticated_user( + redirect_uri='http://your.site.com/auth/google', + code=self.get_argument('code')) + # Save the user with e.g. set_secure_cookie + else: + yield self.authorize_redirect( + redirect_uri='http://your.site.com/auth/google', + client_id=self.settings['google_oauth']['key'], + scope=['profile', 'email'], + response_type='code', + extra_params={'approval_prompt': 'auto'}) + """ + http = self.get_auth_http_client() + body = urllib_parse.urlencode({ + "redirect_uri": redirect_uri, + "code": code, + "client_id": self.settings[self._OAUTH_SETTINGS_KEY]['key'], + "client_secret": self.settings[self._OAUTH_SETTINGS_KEY]['secret'], + "grant_type": "authorization_code", + }) + + http.fetch(self._OAUTH_ACCESS_TOKEN_URL, + functools.partial(self._on_access_token, callback), + method="POST", headers={'Content-Type': 'application/x-www-form-urlencoded'}, body=body) + + def _on_access_token(self, future, response): + """Callback function for the exchange to the access token.""" + if response.error: + future.set_exception(AuthError('Google auth error: %s' % str(response))) + return + + args = escape.json_decode(response.body) + future.set_result(args) + + def get_auth_http_client(self): + """Returns the `.AsyncHTTPClient` instance to be used for auth requests. + + May be overridden by subclasses to use an HTTP client other than + the default. + """ + return httpclient.AsyncHTTPClient() + + class FacebookMixin(object): """Facebook Connect authentication. - *Deprecated:* New applications should use `FacebookGraphMixin` - below instead of this class. This class does not support the - Future-based interface seen on other classes in this module. + .. deprecated:: 1.1 + New applications should use `FacebookGraphMixin` + below instead of this class. This class does not support the + Future-based interface seen on other classes in this module. To authenticate with Facebook, register your application with Facebook at http://www.facebook.com/developers/apps.php. Then @@ -965,7 +1072,7 @@ class FacebookMixin(object): @tornado.web.asynchronous def get(self): if self.get_argument("session", None): - self.get_authenticated_user(self.async_callback(self._on_auth)) + self.get_authenticated_user(self._on_auth) return yield self.authenticate_redirect() @@ -1005,7 +1112,7 @@ class FacebookMixin(object): args["cancel_url"] = urlparse.urljoin( self.request.full_url(), cancel_uri) if extended_permissions: - if isinstance(extended_permissions, (unicode_type, bytes_type)): + if isinstance(extended_permissions, (unicode_type, bytes)): extended_permissions = [extended_permissions] args["req_perms"] = ",".join(extended_permissions) self.redirect("http://www.facebook.com/login.php?" + @@ -1051,7 +1158,7 @@ class FacebookMixin(object): session = escape.json_decode(self.get_argument("session")) self.facebook_request( method="facebook.users.getInfo", - callback=self.async_callback( + callback=functools.partial( self._on_get_user_info, callback, session), session_key=session["session_key"], uids=session["uid"], @@ -1077,7 +1184,7 @@ class FacebookMixin(object): def get(self): self.facebook_request( method="stream.get", - callback=self.async_callback(self._on_stream), + callback=self._on_stream, session_key=self.current_user["session_key"]) def _on_stream(self, stream): @@ -1101,7 +1208,7 @@ class FacebookMixin(object): url = "http://api.facebook.com/restserver.php?" + \ urllib_parse.urlencode(args) http = self.get_auth_http_client() - http.fetch(url, callback=self.async_callback( + http.fetch(url, callback=functools.partial( self._parse_response, callback)) def _on_get_user_info(self, callback, session, users): @@ -1158,7 +1265,7 @@ class FacebookMixin(object): class FacebookGraphMixin(OAuth2Mixin): """Facebook authentication using the new Graph API and OAuth2.""" _OAUTH_ACCESS_TOKEN_URL = "https://graph.facebook.com/oauth/access_token?" - _OAUTH_AUTHORIZE_URL = "https://graph.facebook.com/oauth/authorize?" + _OAUTH_AUTHORIZE_URL = "https://www.facebook.com/dialog/oauth?" _OAUTH_NO_CALLBACKS = False _FACEBOOK_BASE_URL = "https://graph.facebook.com" @@ -1170,7 +1277,6 @@ class FacebookGraphMixin(OAuth2Mixin): Example usage:: class FacebookGraphLoginHandler(LoginHandler, tornado.auth.FacebookGraphMixin): - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): if self.get_argument("code", False): @@ -1200,7 +1306,7 @@ class FacebookGraphMixin(OAuth2Mixin): fields.update(extra_fields) http.fetch(self._oauth_request_token_url(**args), - self.async_callback(self._on_access_token, redirect_uri, client_id, + functools.partial(self._on_access_token, redirect_uri, client_id, client_secret, callback, fields)) def _on_access_token(self, redirect_uri, client_id, client_secret, @@ -1217,7 +1323,7 @@ class FacebookGraphMixin(OAuth2Mixin): self.facebook_request( path="/me", - callback=self.async_callback( + callback=functools.partial( self._on_get_user_info, future, session, fields), access_token=session["access_token"], fields=",".join(fields) @@ -1257,7 +1363,6 @@ class FacebookGraphMixin(OAuth2Mixin): class MainHandler(tornado.web.RequestHandler, tornado.auth.FacebookGraphMixin): @tornado.web.authenticated - @tornado.web.asynchronous @tornado.gen.coroutine def get(self): new_entry = yield self.facebook_request( @@ -1285,7 +1390,7 @@ class FacebookGraphMixin(OAuth2Mixin): if all_args: url += "?" + urllib_parse.urlencode(all_args) - callback = self.async_callback(self._on_facebook_request, callback) + callback = functools.partial(self._on_facebook_request, callback) http = self.get_auth_http_client() if post_args is not None: http.fetch(url, method="POST", body=urllib_parse.urlencode(post_args), diff --git a/vendor/tornado/autoreload.py b/vendor/tornado/autoreload.py index 05754299..a548cf02 100644 --- a/vendor/tornado/autoreload.py +++ b/vendor/tornado/autoreload.py @@ -14,13 +14,17 @@ # License for the specific language governing permissions and limitations # under the License. -"""xAutomatically restart the server when a source file is modified. +"""Automatically restart the server when a source file is modified. -Most applications should not access this module directly. Instead, pass the -keyword argument ``debug=True`` to the `tornado.web.Application` constructor. -This will enable autoreload mode as well as checking for changes to templates -and static resources. Note that restarting is a destructive operation -and any requests in progress will be aborted when the process restarts. +Most applications should not access this module directly. Instead, +pass the keyword argument ``autoreload=True`` to the +`tornado.web.Application` constructor (or ``debug=True``, which +enables this setting and several others). This will enable autoreload +mode as well as checking for changes to templates and static +resources. Note that restarting is a destructive operation and any +requests in progress will be aborted when the process restarts. (If +you want to disable autoreload while using other debug-mode features, +pass both ``debug=True`` and ``autoreload=False``). This module can also be used as a command-line wrapper around scripts such as unit test runners. See the `main` method for details. @@ -38,6 +42,7 @@ Reloading loses any Python interpreter command-line arguments (e.g. ``-u``) because it re-executes Python using ``sys.executable`` and ``sys.argv``. Additionally, modifying these variables will cause reloading to behave incorrectly. + """ from __future__ import absolute_import, division, print_function, with_statement @@ -103,7 +108,11 @@ _io_loops = weakref.WeakKeyDictionary() def start(io_loop=None, check_time=500): - """Begins watching source files for changes using the given `.IOLoop`. """ + """Begins watching source files for changes. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. + """ io_loop = io_loop or ioloop.IOLoop.current() if io_loop in _io_loops: return diff --git a/vendor/tornado/ca-certificates.crt b/vendor/tornado/ca-certificates.crt deleted file mode 100644 index 26971c8b..00000000 --- a/vendor/tornado/ca-certificates.crt +++ /dev/null @@ -1,3576 +0,0 @@ -# This file contains certificates of known certificate authorities -# for use with SimpleAsyncHTTPClient. -# -# It was copied from /etc/ssl/certs/ca-certificates.crt -# on a stock install of Ubuntu 11.04 (ca-certificates package -# version 20090814+nmu2ubuntu0.1). This data file is licensed -# under the MPL/GPL. ------BEGIN CERTIFICATE----- -MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx -EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h -bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy -YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp -Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy -MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG -A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt -YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD -VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB -IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA -isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj -Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50 -QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt -bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR -yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID -AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0 -cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f -BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj -cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB -/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1 -U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl -YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos -SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/ -t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u -mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb -K+9A46sd33oqK8n8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHPTCCBSWgAwIBAgIBADANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wMzAzMzAxMjI5NDlaFw0zMzAzMjkxMjI5NDlaMHkxEDAO -BgNVBAoTB1Jvb3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEi -MCAGA1UEAxMZQ0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJ -ARYSc3VwcG9ydEBjYWNlcnQub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAziLA4kZ97DYoB1CW8qAzQIxL8TtmPzHlawI229Z89vGIj053NgVBlfkJ -8BLPRoZzYLdufujAWGSuzbCtRRcMY/pnCujW0r8+55jE8Ez64AO7NV1sId6eINm6 -zWYyN3L69wj1x81YyY7nDl7qPv4coRQKFWyGhFtkZip6qUtTefWIonvuLwphK42y -fk1WpRPs6tqSnqxEQR5YYGUFZvjARL3LlPdCfgv3ZWiYUQXw8wWRBB0bF4LsyFe7 -w2t6iPGwcswlWyCR7BYCEo8y6RcYSNDHBS4CMEK4JZwFaz+qOqfrU0j36NK2B5jc -G8Y0f3/JHIJ6BVgrCFvzOKKrF11myZjXnhCLotLddJr3cQxyYN/Nb5gznZY0dj4k -epKwDpUeb+agRThHqtdB7Uq3EvbXG4OKDy7YCbZZ16oE/9KTfWgu3YtLq1i6L43q -laegw1SJpfvbi1EinbLDvhG+LJGGi5Z4rSDTii8aP8bQUWWHIbEZAWV/RRyH9XzQ -QUxPKZgh/TMfdQwEUfoZd9vUFBzugcMd9Zi3aQaRIt0AUMyBMawSB3s42mhb5ivU -fslfrejrckzzAeVLIL+aplfKkQABi6F1ITe1Yw1nPkZPcCBnzsXWWdsC4PDSy826 -YreQQejdIOQpvGQpQsgi3Hia/0PsmBsJUUtaWsJx8cTLc6nloQsCAwEAAaOCAc4w -ggHKMB0GA1UdDgQWBBQWtTIb1Mfz4OaO873SsDrusjkY0TCBowYDVR0jBIGbMIGY -gBQWtTIb1Mfz4OaO873SsDrusjkY0aF9pHsweTEQMA4GA1UEChMHUm9vdCBDQTEe -MBwGA1UECxMVaHR0cDovL3d3dy5jYWNlcnQub3JnMSIwIAYDVQQDExlDQSBDZXJ0 -IFNpZ25pbmcgQXV0aG9yaXR5MSEwHwYJKoZIhvcNAQkBFhJzdXBwb3J0QGNhY2Vy -dC5vcmeCAQAwDwYDVR0TAQH/BAUwAwEB/zAyBgNVHR8EKzApMCegJaAjhiFodHRw -czovL3d3dy5jYWNlcnQub3JnL3Jldm9rZS5jcmwwMAYJYIZIAYb4QgEEBCMWIWh0 -dHBzOi8vd3d3LmNhY2VydC5vcmcvcmV2b2tlLmNybDA0BglghkgBhvhCAQgEJxYl -aHR0cDovL3d3dy5jYWNlcnQub3JnL2luZGV4LnBocD9pZD0xMDBWBglghkgBhvhC -AQ0ESRZHVG8gZ2V0IHlvdXIgb3duIGNlcnRpZmljYXRlIGZvciBGUkVFIGhlYWQg -b3ZlciB0byBodHRwOi8vd3d3LmNhY2VydC5vcmcwDQYJKoZIhvcNAQEEBQADggIB -ACjH7pyCArpcgBLKNQodgW+JapnM8mgPf6fhjViVPr3yBsOQWqy1YPaZQwGjiHCc -nWKdpIevZ1gNMDY75q1I08t0AoZxPuIrA2jxNGJARjtT6ij0rPtmlVOKTV39O9lg -18p5aTuxZZKmxoGCXJzN600BiqXfEVWqFcofN8CCmHBh22p8lqOOLlQ+TyGpkO/c -gr/c6EWtTZBzCDyUZbAEmXZ/4rzCahWqlwQ3JNgelE5tDlG+1sSPypZt90Pf6DBl -Jzt7u0NDY8RD97LsaMzhGY4i+5jhe1o+ATc7iwiwovOVThrLm82asduycPAtStvY -sONvRUgzEv/+PDIqVPfE94rwiCPCR/5kenHA0R6mY7AHfqQv0wGP3J8rtsYIqQ+T -SCX8Ev2fQtzzxD72V7DX3WnRBnc0CkvSyqD/HMaMyRa+xMwyN2hzXwj7UfdJUzYF -CpUCTPJ5GhD22Dp1nPMd8aINcGeGG7MW9S/lpOt5hvk9C8JzC6WZrG/8Z7jlLwum -GCSNe9FINSkYQKyTYOGWhlC0elnYjyELn8+CkcY7v2vcB5G5l1YjqrZslMZIBjzk -zk6q5PYvCdxTby78dOs6Y5nCpqyJvKeyRKANihDjbPIky/qbn3BHLt4Ui9SyIAmW -omTxJBzcoTWcFbLUvFUufQb1nA5V9FrWk9p2rSVzTMVD ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGCDCCA/CgAwIBAgIBATANBgkqhkiG9w0BAQQFADB5MRAwDgYDVQQKEwdSb290 -IENBMR4wHAYDVQQLExVodHRwOi8vd3d3LmNhY2VydC5vcmcxIjAgBgNVBAMTGUNB -IENlcnQgU2lnbmluZyBBdXRob3JpdHkxITAfBgkqhkiG9w0BCQEWEnN1cHBvcnRA -Y2FjZXJ0Lm9yZzAeFw0wNTEwMTQwNzM2NTVaFw0zMzAzMjgwNzM2NTVaMFQxFDAS -BgNVBAoTC0NBY2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5v -cmcxHDAaBgNVBAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwggIiMA0GCSqGSIb3DQEB -AQUAA4ICDwAwggIKAoICAQCrSTURSHzSJn5TlM9Dqd0o10Iqi/OHeBlYfA+e2ol9 -4fvrcpANdKGWZKufoCSZc9riVXbHF3v1BKxGuMO+f2SNEGwk82GcwPKQ+lHm9WkB -Y8MPVuJKQs/iRIwlKKjFeQl9RrmK8+nzNCkIReQcn8uUBByBqBSzmGXEQ+xOgo0J -0b2qW42S0OzekMV/CsLj6+YxWl50PpczWejDAz1gM7/30W9HxM3uYoNSbi4ImqTZ -FRiRpoWSR7CuSOtttyHshRpocjWr//AQXcD0lKdq1TuSfkyQBX6TwSyLpI5idBVx -bgtxA+qvFTia1NIFcm+M+SvrWnIl+TlG43IbPgTDZCciECqKT1inA62+tC4T7V2q -SNfVfdQqe1z6RgRQ5MwOQluM7dvyz/yWk+DbETZUYjQ4jwxgmzuXVjit89Jbi6Bb -6k6WuHzX1aCGcEDTkSm3ojyt9Yy7zxqSiuQ0e8DYbF/pCsLDpyCaWt8sXVJcukfV -m+8kKHA4IC/VfynAskEDaJLM4JzMl0tF7zoQCqtwOpiVcK01seqFK6QcgCExqa5g -eoAmSAC4AcCTY1UikTxW56/bOiXzjzFU6iaLgVn5odFTEcV7nQP2dBHgbbEsPyyG -kZlxmqZ3izRg0RS0LKydr4wQ05/EavhvE/xzWfdmQnQeiuP43NJvmJzLR5iVQAX7 -6QIDAQABo4G/MIG8MA8GA1UdEwEB/wQFMAMBAf8wXQYIKwYBBQUHAQEEUTBPMCMG -CCsGAQUFBzABhhdodHRwOi8vb2NzcC5DQWNlcnQub3JnLzAoBggrBgEFBQcwAoYc -aHR0cDovL3d3dy5DQWNlcnQub3JnL2NhLmNydDBKBgNVHSAEQzBBMD8GCCsGAQQB -gZBKMDMwMQYIKwYBBQUHAgEWJWh0dHA6Ly93d3cuQ0FjZXJ0Lm9yZy9pbmRleC5w -aHA/aWQ9MTAwDQYJKoZIhvcNAQEEBQADggIBAH8IiKHaGlBJ2on7oQhy84r3HsQ6 -tHlbIDCxRd7CXdNlafHCXVRUPIVfuXtCkcKZ/RtRm6tGpaEQU55tiKxzbiwzpvD0 -nuB1wT6IRanhZkP+VlrRekF490DaSjrxC1uluxYG5sLnk7mFTZdPsR44Q4Dvmw2M -77inYACHV30eRBzLI++bPJmdr7UpHEV5FpZNJ23xHGzDwlVks7wU4vOkHx4y/CcV -Bc/dLq4+gmF78CEQGPZE6lM5+dzQmiDgxrvgu1pPxJnIB721vaLbLmINQjRBvP+L -ivVRIqqIMADisNS8vmW61QNXeZvo3MhN+FDtkaVSKKKs+zZYPumUK5FQhxvWXtaM -zPcPEAxSTtAWYeXlCmy/F8dyRlecmPVsYGN6b165Ti/Iubm7aoW8mA3t+T6XhDSU -rgCvoeXnkm5OvfPi2RSLXNLrAWygF6UtEOucekq9ve7O/e0iQKtwOIj1CodqwqsF -YMlIBdpTwd5Ed2qz8zw87YC8pjhKKSRf/lk7myV6VmMAZLldpGJ9VzZPrYPvH5JT -oI53V93lYRE9IwCQTDz6o2CTBKOvNfYOao9PSmCnhQVsRqGP9Md246FZV/dxssRu -FFxtbUFm3xuTsdQAw+7Lzzw9IYCpX2Nl/N3gX6T0K/CFcUHUZyX7GrGXrtaZghNB -0m6lG5kngOcLqagA ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIESzCCAzOgAwIBAgIJAJigUTEEXRQpMA0GCSqGSIb3DQEBBQUAMHYxCzAJBgNV -BAYTAkRFMQ8wDQYDVQQIEwZIZXNzZW4xDjAMBgNVBAcTBUZ1bGRhMRAwDgYDVQQK -EwdEZWJjb25mMRMwEQYDVQQDEwpEZWJjb25mIENBMR8wHQYJKoZIhvcNAQkBFhBq -b2VyZ0BkZWJpYW4ub3JnMB4XDTA1MTEwNTE3NTUxNFoXDTE1MTEwMzE3NTUxNFow -djELMAkGA1UEBhMCREUxDzANBgNVBAgTBkhlc3NlbjEOMAwGA1UEBxMFRnVsZGEx -EDAOBgNVBAoTB0RlYmNvbmYxEzARBgNVBAMTCkRlYmNvbmYgQ0ExHzAdBgkqhkiG -9w0BCQEWEGpvZXJnQGRlYmlhbi5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCvbOo0SrIwI5IMlsshH8WF3dHB9r9JlSKhMPaybawa1EyvZspMQ3wa -F5qxNf3Sj+NElEmjseEqvCZiIIzqwerHu0Qw62cDYCdCd2+Wb5m0bPYB5CGHiyU1 -eNP0je42O0YeXG2BvUujN8AviocVo39X2YwNQ0ryy4OaqYgm2pRlbtT2ESbF+SfV -Y2iqQj/f8ymF+lHo/pz8tbAqxWcqaSiHFAVQJrdqtFhtoodoNiE3q76zJoUkZTXB -k60Yc3MJSnatZCpnsSBr/D7zpntl0THrUjjtdRWCjQVhqfhM1yZJV+ApbLdheFh0 -ZWlSxdnp25p0q0XYw/7G92ELyFDfBUUNAgMBAAGjgdswgdgwHQYDVR0OBBYEFMuV -dFNb4mCWUFbcP5LOtxFLrEVTMIGoBgNVHSMEgaAwgZ2AFMuVdFNb4mCWUFbcP5LO -txFLrEVToXqkeDB2MQswCQYDVQQGEwJERTEPMA0GA1UECBMGSGVzc2VuMQ4wDAYD -VQQHEwVGdWxkYTEQMA4GA1UEChMHRGViY29uZjETMBEGA1UEAxMKRGViY29uZiBD -QTEfMB0GCSqGSIb3DQEJARYQam9lcmdAZGViaWFuLm9yZ4IJAJigUTEEXRQpMAwG -A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAGZXxHg4mnkvilRIM1EQfGdY -S5b/WcyF2MYSTeTvK4aIB6VHwpZoZCnDGj2m2D3CkHT0upAD9o0zM1tdsfncLzV+ -mDT/jNmBtYo4QXx5vEPwvEIcgrWjwk7SyaEUhZjtolTkHB7ACl0oD0r71St4iEPR -qTUCEXk2E47bg1Fz58wNt/yo2+4iqiRjg1XCH4evkQuhpW+dTZnDyFNqwSYZapOE -TBA+9zBb6xD1KM2DdY7r4GiyYItN0BKLfuWbh9LXGbl1C+f4P11g+m2MPiavIeCe -1iazG5pcS3KoTLACsYlEX24TINtg4kcuS81XdllcnsV3Kdts0nIqPj6uhTTZD0k= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvjCCA3ygAwIBAgIFJQaThoEwCwYHKoZIzjgEAwUAMIGFMQswCQYDVQQGEwJG -UjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYDVQQHEwVQYXJpczEQMA4GA1UEChMHUE0v -U0dETjEOMAwGA1UECxMFRENTU0kxDjAMBgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcN -AQkBFhRpZ2NhQHNnZG4ucG0uZ291di5mcjAeFw0wMjEyMTMxNDM5MTVaFw0yMDEw -MTcxNDM5MTRaMIGFMQswCQYDVQQGEwJGUjEPMA0GA1UECBMGRnJhbmNlMQ4wDAYD -VQQHEwVQYXJpczEQMA4GA1UEChMHUE0vU0dETjEOMAwGA1UECxMFRENTU0kxDjAM -BgNVBAMTBUlHQy9BMSMwIQYJKoZIhvcNAQkBFhRpZ2NhQHNnZG4ucG0uZ291di5m -cjCCAbYwggErBgcqhkjOOAQBMIIBHgKBgQCFkMImdk9zDzJfTO4XPdAAmLbAdWws -ZiEMZh19RyTo3CyhFqO77OIXrwY6vc1pcc3MgWJ0dgQpAgrDMtmFFxpUu4gmjVsx -8GpxQC+4VOgLY8Cvmcd/UDzYg07EIRto8BwCpPJ/JfUxwzV2V3N713aAX+cEoKZ/ -s+kgxC6nZCA7oQIVALME/JYjkdW2uKIGngsEPbXAjdhDAoGADh/uqWJx94UBm31c -9d8ZTBfRGRnmSSRVFDgPWgA69JD4BR5da8tKz+1HjfMhDXljbMH86ixpD5Ka1Z0V -pRYUPbyAoB37tsmXMJY7kjyD19d5VdaZboUjVvhH6UJy5lpNNNGSvFl4fqkxyvw+ -pq1QV0N5RcvK120hlXdfHUX+YKYDgYQAAoGAQGr7IuKJcYIvJRMjxwl43KxXY2xC -aoCiM/bv117MfI94aNf1UusGhp7CbYAY9CXuL60P0oPMAajbaTE5Z34AuITeHq3Y -CNMHwxalip8BHqSSGmGiQsXeK7T+r1rPXsccZ1c5ikGDZ4xn5gUaCyy2rCmb+fOJ -6VAfCbAbAjmNKwejdzB1MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgFGMBUG -A1UdIAQOMAwwCgYIKoF6AXkBAQEwHQYDVR0OBBYEFPkeNRcUf8idzpKblYbLNxs0 -MQhSMB8GA1UdIwQYMBaAFPkeNRcUf8idzpKblYbLNxs0MQhSMAsGByqGSM44BAMF -AAMvADAsAhRVh+CJA5eVyEYU5AO9Tm7GxX0rmQIUBCqsU5u1WxoZ5lEXicDX5/Ob -sRQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT -AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ -TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG -9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw -MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM -BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO -MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2 -LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI -s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2 -xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4 -u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b -F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx -Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd -PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV -HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx -NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF -AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ -L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY -YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg -Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a -NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R -0982gaEbeC9xs/FZTEYYKKuF0mBWWg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw -gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv -bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv -b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05 -OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG -A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N -LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB -FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM -0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG -PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU -LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs -iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU -+/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB -Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k -qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir -vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ -w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8 -eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/ -O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs -IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290 -MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux -FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h -bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v -dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt -H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9 -uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX -mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX -a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN -E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0 -WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD -VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0 -Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU -cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx -IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN -AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH -YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 -6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC -Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX -c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a -mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw -MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML -QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD -VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA -A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul -CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n -tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl -dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch -PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC -+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O -BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl -MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk -ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB -IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X -7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz -43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY -eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl -pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA -WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx -MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB -ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV -BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC -AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV -6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX -GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP -dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH -1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF -62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW -BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw -AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL -MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU -cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv -b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6 -IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/ -iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao -GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh -4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm -XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU -MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3 -b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1 -MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK -EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh -BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq -xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G -87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i -2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U -WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1 -0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G -A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr -pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL -ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm -aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv -hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm -hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X -dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3 -P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y -iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no -xqE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk -hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym -1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW -OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb -2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko -O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw -AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU -AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB -BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF -Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb -LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir -oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C -MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds -sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP -bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2 -MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft -ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg -Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP -ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC -206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci -KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2 -JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9 -BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e -Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B -PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67 -Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq -Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ -o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3 -+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj -YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj -FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE -AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn -xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2 -LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc -obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8 -CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe -IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA -DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F -AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX -Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb -AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl -Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw -RY8mkaKO/qk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1 -MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw -DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U -0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI -TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf -RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF -zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh -BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA -AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY -PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/ -BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn -9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT -Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF -Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX -n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW -H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx -HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh -IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz -NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg -SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M -IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw -DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ -7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb -m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY -xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ -YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq -JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx -I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz -kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh -EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S -Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM -gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu -rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO -1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu -h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP -yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q -7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT -RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ -ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB -M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ -my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO -AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT -9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H -hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5 -fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ -RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD -VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX -DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y -ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy -VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr -mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr -IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK -mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu -XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy -dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye -jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1 -BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3 -DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92 -9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx -jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0 -Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz -ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS -R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq -YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy -MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk -MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl -ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i -805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6 -l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B -FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp -kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7 -eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa -MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A -AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig -dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu -dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk -IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g -UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l -bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl -LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k -ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By -b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc -cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud -DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA -WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6 -7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY -gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb -4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9 -CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX -VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD -QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX -DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl -ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU -ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT -CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P -6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM -jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX -2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N -R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j -rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV -HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa -gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1 -bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0 -ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy -YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl -ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl -cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0 -L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx -CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV -HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ -KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo -Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2 -jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe -1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5 -mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc -tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq -YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy -MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk -MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl -ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO -K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD -d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj -DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe -yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt -VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB -MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI -KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp -ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug -b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0 -aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg -Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0 -cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF -BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz -L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug -eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv -b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w -bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw -ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA -FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw -qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE -kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ -5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB -evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz -ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k -XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh -xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi -MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB -czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp -b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli -ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm -YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn -HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I -1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk -tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU -GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er -cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY -MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+ -AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j -b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB -OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh -dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu -IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl -LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS -ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo -ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w -cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME -GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt -z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g -6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK -mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd -LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb -J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3 -SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg -b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa -MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB -ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw -IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B -AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb -unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d -BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq -7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3 -0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX -roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG -A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j -aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p -26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA -BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud -EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN -BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz -aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB -AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd -p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi -1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc -XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0 -eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu -tGWaIZDgqtCYvDi1czyL+Nw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn -MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL -ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo -YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9 -MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy -NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G -A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA -A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0 -Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s -QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV -eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795 -B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh -z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T -AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i -ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w -TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH -MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD -VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE -VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh -bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B -AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM -bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi -ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG -VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c -ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/ -AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw -PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz -cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9 -MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz -IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ -ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR -VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL -kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd -EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas -H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0 -HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud -DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4 -QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu -Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/ -AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8 -yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR -FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA -ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB -kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 -l7+ijrRU ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM -MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD -QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E -jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo -ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI -ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu -Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg -AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7 -HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA -uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa -TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg -xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q -CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x -O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs -6GAqm4VKQPNriiTsBhYscw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj -YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM -GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP -ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua -BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe -3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4 -YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR -rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm -ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU -oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF -MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v -QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t -b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF -AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q -GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz -Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2 -G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi -l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3 -smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB -gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV -BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw -MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl -YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P -RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3 -UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI -2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8 -Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp -+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+ -DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O -nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW -/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g -PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u -QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY -SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv -IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ -RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4 -zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd -BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB -ZQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL -MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE -BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT -IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw -MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy -ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N -T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR -FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J -cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW -BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ -BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm -fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv -GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp -ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow -fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV -BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB -BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM -cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S -HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996 -CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk -3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz -6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV -HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud -EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv -Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw -Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww -DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0 -5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj -Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI -gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ -aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl -izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb -MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow -GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0 -aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla -MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO -BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD -VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B -AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW -fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt -TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL -fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW -1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7 -kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G -A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD -VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v -ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo -dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu -Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/ -HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 -pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS -jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+ -xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn -dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv -b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG -EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl -cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c -JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP -mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+ -wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4 -VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/ -AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB -AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW -BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun -pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC -dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf -fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm -NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx -H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe -+o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD -QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT -MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB -CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 -nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt -43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P -T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 -gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO -BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR -TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw -DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr -hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg -06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF -PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls -YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk -CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs -MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 -d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j -ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL -MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 -LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug -RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm -+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW -PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM -xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB -Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3 -hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg -EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA -FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec -nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z -eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF -hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 -Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe -vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep -+OkuE6N36B9K ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg -bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ -j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV -Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw -MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5 -fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i -+DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN -QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+ -gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx -ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf -WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK -xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE -zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F -5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv -OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz -ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME -lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG -Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q -gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k -Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV -UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL -EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ -BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x -ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/ -k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso -LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o -TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG -SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx -JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI -RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3 -MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C -TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5 -WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG -SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR -xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL -B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw -CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp -dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE -CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B -CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy -MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO -U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0 -IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx -ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV -p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw -BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl -5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi -3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+ -QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG -9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ -2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN -I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL -553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q -10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN -uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx -ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w -MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD -VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx -FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu -ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7 -gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH -fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a -ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT -ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk -c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto -dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt -aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI -hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk -QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/ -h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq -nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR -rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2 -9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ -MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT -DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow -PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD -Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB -AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O -rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq -OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b -xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw -7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD -aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV -HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG -SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 -ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr -AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz -R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 -JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo -Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu -dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy -MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny -Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0 -iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn -5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd -BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0 -MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy -ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l -dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy -MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY -MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF -fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w -AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS -hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/ -GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd -zmVml64mXg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML -RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu -Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg -RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl -IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa -Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE -CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO -8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB -bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2 -dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4 -QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT -C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw -IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy -ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw -KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD -VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud -DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2 -fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia -d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF -JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U -yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML -RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp -bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5 -IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy -MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3 -LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp -YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG -A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq -K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe -sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX -MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT -XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/ -HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH -4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA -vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G -CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA -WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo -oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ -h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18 -f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN -B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy -vUxFnmG6v4SBkgPR0ml8xQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u -ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh -Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV -BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe -Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU -MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D -bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl -MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq -RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G -CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo -6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux -5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm -AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC -ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50 -cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m -by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp -IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg -Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg -KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV -HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E -BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE -FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA -BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7 -pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz -wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a -EkP/TOYGJqibGapEPHayXOw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u -ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc -KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u -ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1 -MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE -ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j -b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF -bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg -U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA -A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/ -I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3 -wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC -AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb -oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5 -BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p -dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk -MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp -b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu -dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0 -MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi -E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa -MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI -hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN -95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd -2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC -VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0 -Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW -KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl -cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw -NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw -NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy -ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV -BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ -KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo -Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4 -4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9 -KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI -rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi -94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB -sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi -gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo -kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE -vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA -A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t -O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua -AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP -9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/ -eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m -0vdXcDazv/wor3ElhVsT/h5/WrQ8 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy -dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1 -MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx -dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f -BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A -cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ -MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm -aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw -ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj -IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y -7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh -1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT -ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw -MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j -LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ -KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo -RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu -WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw -Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK -eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM -zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+ -WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN -/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV -UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj -dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0 -NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD -VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G -vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/ -BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C -AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl -IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw -NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq -y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF -MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA -A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy -0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1 -E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc -MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT -ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw -MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj -dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l -c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC -UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc -58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/ -o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH -MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr -aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA -A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA -Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv -8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx -IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1 -dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 -MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u -Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY -rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z -hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay -BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL -iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb -AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv -bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0 -MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E -FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n -VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq -u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m -hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl -ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp -QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5 -quGnM/b9Sh/22WA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs -IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg -R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A -PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8 -Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL -TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL -5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7 -S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe -2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE -FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap -EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td -EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv -/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN -A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0 -abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF -I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz -4iIprn2DQKi6bA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT -MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i -YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG -EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg -R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9 -9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq -fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv -iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU -1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+ -bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW -MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA -ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l -uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn -Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS -tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF -PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un -hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV -5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY -MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo -R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx -MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK -Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp -ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9 -AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA -ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0 -7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W -kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI -mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ -KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1 -6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl -4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K -oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj -UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU -AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy -c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD -VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1 -c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC -AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81 -WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG -FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq -XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL -se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb -KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd -IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73 -y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt -hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc -QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4 -Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV -HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV -HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ -KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z -dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ -L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr -Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo -ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY -T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz -GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m -1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV -OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH -6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX -QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW -MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy -c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE -BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0 -IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV -VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8 -cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT -QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh -F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v -c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w -mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd -VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX -teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ -f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe -Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+ -nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB -/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY -MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG -9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc -aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX -IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn -ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z -uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN -Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja -QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW -koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9 -ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt -DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm -bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw -MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT -aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ -jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp -xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp -1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG -snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ -U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8 -9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E -BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B -AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz -yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE -38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP -AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad -DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME -HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G -A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp -Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1 -MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG -A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL -v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8 -eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq -tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd -C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa -zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB -mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH -V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n -bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG -3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs -J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO -291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS -ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd -AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 -TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh -MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE -YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3 -MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo -ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg -MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN -ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA -PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w -wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi -EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY -avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+ -YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE -sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h -/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5 -IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD -ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy -OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P -TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ -HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER -dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf -ReYNnyicsbkqWletNw+vHX/bvZ8= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv -bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv -b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU -cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds -b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH -iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS -r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 -04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r -GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 -3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P -lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD -VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv -b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV -UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU -cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv -RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M -ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5 -1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz -dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl -IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy -bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARwxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEzMDEGA1UECxMq -SVBTIENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTMwMQYD -VQQDEypJUFMgQ0EgQ2hhaW5lZCBDQXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx -HjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczAeFw0wMTEyMjkwMDUzNTha -Fw0yNTEyMjcwMDUzNThaMIIBHDELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNl -bG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQg -cHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMu -ZXMgQy5JLkYuICBCLTYwOTI5NDUyMTMwMQYDVQQLEypJUFMgQ0EgQ2hhaW5lZCBD -QXMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMzAxBgNVBAMTKklQUyBDQSBDaGFp -bmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3DQEJARYP -aXBzQG1haWwuaXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcVpJJ -spQgvJhPUOtopKdJC7/SMejHT8KGC/po/UNaivNgkjWZOLtNA1IhW/A3mTXhQSCB -hYEFcYGdtJUZqV92NC5jNzVXjrQfQj8VXOF6wV8TGDIxya2+o8eDZh65nAQTy2nB -Bt4wBrszo7Uf8I9vzv+W6FS+ZoCua9tBhDaiPQIDAQABo4IEQzCCBD8wHQYDVR0O -BBYEFKGtMbH5PuEXpsirNPxShwkeYlJBMIIBTgYDVR0jBIIBRTCCAUGAFKGtMbH5 -PuEXpsirNPxShwkeYlJBoYIBJKSCASAwggEcMQswCQYDVQQGEwJFUzESMBAGA1UE -CBMJQmFyY2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJ -bnRlcm5ldCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0Bt -YWlsLmlwcy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxMzAxBgNVBAsTKklQUyBDQSBD -aGFpbmVkIENBcyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEzMDEGA1UEAxMqSVBT -IENBIENoYWluZWQgQ0FzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8E -BQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMG -CCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYB -BAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMw -EYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlwcy5lczBC -BglghkgBhvhCAQ0ENRYzQ2hhaW5lZCBDQSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkg -aHR0cDovL3d3dy5pcHMuZXMvMCkGCWCGSAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlw -cy5lcy9pcHMyMDAyLzA3BglghkgBhvhCAQQEKhYoaHR0cDovL3d3dy5pcHMuZXMv -aXBzMjAwMi9pcHMyMDAyQ0FDLmNybDA8BglghkgBhvhCAQMELxYtaHR0cDovL3d3 -dy5pcHMuZXMvaXBzMjAwMi9yZXZvY2F0aW9uQ0FDLmh0bWw/MDkGCWCGSAGG+EIB -BwQsFipodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3JlbmV3YWxDQUMuaHRtbD8w -NwYJYIZIAYb4QgEIBCoWKGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5 -Q0FDLmh0bWwwbQYDVR0fBGYwZDAuoCygKoYoaHR0cDovL3d3dy5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0FDLmNybDAyoDCgLoYsaHR0cDovL3d3d2JhY2suaXBzLmVz -L2lwczIwMDIvaXBzMjAwMkNBQy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAERyMJ1W -WKJBGyi3leGmGpVfp3hAK+/blkr8THFj2XOVvQLiogbHvpcqk4A0hgP63Ng9HgfN -HnNDJGD1HWHc3JagvPsd4+cSACczAsDAK1M92GsDgaPb1pOVIO/Tln4mkImcJpvN -b2ar7QMiRDjMWb2f2/YHogF/JsRj9SVCXmK9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl -SVBTIENBIENMQVNFMSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAwNTkzOFoXDTI1MTIyNzAw -NTkzOFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTEgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA4FEnpwvdr9G5Q1uCN0VWcu+atsIS7ywS -zHb5BlmvXSHU0lq4oNTzav3KaY1mSPd05u42veiWkXWmcSjK5yISMmmwPh5r9FBS -YmL9Yzt9fuzuOOpi9GyocY3h6YvJP8a1zZRCb92CRTzo3wno7wpVqVZHYUxJZHMQ -KD/Kvwn/xi8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBTrsxl588GlHKzcuh9morKb -adB4CDCCAUQGA1UdIwSCATswggE3gBTrsxl588GlHKzcuh9morKbadB4CKGCARqk -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UxIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UxIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTEuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMS5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTEuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTEu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UxLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAK9Dr/drIyllq2tPMMi7JVBuK -Yn4VLenZMdMu9Ccj/1urxUq2ckCuU3T0vAW0xtnIyXf7t/k0f3gA+Nak5FI/LEpj -V4F1Wo7ojPsCwJTGKbqz3Bzosq/SLmJbGqmODszFV0VRFOlOHIilkfSj945RyKm+ -hjM+5i9Ibq9UkE6tsSU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH6jCCB1OgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARIxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEuMCwGA1UECxMl -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMl -SVBTIENBIENMQVNFMyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEeMBwGCSqGSIb3 -DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMDE0NFoXDTI1MTIyNzAx -MDE0NFowggESMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFyY2Vsb25hMRIwEAYD -VQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5ldCBwdWJsaXNoaW5n -IFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlwcy5lcyBDLkkuRi4g -IEItNjA5Mjk0NTIxLjAsBgNVBAsTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxLjAsBgNVBAMTJUlQUyBDQSBDTEFTRTMgQ2VydGlmaWNhdGlv -biBBdXRob3JpdHkxHjAcBgkqhkiG9w0BCQEWD2lwc0BtYWlsLmlwcy5lczCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAqxf+DrDGaBtT8FK+n/ra+osTBLsBjzLZ -H49NzjaY2uQARIwo2BNEKqRrThckQpzTiKRBgtYj+4vJhuW5qYIF3PHeH+AMmVWY -8jjsbJ0gA8DvqqPGZARRLXgNo9KoOtYkTOmWehisEyMiG3zoMRGzXwmqMHBxRiVr -SXGAK5UBsh8CAwEAAaOCBEowggRGMB0GA1UdDgQWBBS4k/8uy9wsjqLnev42USGj -mFsMNDCCAUQGA1UdIwSCATswggE3gBS4k/8uy9wsjqLnev42USGjmFsMNKGCARqk -ggEWMIIBEjELMAkGA1UEBhMCRVMxEjAQBgNVBAgTCUJhcmNlbG9uYTESMBAGA1UE -BxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJUFMgSW50ZXJuZXQgcHVibGlzaGluZyBT -ZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJpcHNAbWFpbC5pcHMuZXMgQy5JLkYuICBC -LTYwOTI5NDUyMS4wLAYDVQQLEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MS4wLAYDVQQDEyVJUFMgQ0EgQ0xBU0UzIENlcnRpZmljYXRpb24g -QXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYD -VR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggr -BgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIB -FQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhC -AQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGB -D2lwc0BtYWlsLmlwcy5lczBBBglghkgBhvhCAQ0ENBYyQ0xBU0UzIENBIENlcnRp -ZmljYXRlIGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgEC -BBwWGmh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMDoGCWCGSAGG+EIBBAQtFito -dHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMuY3JsMD8GCWCG -SAGG+EIBAwQyFjBodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25D -TEFTRTMuaHRtbD8wPAYJYIZIAYb4QgEHBC8WLWh0dHA6Ly93d3cuaXBzLmVzL2lw -czIwMDIvcmVuZXdhbENMQVNFMy5odG1sPzA6BglghkgBhvhCAQgELRYraHR0cDov -L3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lDTEFTRTMuaHRtbDBzBgNVHR8EbDBq -MDGgL6AthitodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJDTEFTRTMu -Y3JsMDWgM6Axhi9odHRwOi8vd3d3YmFjay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAy -Q0xBU0UzLmNybDAvBggrBgEFBQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9v -Y3NwLmlwcy5lcy8wDQYJKoZIhvcNAQEFBQADgYEAF2VcmZVDAyevJuXr0LMXI/dD -qsfwfewPxqmurpYPdikc4gYtfibFPPqhwYHOU7BC0ZdXGhd+pFFhxu7pXu8Fuuu9 -D6eSb9ijBmgpjnn1/7/5p6/ksc7C0YBCJwUENPjDfxZ4IwwHJPJGR607VNCv1TGy -r33I6unUVtkOE7LFRVA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm -SVBTIENBIENMQVNFQTEgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUExIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNTMyWhcNMjUxMjI3 -MDEwNTMyWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALsw19zQVL01Tp/FTILq0VA8R5j8 -m2mdd81u4D/u6zJfX5/S0HnllXNEITLgCtud186Nq1KLK3jgm1t99P1tCeWu4Wwd -ByOgF9H5fahGRpEiqLJpxq339fWUoTCUvQDMRH/uxJ7JweaPCjbB/SQ9AaD1e+J8 -eGZDi09Z8pvZ+kmzAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUZyaW56G/2LUDnf47 -3P7yiuYV3TAwggFGBgNVHSMEggE9MIIBOYAUZyaW56G/2LUDnf473P7yiuYV3TCh -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTEgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUExIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMSBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMS5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTEuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTEuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMS5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTEuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMS5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAH66iqyA -AIQVCtWYUQxkxZwCWINmyq0eB81+atqAB98DNEock8RLWCA1NnHtogo1EqWmZaeF -aQoO42Hu6r4okzPV7Oi+xNtff6j5YzHIa5biKcJboOeXNp13XjFr/tOn2yrb25aL -H2betgPAK7N41lUH5Y85UN4HI3LmvSAUS7SG ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIH9zCCB2CgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCARQxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjEvMC0GA1UECxMm -SVBTIENBIENMQVNFQTMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxLzAtBgNVBAMT -JklQUyBDQSBDTEFTRUEzIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4wHAYJKoZI -hvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMwHhcNMDExMjI5MDEwNzUwWhcNMjUxMjI3 -MDEwNzUwWjCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXMw -gZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAO6AAPYaZC6tasiDsYun7o/ZttvN -G7uGBiJ2MwwSbUhWYdLcgiViL5/SaTBlA0IjWLxH3GvWdV0XPOH/8lhneaDBgbHU -VqLyjRGZ/fZ98cfEXgIqmuJKtROKAP2Md4bm15T1IHUuDky/dMQ/gT6DtKM4Ninn -6Cr1jIhBqoCm42zvAgMBAAGjggRTMIIETzAdBgNVHQ4EFgQUHp9XUEe2YZM50yz8 -2l09BXW3mQIwggFGBgNVHSMEggE9MIIBOYAUHp9XUEe2YZM50yz82l09BXW3mQKh -ggEcpIIBGDCCARQxCzAJBgNVBAYTAkVTMRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQ -BgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UEChMlSVBTIEludGVybmV0IHB1Ymxpc2hp -bmcgU2VydmljZXMgcy5sLjErMCkGA1UEChQiaXBzQG1haWwuaXBzLmVzIEMuSS5G -LiAgQi02MDkyOTQ1MjEvMC0GA1UECxMmSVBTIENBIENMQVNFQTMgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkxLzAtBgNVBAMTJklQUyBDQSBDTEFTRUEzIENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MR4wHAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOC -AQAwDAYDVR0TBAUwAwEB/zAMBgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUF -BwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYB -BAGCNwIBFQYKKwYBBAGCNwIBFgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglg -hkgBhvhCAQEEBAMCAAcwGgYDVR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1Ud -EgQTMBGBD2lwc0BtYWlsLmlwcy5lczBCBglghkgBhvhCAQ0ENRYzQ0xBU0VBMyBD -QSBDZXJ0aWZpY2F0ZSBpc3N1ZWQgYnkgaHR0cDovL3d3dy5pcHMuZXMvMCkGCWCG -SAGG+EIBAgQcFhpodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyLzA7BglghkgBhvhC -AQQELhYsaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyQ0xBU0VBMy5j -cmwwQAYJYIZIAYb4QgEDBDMWMWh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcmV2 -b2NhdGlvbkNMQVNFQTMuaHRtbD8wPQYJYIZIAYb4QgEHBDAWLmh0dHA6Ly93d3cu -aXBzLmVzL2lwczIwMDIvcmVuZXdhbENMQVNFQTMuaHRtbD8wOwYJYIZIAYb4QgEI -BC4WLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvcG9saWN5Q0xBU0VBMy5odG1s -MHUGA1UdHwRuMGwwMqAwoC6GLGh0dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvaXBz -MjAwMkNMQVNFQTMuY3JsMDagNKAyhjBodHRwOi8vd3d3YmFjay5pcHMuZXMvaXBz -MjAwMi9pcHMyMDAyQ0xBU0VBMy5jcmwwLwYIKwYBBQUHAQEEIzAhMB8GCCsGAQUF -BzABhhNodHRwOi8vb2NzcC5pcHMuZXMvMA0GCSqGSIb3DQEBBQUAA4GBAEo9IEca -2on0eisxeewBwMwB9dbB/MjD81ACUZBYKp/nNQlbMAqBACVHr9QPDp5gJqiVp4MI -3y2s6Q73nMify5NF8bpqxmdRSmlPa/59Cy9SKcJQrSRE7SOzSMtEQMEDlQwKeAYS -AfWRMS1Jjbs/RU4s4OjNtckUFQzjB4ObJnXv ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICtzCCAiACAQAwDQYJKoZIhvcNAQEEBQAwgaMxCzAJBgNVBAYTAkVTMRIwEAYD -VQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UEChMQSVBT -IFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcwFQYDVQQD -Ew5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVz -MB4XDTk4MDEwMTIzMjEwN1oXDTA5MTIyOTIzMjEwN1owgaMxCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCQVJDRUxPTkExEjAQBgNVBAcTCUJBUkNFTE9OQTEZMBcGA1UE -ChMQSVBTIFNlZ3VyaWRhZCBDQTEYMBYGA1UECxMPQ2VydGlmaWNhY2lvbmVzMRcw -FQYDVQQDEw5JUFMgU0VSVklET1JFUzEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwu -aXBzLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsT1J0nznqjtwlxLyY -XZhkJAk8IbPMGbWOlI6H0fg3PqHILVikgDVboXVsHUUMH2Fjal5vmwpMwci4YSM1 -gf/+rHhwLWjhOgeYlQJU3c0jt4BT18g3RXIGJBK6E2Ehim51KODFDzT9NthFf+G4 -Nu+z4cYgjui0OLzhPvYR3oydAQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBACzzw3lY -JN7GO9HgQmm47mSzPWIBubOE3yN93ZjPEKn+ANgilgUTB1RXxafey9m4iEL2mdsU -dx+2/iU94aI+A6mB0i1sR/WWRowiq8jMDQ6XXotBtDvECgZAHd1G9AHduoIuPD14 -cJ58GNCr+Lh3B0Zx8coLY1xq+XKU1QFPoNtC ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIODCCB6GgAwIBAgIBADANBgkqhkiG9w0BAQUFADCCAR4xCzAJBgNVBAYTAkVT -MRIwEAYDVQQIEwlCYXJjZWxvbmExEjAQBgNVBAcTCUJhcmNlbG9uYTEuMCwGA1UE -ChMlSVBTIEludGVybmV0IHB1Ymxpc2hpbmcgU2VydmljZXMgcy5sLjErMCkGA1UE -ChQiaXBzQG1haWwuaXBzLmVzIEMuSS5GLiAgQi02MDkyOTQ1MjE0MDIGA1UECxMr -SVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTE0MDIG -A1UEAxMrSVBTIENBIFRpbWVzdGFtcGluZyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eTEeMBwGCSqGSIb3DQEJARYPaXBzQG1haWwuaXBzLmVzMB4XDTAxMTIyOTAxMTAx -OFoXDTI1MTIyNzAxMTAxOFowggEeMQswCQYDVQQGEwJFUzESMBAGA1UECBMJQmFy -Y2Vsb25hMRIwEAYDVQQHEwlCYXJjZWxvbmExLjAsBgNVBAoTJUlQUyBJbnRlcm5l -dCBwdWJsaXNoaW5nIFNlcnZpY2VzIHMubC4xKzApBgNVBAoUImlwc0BtYWlsLmlw -cy5lcyBDLkkuRi4gIEItNjA5Mjk0NTIxNDAyBgNVBAsTK0lQUyBDQSBUaW1lc3Rh -bXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxNDAyBgNVBAMTK0lQUyBDQSBU -aW1lc3RhbXBpbmcgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHjAcBgkqhkiG9w0B -CQEWD2lwc0BtYWlsLmlwcy5lczCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA -vLjuVqWajOY2ycJioGaBjRrVetJznw6EZLqVtJCneK/K/lRhW86yIFcBrkSSQxA4 -Efdo/BdApWgnMjvEp+ZCccWZ73b/K5Uk9UmSGGjKALWkWi9uy9YbLA1UZ2t6KaFY -q6JaANZbuxjC3/YeE1Z2m6Vo4pjOxgOKNNtMg0GmqaMCAwEAAaOCBIAwggR8MB0G -A1UdDgQWBBSL0BBQCYHynQnVDmB4AyKiP8jKZjCCAVAGA1UdIwSCAUcwggFDgBSL -0BBQCYHynQnVDmB4AyKiP8jKZqGCASakggEiMIIBHjELMAkGA1UEBhMCRVMxEjAQ -BgNVBAgTCUJhcmNlbG9uYTESMBAGA1UEBxMJQmFyY2Vsb25hMS4wLAYDVQQKEyVJ -UFMgSW50ZXJuZXQgcHVibGlzaGluZyBTZXJ2aWNlcyBzLmwuMSswKQYDVQQKFCJp -cHNAbWFpbC5pcHMuZXMgQy5JLkYuICBCLTYwOTI5NDUyMTQwMgYDVQQLEytJUFMg -Q0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MTQwMgYDVQQD -EytJUFMgQ0EgVGltZXN0YW1waW5nIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MR4w -HAYJKoZIhvcNAQkBFg9pcHNAbWFpbC5pcHMuZXOCAQAwDAYDVR0TBAUwAwEB/zAM -BgNVHQ8EBQMDB/+AMGsGA1UdJQRkMGIGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYB -BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYKKwYBBAGCNwIBFQYKKwYBBAGCNwIB -FgYKKwYBBAGCNwoDAQYKKwYBBAGCNwoDBDARBglghkgBhvhCAQEEBAMCAAcwGgYD -VR0RBBMwEYEPaXBzQG1haWwuaXBzLmVzMBoGA1UdEgQTMBGBD2lwc0BtYWlsLmlw -cy5lczBHBglghkgBhvhCAQ0EOhY4VGltZXN0YW1waW5nIENBIENlcnRpZmljYXRl -IGlzc3VlZCBieSBodHRwOi8vd3d3Lmlwcy5lcy8wKQYJYIZIAYb4QgECBBwWGmh0 -dHA6Ly93d3cuaXBzLmVzL2lwczIwMDIvMEAGCWCGSAGG+EIBBAQzFjFodHRwOi8v -d3d3Lmlwcy5lcy9pcHMyMDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMEUGCWCG -SAGG+EIBAwQ4FjZodHRwOi8vd3d3Lmlwcy5lcy9pcHMyMDAyL3Jldm9jYXRpb25U -aW1lc3RhbXBpbmcuaHRtbD8wQgYJYIZIAYb4QgEHBDUWM2h0dHA6Ly93d3cuaXBz -LmVzL2lwczIwMDIvcmVuZXdhbFRpbWVzdGFtcGluZy5odG1sPzBABglghkgBhvhC -AQgEMxYxaHR0cDovL3d3dy5pcHMuZXMvaXBzMjAwMi9wb2xpY3lUaW1lc3RhbXBp -bmcuaHRtbDB/BgNVHR8EeDB2MDegNaAzhjFodHRwOi8vd3d3Lmlwcy5lcy9pcHMy -MDAyL2lwczIwMDJUaW1lc3RhbXBpbmcuY3JsMDugOaA3hjVodHRwOi8vd3d3YmFj -ay5pcHMuZXMvaXBzMjAwMi9pcHMyMDAyVGltZXN0YW1waW5nLmNybDAvBggrBgEF -BQcBAQQjMCEwHwYIKwYBBQUHMAGGE2h0dHA6Ly9vY3NwLmlwcy5lcy8wDQYJKoZI -hvcNAQEFBQADgYEAZbrBzAAalZHK6Ww6vzoeFAh8+4Pua2JR0zORtWB5fgTYXXk3 -6MNbsMRnLWhasl8OCvrNPzpFoeo2zyYepxEoxZSPhExTCMWTs/zif/WN87GphV+I -3pGW7hdbrqXqcGV4LCFkAZXOzkw+UPS2Wctjjba9GNSHSl/c7+lW8AoM6HU= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD -EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05 -OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l -dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG -SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK -gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX -iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc -Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E -BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G -SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu -b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh -bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv -Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln -aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0 -IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh -c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph -biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo -ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP -UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj -YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo -dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA -bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06 -sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa -n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS -NitjrFgBazMpUIaD8QFI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD -EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X -DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw -DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u -c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr -TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA -OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC -2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW -RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P -AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW -ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0 -YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz -b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO -ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB -IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs -b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs -ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s -YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg -a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g -SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0 -aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg -YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg -Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY -ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g -pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4 -Fp1hBWeAyNDYpQcCNJgEjTME1A== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV -MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe -TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0 -dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB -KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0 -N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC -dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu -MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL -b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD -zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi -3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8 -WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY -Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi -NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC -ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4 -QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0 -YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz -aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu -IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm -ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg -ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs -amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv -IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3 -Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6 -ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1 -YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg -dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs -b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G -CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO -xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP -0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ -QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk -f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK -8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIG0TCCBbmgAwIBAgIBezANBgkqhkiG9w0BAQUFADCByTELMAkGA1UEBhMCSFUx -ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0 -b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMUIwQAYDVQQD -EzlOZXRMb2NrIE1pbm9zaXRldHQgS296amVneXpvaSAoQ2xhc3MgUUEpIFRhbnVz -aXR2YW55a2lhZG8xHjAcBgkqhkiG9w0BCQEWD2luZm9AbmV0bG9jay5odTAeFw0w -MzAzMzAwMTQ3MTFaFw0yMjEyMTUwMTQ3MTFaMIHJMQswCQYDVQQGEwJIVTERMA8G -A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh -Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxQjBABgNVBAMTOU5l -dExvY2sgTWlub3NpdGV0dCBLb3pqZWd5em9pIChDbGFzcyBRQSkgVGFudXNpdHZh -bnlraWFkbzEeMBwGCSqGSIb3DQEJARYPaW5mb0BuZXRsb2NrLmh1MIIBIjANBgkq -hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx1Ilstg91IRVCacbvWy5FPSKAtt2/Goq -eKvld/Bu4IwjZ9ulZJm53QE+b+8tmjwi8F3JV6BVQX/yQ15YglMxZc4e8ia6AFQe -r7C8HORSjKAyr7c3sVNnaHRnUPYtLmTeriZ539+Zhqurf4XsoPuAzPS4DB6TRWO5 -3Lhbm+1bOdRfYrCnjnxmOCyqsQhjF2d9zL2z8cM/z1A57dEZgxXbhxInlrfa6uWd -vLrqOU+L73Sa58XQ0uqGURzk/mQIKAR5BevKxXEOC++r6uwSEaEYBTJp0QwsGj0l -mT+1fMptsK6ZmfoIYOcZwvK9UdPM0wKswREMgM6r3JSda6M5UzrWhQIDAMV9o4IC -wDCCArwwEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8EBAMCAQYwggJ1Bglg -hkgBhvhCAQ0EggJmFoICYkZJR1lFTEVNISBFemVuIHRhbnVzaXR2YW55IGEgTmV0 -TG9jayBLZnQuIE1pbm9zaXRldHQgU3pvbGdhbHRhdGFzaSBTemFiYWx5emF0YWJh -biBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBBIG1pbm9zaXRldHQg -ZWxla3Ryb25pa3VzIGFsYWlyYXMgam9naGF0YXMgZXJ2ZW55ZXN1bGVzZW5laywg -dmFsYW1pbnQgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYSBNaW5vc2l0ZXR0IFN6 -b2xnYWx0YXRhc2kgU3phYmFseXphdGJhbiwgYXogQWx0YWxhbm9zIFN6ZXJ6b2Rl -c2kgRmVsdGV0ZWxla2JlbiBlbG9pcnQgZWxsZW5vcnplc2kgZWxqYXJhcyBtZWd0 -ZXRlbGUuIEEgZG9rdW1lbnR1bW9rIG1lZ3RhbGFsaGF0b2sgYSBodHRwczovL3d3 -dy5uZXRsb2NrLmh1L2RvY3MvIGNpbWVuIHZhZ3kga2VyaGV0b2sgYXogaW5mb0Bu -ZXRsb2NrLm5ldCBlLW1haWwgY2ltZW4uIFdBUk5JTkchIFRoZSBpc3N1YW5jZSBh -bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGFyZSBzdWJqZWN0IHRvIHRo -ZSBOZXRMb2NrIFF1YWxpZmllZCBDUFMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3 -Lm5ldGxvY2suaHUvZG9jcy8gb3IgYnkgZS1tYWlsIGF0IGluZm9AbmV0bG9jay5u -ZXQwHQYDVR0OBBYEFAlqYhaSsFq7VQ7LdTI6MuWyIckoMA0GCSqGSIb3DQEBBQUA -A4IBAQCRalCc23iBmz+LQuM7/KbD7kPgz/PigDVJRXYC4uMvBcXxKufAQTPGtpvQ -MznNwNuhrWw3AkxYQTvyl5LGSKjN5Yo5iWH5Upfpvfb5lHTocQ68d4bDBsxafEp+ -NFAwLvt/MpqNPfMgW/hqyobzMUwsWYACff44yTB1HLdV47yfuqhthCgFdbOLDcCR -VCHnpgu0mfVRQdzNo0ci2ccBgcTcR08m6h/t280NmPSjnLRzMkqWmf68f8glWPhY -83ZmiVSkpj7EUFy6iRiCdUgh0k8T6GB+B3bbELVR5qq5aKrN9p2QdRLqOBrKROi3 -macqaJVmlaut74nLYKkGEsaUR+ko ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi -MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu -MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp -dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV -UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO -ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz -c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP -OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl -mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF -BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4 -qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw -gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB -BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu -bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp -dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8 -6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/ -h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH -/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv -wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN -pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa -GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg -Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J -WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB -rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp -+ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1 -ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i -Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz -PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og -/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH -oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI -yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud -EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2 -A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL -MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT -ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f -BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn -g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl -fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K -WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha -B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc -hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR -TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD -mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z -ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y -4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza -8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x -GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv -b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV -BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W -YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM -V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB -4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr -H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd -8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv -vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT -mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe -btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc -T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt -WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ -c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A -4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD -VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG -CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0 -aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 -aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu -dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw -czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G -A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg -Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0 -7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem -d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd -+LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B -4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN -t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x -DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57 -k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s -zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j -Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT -mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK -4SVhM7JZG+Ju1zdXtg2pEto= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC -TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0 -aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz -MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw -IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR -dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG -9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp -li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D -rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ -WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug -F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU -xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC -Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv -dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw -ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl -IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh -c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy -ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh -Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI -KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T -KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq -y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p -dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD -VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL -MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk -fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8 -7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R -cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y -mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW -xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK -SnQ2+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy -NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD -cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs -2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY -JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE -Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ -n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A -PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx -MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O -isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY -78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9 -zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd -BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA -Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN -T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD -mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6 -MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp -dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX -BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy -MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp -eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg -/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl -wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh -AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2 -PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu -AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB -BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR -MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc -HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/ -Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+ -f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO -rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch -6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3 -7CAFYd4= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx -MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg -Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ -iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa -/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ -jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI -HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7 -sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w -gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF -MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw -KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG -AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L -URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO -H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm -I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY -iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc -f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI -MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x -FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz -MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv -cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz -Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO -0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao -wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj -7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS -8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT -BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB -/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg -JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC -NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3 -6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/ -3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm -D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS -CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR -3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY -MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t -dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5 -WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD -VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3 -DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8 -9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ -DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9 -Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N -QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ -xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G -A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T -AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG -kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr -Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5 -Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU -JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot -RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBJDANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MxIENBMB4XDTAx -MDQwNjEwNDkxM1oXDTIxMDQwNjEwNDkxM1owOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMSBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBALWJHytPZwp5/8Ue+H887dF+2rDNbS82rDTG -29lkFwhjMDMiikzujrsPDUJVyZ0upe/3p4zDq7mXy47vPxVnqIJyY1MPQYx9EJUk -oVqlBvqSV536pQHydekfvFYmUk54GWVYVQNYwBSujHxVX3BbdyMGNpfzJLWaRpXk -3w0LBUXl0fIdgrvGE+D+qnr9aTCU89JFhfzyMlsy3uhsXR/LpCJ0sICOXZT3BgBL -qdReLjVQCfOAl/QMF6452F/NM8EcyonCIvdFEu1eEpOdY6uCLrnrQkFEy0oaAIIN -nvmLVz5MxxftLItyM19yejhW1ebZrgUaHXVFsculJRwSVzb9IjcCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQIR+IMi/ZTiFIwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQCLGrLJXWG04bkruVPRsoWdd44W7hE928Jj2VuX -ZfsSZ9gqXLar5V7DtxYvyOirHYr9qxp81V9jz9yw3Xe5qObSIjiHBxTZ/75Wtf0H -DjxVyhbMp6Z3N/vbXB9OWQaHowND9Rart4S9Tu+fMTfwRvFAttEMpWT4Y14h21VO -TzF2nBBhjrZTOqMRvq9tfB69ri3iDGnHhVNoomG6xT60eVR4ngrHAr5i0RGCS2Uv -kVrCqIexVmiUefkl98HVrhq4uz2PqYo4Ffdz0Fpg0YCw8NzVUM1O7pJIae2yIx4w -zMiUyLb1O4Z/P6Yun/Y+LLWSlj7fLJOK/4GMDw9ZIRlXvVWa ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP -MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx -MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV -BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI -hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o -Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt -5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s -3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej -vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu -8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw -DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil -zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/ -3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD -FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6 -Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2 -ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO -TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh -dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy -MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk -ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn -ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71 -9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO -hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U -tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o -BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh -SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww -OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv -cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA -7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k -/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm -eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6 -u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy -7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR -iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl -MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp -U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw -NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE -ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp -ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3 -DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf -8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN -+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0 -X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa -K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA -1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G -A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR -zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0 -YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD -bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w -DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3 -L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D -eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl -xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp -VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY -WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW -MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg -Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9 -MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi -U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh -cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA -A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk -pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf -OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C -Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT -Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi -HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM -Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w -+2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+ -Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3 -Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B -26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID -AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE -FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j -ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js -LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM -BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0 -Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy -dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh -cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh -YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg -dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp -bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ -YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT -TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ -9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8 -jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW -FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz -ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1 -ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L -EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu -L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq -yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC -O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V -um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh -NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFFjCCBH+gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBsDELMAkGA1UEBhMCSUwx -DzANBgNVBAgTBklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0 -Q29tIEx0ZC4xGjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBG -cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYS -YWRtaW5Ac3RhcnRjb20ub3JnMB4XDTA1MDMxNzE3Mzc0OFoXDTM1MDMxMDE3Mzc0 -OFowgbAxCzAJBgNVBAYTAklMMQ8wDQYDVQQIEwZJc3JhZWwxDjAMBgNVBAcTBUVp -bGF0MRYwFAYDVQQKEw1TdGFydENvbSBMdGQuMRowGAYDVQQLExFDQSBBdXRob3Jp -dHkgRGVwLjEpMCcGA1UEAxMgRnJlZSBTU0wgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkxITAfBgkqhkiG9w0BCQEWEmFkbWluQHN0YXJ0Y29tLm9yZzCBnzANBgkqhkiG -9w0BAQEFAAOBjQAwgYkCgYEA7YRgACOeyEpRKSfeOqE5tWmrCbIvNP1h3D3TsM+x -18LEwrHkllbEvqoUDufMOlDIOmKdw6OsWXuO7lUaHEe+o5c5s7XvIywI6Nivcy+5 -yYPo7QAPyHWlLzRMGOh2iCNJitu27Wjaw7ViKUylS7eYtAkUEKD4/mJ2IhULpNYI -LzUCAwEAAaOCAjwwggI4MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgHmMB0G -A1UdDgQWBBQcicOWzL3+MtUNjIExtpidjShkjTCB3QYDVR0jBIHVMIHSgBQcicOW -zL3+MtUNjIExtpidjShkjaGBtqSBszCBsDELMAkGA1UEBhMCSUwxDzANBgNVBAgT -BklzcmFlbDEOMAwGA1UEBxMFRWlsYXQxFjAUBgNVBAoTDVN0YXJ0Q29tIEx0ZC4x -GjAYBgNVBAsTEUNBIEF1dGhvcml0eSBEZXAuMSkwJwYDVQQDEyBGcmVlIFNTTCBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSYWRtaW5Ac3Rh -cnRjb20ub3JnggEAMB0GA1UdEQQWMBSBEmFkbWluQHN0YXJ0Y29tLm9yZzAdBgNV -HRIEFjAUgRJhZG1pbkBzdGFydGNvbS5vcmcwEQYJYIZIAYb4QgEBBAQDAgAHMC8G -CWCGSAGG+EIBDQQiFiBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAy -BglghkgBhvhCAQQEJRYjaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL2NhLWNybC5j -cmwwKAYJYIZIAYb4QgECBBsWGWh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy8wOQYJ -YIZIAYb4QgEIBCwWKmh0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9pbmRleC5waHA/ -YXBwPTExMTANBgkqhkiG9w0BAQQFAAOBgQBscSXhnjSRIe/bbL0BCFaPiNhBOlP1 -ct8nV0t2hPdopP7rPwl+KLhX6h/BquL/lp9JmeaylXOWxkjHXo0Hclb4g4+fd68p -00UOpO6wNnQt8M2YI3s3S9r+UZjEHjQ8iP2ZO1CnwYszx8JSFhKVU2Ui77qLzmLb -cCOxgN8aIDjnfg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk -MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0 -YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg -Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT -AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp -Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN -BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9 -m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih -FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/ -TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F -EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco -kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu -HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF -vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo -19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC -L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW -bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX -JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw -FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j -BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc -K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf -ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik -Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB -sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e -3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR -ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip -mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH -b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf -rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms -hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y -zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6 -MBr1mmz0DlP5OlvRHA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV -BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln -biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF -MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT -d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8 -76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+ -bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c -6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE -emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd -MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt -MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y -MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y -FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi -aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM -gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB -qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7 -lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn -8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov -L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6 -45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO -UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5 -O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC -bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv -GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a -77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC -hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3 -92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp -Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w -ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt -Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFwTCCA6mgAwIBAgIITrIAZwwDXU8wDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEjMCEGA1UEAxMaU3dpc3NTaWdu -IFBsYXRpbnVtIENBIC0gRzIwHhcNMDYxMDI1MDgzNjAwWhcNMzYxMDI1MDgzNjAw -WjBJMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMSMwIQYDVQQD -ExpTd2lzc1NpZ24gUGxhdGludW0gQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQAD -ggIPADCCAgoCggIBAMrfogLi2vj8Bxax3mCq3pZcZB/HL37PZ/pEQtZ2Y5Wu669y -IIpFR4ZieIbWIDkm9K6j/SPnpZy1IiEZtzeTIsBQnIJ71NUERFzLtMKfkr4k2Htn -IuJpX+UFeNSH2XFwMyVTtIc7KZAoNppVRDBopIOXfw0enHb/FZ1glwCNioUD7IC+ -6ixuEFGSzH7VozPY1kneWCqv9hbrS3uQMpe5up1Y8fhXSQQeol0GcN1x2/ndi5ob -jM89o03Oy3z2u5yg+gnOI2Ky6Q0f4nIoj5+saCB9bzuohTEJfwvH6GXp43gOCWcw -izSC+13gzJ2BbWLuCB4ELE6b7P6pT1/9aXjvCR+htL/68++QHkwFix7qepF6w9fl -+zC8bBsQWJj3Gl/QKTIDE0ZNYWqFTFJ0LwYfexHihJfGmfNtf9dng34TaNhxKFrY -zt3oEBSa/m0jh26OWnA81Y0JAKeqvLAxN23IhBQeW71FYyBrS3SMvds6DsHPWhaP -pZjydomyExI7C3d3rLvlPClKknLKYRorXkzig3R3+jVIeoVNjZpTxN94ypeRSCtF -KwH3HBqi7Ri6Cr2D+m+8jVeTO9TUps4e8aCxzqv9KyiaTxvXw3LbpMS/XUz13XuW -ae5ogObnmLo2t/5u7Su9IPhlGdpVCX4l3P5hYnL5fhgC72O00Puv5TtjjGePAgMB -AAGjgawwgakwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O -BBYEFFCvzAeHFUdvOMW0ZdHelarp35zMMB8GA1UdIwQYMBaAFFCvzAeHFUdvOMW0 -ZdHelarp35zMMEYGA1UdIAQ/MD0wOwYJYIV0AVkBAQEBMC4wLAYIKwYBBQUHAgEW -IGh0dHA6Ly9yZXBvc2l0b3J5LnN3aXNzc2lnbi5jb20vMA0GCSqGSIb3DQEBBQUA -A4ICAQAIhab1Fgz8RBrBY+D5VUYI/HAcQiiWjrfFwUF1TglxeeVtlspLpYhg0DB0 -uMoI3LQwnkAHFmtllXcBrqS3NQuB2nEVqXQXOHtYyvkv+8Bldo1bAbl93oI9ZLi+ -FHSjClTTLJUYFzX1UWs/j6KWYTl4a0vlpqD4U99REJNi54Av4tHgvI42Rncz7Lj7 -jposiU0xEQ8mngS7twSNC/K5/FqdOxa3L8iYq/6KUFkuozv8KV2LwUvJ4ooTHbG/ -u0IdUt1O2BReEMYxB+9xJ/cbOQncguqLs5WGXv312l0xpuAxtpTmREl0xRbl9x8D -YSjFyMsSoEJL+WuICI20MhjzdZ/EfwBPBZWcoxcCw7NTm6ogOSkrZvqdr16zktK1 -puEa+S1BaYEUtLS17Yk9zvupnTVCRLEcFHOBzyoBNZox1S2PbYTfgE1X4z/FhHXa -icYwu+uPyyIIoK6q8QNsOktNCaUOcsZWayFCTiMlFGiudgp8DAdwZPmaL/YFOSbG -DI8Zf0NebvRbFS/bYV3mZy8/CJT5YLSYMdp08YSTcU1f+2BY0fvEwW2JorsgH51x -kcsymxM9Pn2SUjWskpSi0xjCfMfqr3YFFt1nJ8J+HAciIfNAChs0B0QTwoRqjt8Z -Wr9/6x3iGjjRXK9HkmuAtTClyY3YqzGBH9/CZjfTk6mFhnll0g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE -BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu -IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow -RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY -U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A -MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv -Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br -YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF -nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH -6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt -eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/ -c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ -MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH -HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf -jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6 -5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB -rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU -F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c -wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 -cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB -AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp -WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9 -xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ -2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ -IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8 -aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X -em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR -dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/ -OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+ -hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy -tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/ -MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj -YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow -PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp -Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB -AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR -IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q -gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy -yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts -F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2 -jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx -ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC -VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK -YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH -EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN -Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud -DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE -MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK -UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ -TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf -qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK -ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE -JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7 -hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1 -EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm -nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX -udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz -ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe -LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl -pYYsfPQS ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y -AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw -TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8 -/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/ -jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms -Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF -MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU -QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI -MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN -AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla -Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy -ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y -IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1 -c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA -dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF -Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw -Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW -w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF -MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3 -LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G -CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE -Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD -2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE -SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg -Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV -BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl -cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA -vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu -Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a -0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1 -4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN -eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD -R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG -A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu -dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME -Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3 -WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw -HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ -KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO -Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX -wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+ -2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89 -9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0 -jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38 -aQNiuJkFBT1reBK9sG9l ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGTCCBAGgAwIBAgIEPki9xDANBgkqhkiG9w0BAQUFADAxMQswCQYDVQQGEwJE -SzEMMAoGA1UEChMDVERDMRQwEgYDVQQDEwtUREMgT0NFUyBDQTAeFw0wMzAyMTEw -ODM5MzBaFw0zNzAyMTEwOTA5MzBaMDExCzAJBgNVBAYTAkRLMQwwCgYDVQQKEwNU -REMxFDASBgNVBAMTC1REQyBPQ0VTIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A -MIIBCgKCAQEArGL2YSCyz8DGhdfjeebM7fI5kqSXLmSjhFuHnEz9pPPEXyG9VhDr -2y5h7JNp46PMvZnDBfwGuMo2HP6QjklMxFaaL1a8z3sM8W9Hpg1DTeLpHTk0zY0s -2RKY+ePhwUp8hjjEqcRhiNJerxomTdXkoCJHhNlktxmW/OwZ5LKXJk5KTMuPJItU -GBxIYXvViGjaXbXqzRowwYCDdlCqT9HU3Tjw7xb04QxQBr/q+3pJoSgrHPb8FTKj -dGqPqcNiKXEx5TukYBdedObaE+3pHx8b0bJoc8YQNHVGEBDjkAB2QMuLt0MJIf+r -TpPGWOmlgtt3xDqZsXKVSQTwtyv6e1mO3QIDAQABo4ICNzCCAjMwDwYDVR0TAQH/ -BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwgewGA1UdIASB5DCB4TCB3gYIKoFQgSkB -AQEwgdEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2VydGlmaWthdC5kay9yZXBv -c2l0b3J5MIGdBggrBgEFBQcCAjCBkDAKFgNUREMwAwIBARqBgUNlcnRpZmlrYXRl -ciBmcmEgZGVubmUgQ0EgdWRzdGVkZXMgdW5kZXIgT0lEIDEuMi4yMDguMTY5LjEu -MS4xLiBDZXJ0aWZpY2F0ZXMgZnJvbSB0aGlzIENBIGFyZSBpc3N1ZWQgdW5kZXIg -T0lEIDEuMi4yMDguMTY5LjEuMS4xLjARBglghkgBhvhCAQEEBAMCAAcwgYEGA1Ud -HwR6MHgwSKBGoESkQjBAMQswCQYDVQQGEwJESzEMMAoGA1UEChMDVERDMRQwEgYD -VQQDEwtUREMgT0NFUyBDQTENMAsGA1UEAxMEQ1JMMTAsoCqgKIYmaHR0cDovL2Ny -bC5vY2VzLmNlcnRpZmlrYXQuZGsvb2Nlcy5jcmwwKwYDVR0QBCQwIoAPMjAwMzAy -MTEwODM5MzBagQ8yMDM3MDIxMTA5MDkzMFowHwYDVR0jBBgwFoAUYLWF7FZkfhIZ -J2cdUBVLc647+RIwHQYDVR0OBBYEFGC1hexWZH4SGSdnHVAVS3OuO/kSMB0GCSqG -SIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEACrom -JkbTc6gJ82sLMJn9iuFXehHTuJTXCRBuo7E4A9G28kNBKWKnctj7fAXmMXAnVBhO -inxO5dHKjHiIzxvTkIvmI/gLDjNDfZziChmPyQE+dF10yYscA+UYyAFMP8uXBV2Y -caaYb7Z8vTd/vuGTJW1v8AqtFxjhA7wHKcitJuj4YfD9IQl+mo6paH1IYnK9AOoB -mbgGglGBTvH1tJFUuSN6AJqfXY3gPGS5GhKSKseCRHI53OI8xthV9RVOyAUO28bQ -YqbsFbS1AoLbrIyigfCbmTH1ICCoiGEKB5+U/NDXG8wuF/MEJ3Zn61SD/aSQfgY9 -BKNDLdr8C2LqL19iUw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj -IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X -DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw -EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE -ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy -dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD -QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN -BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53 -dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK -wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7 -G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF -AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7 -c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P -9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt -YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu -Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT -AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa -MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG -cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh -d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY -DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E -rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq -uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP -MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa -/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei -gQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD -VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT -ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p -dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv -bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa -QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY -BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u -IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl -bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu -Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs -Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI -Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD -ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG -SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH -b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh -KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy -dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t -MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB -MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG -A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp -b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl -cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv -bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE -VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ -ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR -uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG -9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI -hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM -pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB -qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf -Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw -MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV -BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw -NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j -LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG -A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG -SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs -W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta -3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk -6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6 -Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J -NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA -MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP -r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU -DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz -YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX -xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2 -/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/ -LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7 -jVaMaA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD -VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv -biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm -MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx -MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT -DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3 -dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl -cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3 -DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD -gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91 -yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX -L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj -EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG -7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e -QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ -qdq5snUb9kLy78fyGPmJvKP/iiMucEc= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx -FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN -BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd -BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN -MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g -Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG -A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l -c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT -6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa -Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL -8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB -Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC -9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ -pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ -CayJSdM= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg -MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8 -dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz -MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy -dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD -VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg -xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu -xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7 -XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k -heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J -YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C -urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1 -JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51 -b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV -9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7 -kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh -fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy -B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA -aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS -RGQDJereW26fyfJOrN3H ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc -UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx -c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS -S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg -SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3 -WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv -bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU -UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw -bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe -LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef -J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh -R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ -Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX -JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p -zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S -Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ -KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq -ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4 -Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz -gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH -uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS -y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB -kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw -IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG -EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD -VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu -dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN -BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6 -E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ -D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK -4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq -lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW -bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB -o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT -MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js -LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr -BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB -AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft -Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj -j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH -KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv -2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3 -mfnGV/TJVTl4uix5yaaIK/QI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEojCCA4qgAwIBAgIQRL4Mi1AAJLQR0zYlJWfJiTANBgkqhkiG9w0BAQUFADCB -rjELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xNjA0BgNVBAMTLVVUTi1VU0VSRmlyc3Qt -Q2xpZW50IEF1dGhlbnRpY2F0aW9uIGFuZCBFbWFpbDAeFw05OTA3MDkxNzI4NTBa -Fw0xOTA3MDkxNzM2NThaMIGuMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAV -BgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYDVQQKExVUaGUgVVNFUlRSVVNUIE5l -dHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRydXN0LmNvbTE2MDQGA1UE -AxMtVVROLVVTRVJGaXJzdC1DbGllbnQgQXV0aGVudGljYXRpb24gYW5kIEVtYWls -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsjmFpPJ9q0E7YkY3rs3B -YHW8OWX5ShpHornMSMxqmNVNNRm5pELlzkniii8efNIxB8dOtINknS4p1aJkxIW9 -hVE1eaROaJB7HHqkkqgX8pgV8pPMyaQylbsMTzC9mKALi+VuG6JG+ni8om+rWV6l -L8/K2m2qL+usobNqqrcuZzWLeeEeaYji5kbNoKXqvgvOdjp6Dpvq/NonWz1zHyLm -SGHGTPNpsaguG7bUMSAsvIKKjqQOpdeJQ/wWWq8dcdcRWdq6hw2v+vPhwvCkxWeM -1tZUOt4KpLoDd7NlyP0e03RiqhjKaJMeoYV+9Udly/hNVyh00jT/MLbu9mIwFIws -6wIDAQABo4G5MIG2MAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud -DgQWBBSJgmd9xJ0mcABLtFBIfN49rgRufTBYBgNVHR8EUTBPME2gS6BJhkdodHRw -Oi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLVVTRVJGaXJzdC1DbGllbnRBdXRoZW50 -aWNhdGlvbmFuZEVtYWlsLmNybDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUH -AwQwDQYJKoZIhvcNAQEFBQADggEBALFtYV2mGn98q0rkMPxTbyUkxsrt4jFcKw7u -7mFVbwQ+zznexRtJlOTrIEy05p5QLnLZjfWqo7NK2lYcYJeA3IKirUq9iiv/Cwm0 -xtcgBEXkzYABurorbs6q15L+5K/r9CYdFip/bDCVNy8zEqx/3cfREYxRmLLQo5HQ -rfafnoOTHh1CuEava2bwm3/q4wMC5QJRwarVNZ1yQAOJujEdxRBoUp7fooXFXAim -eOZTT7Hot9MUnpOmw2TjrH5xzbyf6QMbzPvprDHBr3wVdAKZw7JHpsIyYdfHb0gk -USeh1YdV8nuPmD0Wnu51tvjQjvLzxq4oW6fw8zYX/MMF08oDSlQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB -lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt -SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG -A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe -MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v -d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh -cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn -0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ -M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a -MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd -oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI -DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy -oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD -VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0 -dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy -bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF -BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM -//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli -CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE -CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t -3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS -KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB -ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug -Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho -dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt -TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1 -NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0 -IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD -VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS -Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2 -N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH -iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe -YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1 -axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g -yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD -AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh -ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V -VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB -BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y -IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs -QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4 -ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM -YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb -QErNaLly7HF27FSOH4UMAWr6pjisH8SE ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy -NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y -LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+ -TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y -TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0 -LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW -I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw -nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0 -IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz -BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y -aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG -9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy -NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y -azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs -YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw -Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl -cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY -dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9 -WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS -v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v -UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu -IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC -W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05 -NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD -VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp -bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB -jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N -H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR -4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN -BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo -EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5 -FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx -lA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK -VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm -Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J -h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul -uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68 -DzFc6PLZ ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4 -nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO -8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV -ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb -PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2 -6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr -n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a -qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4 -wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3 -ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs -pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4 -E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh -YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7 -FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg -J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc -r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns -YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH -MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y -aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe -Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX -MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj -IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx -KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s -eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B -AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM -HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw -DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC -AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji -nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX -rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn -jBJ7xUS0rg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy -aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s -IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp -Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 -eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV -BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp -Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu -Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g -Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt -IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU -J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO -JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY -wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o -koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN -qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E -Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe -xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u -7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU -sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI -sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP -cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz -cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2 -MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV -BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt -YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN -ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE -BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is -I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G -CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do -lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc -AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4 -pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0 -13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk -U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i -F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY -oJ2daZH9 ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b -N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t -KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu -kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm -CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ -Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu -imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te -2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe -DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC -/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p -F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt -TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB -yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL -ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp -U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW -ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 -aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL -MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW -ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln -biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp -U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y -aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 -nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex -t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz -SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG -BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ -rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ -NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E -BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH -BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy -aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv -MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE -p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y -5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK -WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ -4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N -hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ -BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh -c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy -MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp -emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X -DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw -FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg -UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo -YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5 -MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB -AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM -HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK -qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID -AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj -cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y -cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP -T8qAkbYp ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw -CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl -cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu -LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT -aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp -dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD -VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT -aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ -bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu -IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg -LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1 -GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ -+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd -U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm -NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY -ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ -ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1 -CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq -g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm -fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c -2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/ -bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG -A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD -VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0 -MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV -BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy -dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ -ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII -0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI -uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI -hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3 -YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc -1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB -wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL -EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1 -dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv -cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO -VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx -OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j -b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1 -dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli -zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU -/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11 -S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/ -AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0 -dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0 -cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG -AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j -b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW -HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea -w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU -58dzq6wf7iWbwBbtt8pb8BQ= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr -MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl -cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv -bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw -CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h -dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l -cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h -2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E -lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV -ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq -299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t -vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL -dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD -AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF -AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR -zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3 -LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd -7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw -++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt -398znM/jra6O1I7mT1GvFpLgXPYHDw== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx -DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2 -aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1 -MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT -QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp -b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX -ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i -/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU -58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g -halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E -1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ -ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG -MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb -mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ -kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN -dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ -ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn -B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC -VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD -ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0 -MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww -KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G -A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi -MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13 -5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE -SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O -JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu -ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE -AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB -AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB -CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw -b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo -7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/ -0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7 -nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx -x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ -33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx -IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs -cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v -dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0 -MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl -bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD -DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw -ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r -WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU -Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs -HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj -z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf -SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl -AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG -KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P -AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j -BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC -VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX -ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg -Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB -ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd -/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB -A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn -k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9 -iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv -2G0xffX8oRAHh84vWdw+WNs= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB -gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk -MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY -UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx -NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3 -dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy -dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB -dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6 -38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP -KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q -DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4 -qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa -JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi -PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P -BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs -jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0 -eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD -ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR -vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt -qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa -IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy -i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ -O+7ETPTsJ3xCwnR8gooJybQDJbw= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw -OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu -ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h -gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K -5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy -9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE -gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3 -eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs -YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp -aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp -dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb -sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB -FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy -f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W -+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2 -uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf -tXncwKJrMiE3lvgOOBITRzcahirLer4c ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa -Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g -eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND -IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu -QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui -me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm -RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/ -OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G -O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G -A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF -BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI -KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh -c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl -cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw -HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX -hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV -Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw -6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF -6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e -Pr3WHV1wA7EY6oT4zBx+2gT9XBTB ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE -ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE -AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ -BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT -aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN -AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl -KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX -GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj -93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+ -P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow -ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g -ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN -W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB -IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB -ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA -ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb -MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv -J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW -pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J -HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu -dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD -QSBLbGFzYSAyMB4XDTAzMTAxNDExNTgyMloXDTE3MDQxODEyNTMwN1owdzELMAkG -A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV -BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEhMB8GA1UEAxMYQ0MgU2ln -bmV0IC0gT0NTUCBLbGFzYSAyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCo -VCsaBStblXQYVNthe3dvaCrfvKpPXngh4almm988iIlEv9CVTaAdCfaJNihvA+Vs -Qw8++ix1VqteMQE474/MV/YaXigP0Zr0QB+g+/7PWVlv+5U9Gzp9+Xx4DJay8AoI -iB7Iy5Qf9iZiHm5BiPRIuUXT4ZRbZRYPh0/76vgRsQIDAQABo4IBkjCCAY4wDgYD -VR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEEGA1UdHwQ6MDgwNqA0 -oDKGMGh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9jcmwva2xhc2Ey -LmNybDCB2AYDVR0gBIHQMIHNMIHKBg4rBgEEAb4/AoFICgwBADCBtzBsBggrBgEF -BQcCAjBgGl5DZXJ0eWZpa2F0IHd5ZGFueSB6Z29kbmllIHogZG9rdW1lbnRlbSAi -UG9saXR5a2EgQ2VydHlmaWthY2ppIC0gQ2VydHlmaWthdHkgcmVzcG9uZGVyb3cg -T0NTUCIuMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0 -b3JpdW0vZG9rdW1lbnR5L3BjX29jc3BfMV8wLnBkZjAfBgNVHSMEGDAWgBS7RQZS -C8uBzSlUs7x8QUzNBw6MJTAdBgNVHQ4EFgQUKEVrOY7cEHvsVgvoyZdytlbtgwEw -CQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOCAQEAQrRg5MV6dxr0HU2IsLInxhvt -iUVmSFkIUsBCjzLoewOXA16d2oDyHhI/eE+VgAsp+2ANjZu4xRteHIHoYMsN218M -eD2MLRsYS0U9xxAFK9gDj/KscPbrrdoqLvtPSMhUb4adJS9HLhvUe6BicvBf3A71 -iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp -ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv -hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ -TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg -U2lnbmV0IC0gQ0EgS2xhc2EgMzEXMBUGA1UEBRMOTnVtZXIgd3Bpc3U6IDQwHhcN -MDMxMDE0MTIwODAwWhcNMDgwNDI4MTA1MDU1WjB3MQswCQYDVQQGEwJQTDEfMB0G -A1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBD -ZXJ0eWZpa2FjamkgU2lnbmV0MSEwHwYDVQQDExhDQyBTaWduZXQgLSBPQ1NQIEts -YXNhIDMwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM/9GwvARNuCVN+PqZmO -4FqH8vTqhenUyqRkmAVT4YhLu0a9AXeLAYVDu+NTkYzsAUMAfu55rIKHNLlm6WbF -KvLiKKz4p4pbUr+ToPcwl/TDotidloUdBAxDg0SL+PmQqACZDe3seJho2IYf2vDL -/G4TLMbKmNB0mlWFuN0f4fJNAgMBAAGjggGgMIIBnDAOBgNVHQ8BAf8EBAMCB4Aw -EwYDVR0lBAwwCgYIKwYBBQUHAwkwTwYDVR0fBEgwRjBEoEKgQIY+aHR0cDovL3d3 -dy5zaWduZXQucGwva3dhbGlmaWtvd2FuZS9yZXBvenl0b3JpdW0vY3JsL2tsYXNh -My5jcmwwgdgGA1UdIASB0DCBzTCBygYOKwYBBAG+PwKCLAoCAQAwgbcwbAYIKwYB -BQUHAgIwYBpeQ2VydHlmaWthdCB3eWRhbnkgemdvZG5pZSB6IGRva3VtZW50ZW0g -IlBvbGl0eWthIENlcnR5ZmlrYWNqaSAtIENlcnR5ZmlrYXR5IHJlc3BvbmRlcm93 -IE9DU1AiLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5 -dG9yaXVtL2Rva3VtZW50eS9wY19vY3NwXzFfMC5wZGYwHwYDVR0jBBgwFoAUe2PM -GZB6tM62O559bRUnUND5SbkwHQYDVR0OBBYEFG4jnCMvBALRQXtmDn9TyXQ/EKP+ -MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADggEBACXrKG5Def5lpRwmZom3UEDq -bl7y4U3qomG4B+ok2FVZGgPZti+ZgvrenPj7PtbYCUBPsCSTNrznKinoT3gD9lQQ -xkEHwdc6VD1GlFp+qI64u0+wS9Epatrdf7aBnizrOIB4LJd4E2TWQ6trspetjMIU -upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk -GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug -5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma -M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+ -HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW -Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9 -JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x -W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE -82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx -UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan -ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2 -2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV -tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw -OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu -ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue -Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA -iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE -OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db -w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC -3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P -AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC -AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0 -eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6 -IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z -aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw -OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy -bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM -ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4 -7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG -dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF -JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz -1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw -OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v -LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu -ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks -ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX -REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D -CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU -YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP -l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8 -MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz -dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg -Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg -Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt -L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf -BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN -AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI -cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1 -CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW -ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB -KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE -ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg -U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX -DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6 -IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg -U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd -uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v -LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c -ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w -bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM -MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH -AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr -YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC -ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf -MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO -Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz -+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB -vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx -EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE -ChMfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9z -dG1hc3RlcjEgMB4GA1UEAxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkq -hkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDMwMTE1MTYyOTE3 -WhcNMDcwMTE0MTYyOTE3WjCBvjELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0luZGlh -bmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdhcmUgaW4g -dGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEgMB4GA1UE -AxMXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxJTAjBgkqhkiG9w0BCQEWFmhvc3Rt -YXN0ZXJAc3BpLWluYy5vcmcwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAPB6 -rdoiLR3RodtM22LMcfwfqb5OrJNl7fwmvskgF7yP6sdD2bOfDIXhg9852jhY8/kL -VOFe1ELAL2OyN4RAxk0rliZQVgeTgqvgkOVIBbNwgnjN6mqtuWzFiPL+NXQExq40 -I3whM+4lEiwSHaV+MYxWanMdhc+kImT50LKfkxcdAgMBAAGjggEfMIIBGzAdBgNV -HQ4EFgQUB63oQR1/vda/G4F6P4xLiN4E0vowgesGA1UdIwSB4zCB4IAUB63oQR1/ -vda/G4F6P4xLiN4E0vqhgcSkgcEwgb4xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdJ -bmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9saXMxKDAmBgNVBAoTH1NvZnR3YXJl -IGluIHRoZSBQdWJsaWMgSW50ZXJlc3QxEzARBgNVBAsTCmhvc3RtYXN0ZXIxIDAe -BgNVBAMTF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcN -AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW -iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms -1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIIDjCCBfagAwIBAgIJAOiOtsn4KhQoMA0GCSqGSIb3DQEBBQUAMIG8MQswCQYD -VQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UEBxMMSW5kaWFuYXBvbGlz -MSgwJgYDVQQKEx9Tb2Z0d2FyZSBpbiB0aGUgUHVibGljIEludGVyZXN0MRMwEQYD -VQQLEwpob3N0bWFzdGVyMR4wHAYDVQQDExVDZXJ0aWZpY2F0ZSBBdXRob3JpdHkx -JTAjBgkqhkiG9w0BCQEWFmhvc3RtYXN0ZXJAc3BpLWluYy5vcmcwHhcNMDgwNTEz -MDgwNzU2WhcNMTgwNTExMDgwNzU2WjCBvDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT -B0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMfU29mdHdh -cmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1hc3RlcjEe -MBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcNAQkBFhZo -b3N0bWFzdGVyQHNwaS1pbmMub3JnMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC -CgKCAgEA3DbmR0LCxFF1KYdAw9iOIQbSGE7r7yC9kDyFEBOMKVuUY/b0LfEGQpG5 -GcRCaQi/izZF6igFM0lIoCdDkzWKQdh4s/Dvs24t3dHLfer0dSbTPpA67tfnLAS1 -fOH1fMVO73e9XKKTM5LOfYFIz2u1IiwIg/3T1c87Lf21SZBb9q1NE8re06adU1Fx -Y0b4ShZcmO4tbZoWoXaQ4mBDmdaJ1mwuepiyCwMs43pPx93jzONKao15Uvr0wa8u -jyoIyxspgpJyQ7zOiKmqp4pRQ1WFmjcDeJPI8L20QcgHQprLNZd6ioFl3h1UCAHx -ZFy3FxpRvB7DWYd2GBaY7r/2Z4GLBjXFS21ZGcfSxki+bhQog0oQnBv1b7ypjvVp -/rLBVcznFMn5WxRTUQfqzj3kTygfPGEJ1zPSbqdu1McTCW9rXRTunYkbpWry9vjQ -co7qch8vNGopCsUK7BxAhRL3pqXTT63AhYxMfHMgzFMY8bJYTAH1v+pk1Vw5xc5s -zFNaVrpBDyXfa1C2x4qgvQLCxTtVpbJkIoRRKFauMe5e+wsWTUYFkYBE7axt8Feo -+uthSKDLG7Mfjs3FIXcDhB78rKNDCGOM7fkn77SwXWfWT+3Qiz5dW8mRvZYChD3F -TbxCP3T9PF2sXEg2XocxLxhsxGjuoYvJWdAY4wCAs1QnLpnwFVMCAwEAAaOCAg8w -ggILMB0GA1UdDgQWBBQ0cdE41xU2g0dr1zdkQjuOjVKdqzCB8QYDVR0jBIHpMIHm -gBQ0cdE41xU2g0dr1zdkQjuOjVKdq6GBwqSBvzCBvDELMAkGA1UEBhMCVVMxEDAO -BgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UEChMf -U29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDETMBEGA1UECxMKaG9zdG1h -c3RlcjEeMBwGA1UEAxMVQ2VydGlmaWNhdGUgQXV0aG9yaXR5MSUwIwYJKoZIhvcN -AQkBFhZob3N0bWFzdGVyQHNwaS1pbmMub3JnggkA6I62yfgqFCgwDwYDVR0TAQH/ -BAUwAwEB/zARBglghkgBhvhCAQEEBAMCAAcwCQYDVR0SBAIwADAuBglghkgBhvhC -AQ0EIRYfU29mdHdhcmUgaW4gdGhlIFB1YmxpYyBJbnRlcmVzdDAwBglghkgBhvhC -AQQEIxYhaHR0cHM6Ly9jYS5zcGktaW5jLm9yZy9jYS1jcmwucGVtMDIGCWCGSAGG -+EIBAwQlFiNodHRwczovL2NhLnNwaS1pbmMub3JnL2NlcnQtY3JsLnBlbTAhBgNV -HREEGjAYgRZob3N0bWFzdGVyQHNwaS1pbmMub3JnMA4GA1UdDwEB/wQEAwIBBjAN -BgkqhkiG9w0BAQUFAAOCAgEAtM294LnqsgMrfjLp3nI/yUuCXp3ir1UJogxU6M8Y -PCggHam7AwIvUjki+RfPrWeQswN/2BXja367m1YBrzXU2rnHZxeb1NUON7MgQS4M -AcRb+WU+wmHo0vBqlXDDxm/VNaSsWXLhid+hoJ0kvSl56WEq2dMeyUakCHhBknIP -qxR17QnwovBc78MKYiC3wihmrkwvLo9FYyaW8O4x5otVm6o6+YI5HYg84gd1GuEP -sTC8cTLSOv76oYnzQyzWcsR5pxVIBcDYLXIC48s9Fmq6ybgREOJJhcyWR2AFJS7v -dVkz9UcZFu/abF8HyKZQth3LZjQl/GaD68W2MEH4RkRiqMEMVObqTFoo5q7Gt/5/ -O5aoLu7HaD7dAD0prypjq1/uSSotxdz70cbT0ZdWUoa2lOvUYFG3/B6bzAKb1B+P -+UqPti4oOxfMxaYF49LTtcYDyeFIQpvLP+QX4P4NAZUJurgNceQJcHdC2E3hQqlg -g9cXiUPS1N2nGLar1CQlh7XU4vwuImm9rWgs/3K1mKoGnOcqarihk3bOsPN/nOHg -T7jYhkalMwIsJWE3KpLIrIF0aGOHM3a9BX9e1dUCbb2v/ypaqknsmHlHU5H2DjRa -yaXG67Ljxay2oHA1u8hRadDytaIybrw/oDc5fHE2pgXfDBLkFqfF1stjo5VwP+YE -o2A= ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc -MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj -IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB -IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE -RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl -U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290 -IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU -ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC -QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr -rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S -NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc -QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH -txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP -BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC -AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp -tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa -IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl -6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+ -xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU -Cm26OWMohpLzGITY+9HPBVZkVw== ------END CERTIFICATE----- - diff --git a/vendor/tornado/concurrent.py b/vendor/tornado/concurrent.py index 8a4f2287..acfbcd83 100644 --- a/vendor/tornado/concurrent.py +++ b/vendor/tornado/concurrent.py @@ -25,8 +25,11 @@ module. from __future__ import absolute_import, division, print_function, with_statement import functools +import platform +import traceback import sys +from tornado.log import app_log from tornado.stack_context import ExceptionStackContext, wrap from tornado.util import raise_exc_info, ArgReplacer @@ -36,55 +39,245 @@ except ImportError: futures = None +# Can the garbage collector handle cycles that include __del__ methods? +# This is true in cpython beginning with version 3.4 (PEP 442). +_GC_CYCLE_FINALIZERS = (platform.python_implementation() == 'CPython' and + sys.version_info >= (3, 4)) + class ReturnValueIgnoredError(Exception): pass +# This class and associated code in the future object is derived +# from the Trollius project, a backport of asyncio to Python 2.x - 3.x -class _DummyFuture(object): +class _TracebackLogger(object): + """Helper to log a traceback upon destruction if not cleared. + + This solves a nasty problem with Futures and Tasks that have an + exception set: if nobody asks for the exception, the exception is + never logged. This violates the Zen of Python: 'Errors should + never pass silently. Unless explicitly silenced.' + + However, we don't want to log the exception as soon as + set_exception() is called: if the calling code is written + properly, it will get the exception and handle it properly. But + we *do* want to log it if result() or exception() was never called + -- otherwise developers waste a lot of time wondering why their + buggy code fails silently. + + An earlier attempt added a __del__() method to the Future class + itself, but this backfired because the presence of __del__() + prevents garbage collection from breaking cycles. A way out of + this catch-22 is to avoid having a __del__() method on the Future + class itself, but instead to have a reference to a helper object + with a __del__() method that logs the traceback, where we ensure + that the helper object doesn't participate in cycles, and only the + Future has a reference to it. + + The helper object is added when set_exception() is called. When + the Future is collected, and the helper is present, the helper + object is also collected, and its __del__() method will log the + traceback. When the Future's result() or exception() method is + called (and a helper object is present), it removes the the helper + object, after calling its clear() method to prevent it from + logging. + + One downside is that we do a fair amount of work to extract the + traceback from the exception, even when it is never logged. It + would seem cheaper to just store the exception object, but that + references the traceback, which references stack frames, which may + reference the Future, which references the _TracebackLogger, and + then the _TracebackLogger would be included in a cycle, which is + what we're trying to avoid! As an optimization, we don't + immediately format the exception; we only do the work when + activate() is called, which call is delayed until after all the + Future's callbacks have run. Since usually a Future has at least + one callback (typically set by 'yield From') and usually that + callback extracts the callback, thereby removing the need to + format the exception. + + PS. I don't claim credit for this solution. I first heard of it + in a discussion about closing files when they are collected. + """ + + __slots__ = ('exc_info', 'formatted_tb') + + def __init__(self, exc_info): + self.exc_info = exc_info + self.formatted_tb = None + + def activate(self): + exc_info = self.exc_info + if exc_info is not None: + self.exc_info = None + self.formatted_tb = traceback.format_exception(*exc_info) + + def clear(self): + self.exc_info = None + self.formatted_tb = None + + def __del__(self): + if self.formatted_tb: + app_log.error('Future exception was never retrieved: %s', + ''.join(self.formatted_tb).rstrip()) + + +class Future(object): + """Placeholder for an asynchronous result. + + A ``Future`` encapsulates the result of an asynchronous + operation. In synchronous applications ``Futures`` are used + to wait for the result from a thread or process pool; in + Tornado they are normally used with `.IOLoop.add_future` or by + yielding them in a `.gen.coroutine`. + + `tornado.concurrent.Future` is similar to + `concurrent.futures.Future`, but not thread-safe (and therefore + faster for use with single-threaded event loops). + + In addition to ``exception`` and ``set_exception``, methods ``exc_info`` + and ``set_exc_info`` are supported to capture tracebacks in Python 2. + The traceback is automatically available in Python 3, but in the + Python 2 futures backport this information is discarded. + This functionality was previously available in a separate class + ``TracebackFuture``, which is now a deprecated alias for this class. + + .. versionchanged:: 4.0 + `tornado.concurrent.Future` is always a thread-unsafe ``Future`` + with support for the ``exc_info`` methods. Previously it would + be an alias for the thread-safe `concurrent.futures.Future` + if that package was available and fall back to the thread-unsafe + implementation if it was not. + + .. versionchanged:: 4.1 + If a `.Future` contains an error but that error is never observed + (by calling ``result()``, ``exception()``, or ``exc_info()``), + a stack trace will be logged when the `.Future` is garbage collected. + This normally indicates an error in the application, but in cases + where it results in undesired logging it may be necessary to + suppress the logging by ensuring that the exception is observed: + ``f.add_done_callback(lambda f: f.exception())``. + """ def __init__(self): self._done = False self._result = None - self._exception = None + self._exc_info = None + + self._log_traceback = False # Used for Python >= 3.4 + self._tb_logger = None # Used for Python <= 3.3 + self._callbacks = [] def cancel(self): + """Cancel the operation, if possible. + + Tornado ``Futures`` do not support cancellation, so this method always + returns False. + """ return False def cancelled(self): + """Returns True if the operation has been cancelled. + + Tornado ``Futures`` do not support cancellation, so this method + always returns False. + """ return False def running(self): + """Returns True if this operation is currently running.""" return not self._done def done(self): + """Returns True if the future has finished running.""" return self._done + def _clear_tb_log(self): + self._log_traceback = False + if self._tb_logger is not None: + self._tb_logger.clear() + self._tb_logger = None + def result(self, timeout=None): + """If the operation succeeded, return its result. If it failed, + re-raise its exception. + """ + self._clear_tb_log() + if self._result is not None: + return self._result + if self._exc_info is not None: + raise_exc_info(self._exc_info) self._check_done() - if self._exception: - raise self._exception return self._result def exception(self, timeout=None): - self._check_done() - if self._exception: - return self._exception + """If the operation raised an exception, return the `Exception` + object. Otherwise returns None. + """ + self._clear_tb_log() + if self._exc_info is not None: + return self._exc_info[1] else: + self._check_done() return None def add_done_callback(self, fn): + """Attaches the given callback to the `Future`. + + It will be invoked with the `Future` as its argument when the Future + has finished running and its result is available. In Tornado + consider using `.IOLoop.add_future` instead of calling + `add_done_callback` directly. + """ if self._done: fn(self) else: self._callbacks.append(fn) def set_result(self, result): + """Sets the result of a ``Future``. + + It is undefined to call any of the ``set`` methods more than once + on the same object. + """ self._result = result self._set_done() def set_exception(self, exception): - self._exception = exception - self._set_done() + """Sets the exception of a ``Future.``""" + self.set_exc_info( + (exception.__class__, + exception, + getattr(exception, '__traceback__', None))) + + def exc_info(self): + """Returns a tuple in the same format as `sys.exc_info` or None. + + .. versionadded:: 4.0 + """ + self._clear_tb_log() + return self._exc_info + + def set_exc_info(self, exc_info): + """Sets the exception information of a ``Future.`` + + Preserves tracebacks on Python 2. + + .. versionadded:: 4.0 + """ + self._exc_info = exc_info + self._log_traceback = True + if not _GC_CYCLE_FINALIZERS: + self._tb_logger = _TracebackLogger(exc_info) + + try: + self._set_done() + finally: + # Activate the logger after all callbacks have had a + # chance to call result() or exception(). + if self._log_traceback and self._tb_logger is not None: + self._tb_logger.activate() + self._exc_info = exc_info def _check_done(self): if not self._done: @@ -93,42 +286,38 @@ class _DummyFuture(object): def _set_done(self): self._done = True for cb in self._callbacks: - # TODO: error handling - cb(self) + try: + cb(self) + except Exception: + app_log.exception('exception calling callback %r for %r', + cb, self) self._callbacks = None + # On Python 3.3 or older, objects with a destructor part of a reference + # cycle are never destroyed. It's no longer the case on Python 3.4 thanks to + # the PEP 442. + if _GC_CYCLE_FINALIZERS: + def __del__(self): + if not self._log_traceback: + # set_exception() was not called, or result() or exception() + # has consumed the exception + return + + tb = traceback.format_exception(*self._exc_info) + + app_log.error('Future %r exception was never retrieved: %s', + self, ''.join(tb).rstrip()) + +TracebackFuture = Future + if futures is None: - Future = _DummyFuture + FUTURES = Future else: - Future = futures.Future + FUTURES = (futures.Future, Future) -class TracebackFuture(Future): - """Subclass of `Future` which can store a traceback with - exceptions. - - The traceback is automatically available in Python 3, but in the - Python 2 futures backport this information is discarded. - """ - def __init__(self): - super(TracebackFuture, self).__init__() - self.__exc_info = None - - def exc_info(self): - return self.__exc_info - - def set_exc_info(self, exc_info): - """Traceback-aware replacement for - `~concurrent.futures.Future.set_exception`. - """ - self.__exc_info = exc_info - self.set_exception(exc_info[1]) - - def result(self): - if self.__exc_info is not None: - raise_exc_info(self.__exc_info) - else: - return super(TracebackFuture, self).result() +def is_future(x): + return isinstance(x, FUTURES) class DummyExecutor(object): @@ -151,6 +340,9 @@ def run_on_executor(fn): The decorated method may be called with a ``callback`` keyword argument and returns a future. + + This decorator should be used only on methods of objects with attributes + ``executor`` and ``io_loop``. """ @functools.wraps(fn) def wrapper(self, *args, **kwargs): @@ -228,7 +420,7 @@ def return_future(f): # If the initial synchronous part of f() raised an exception, # go ahead and raise it to the caller directly without waiting # for them to inspect the Future. - raise_exc_info(exc_info) + future.result() # If the caller passed in a callback, schedule it to be called # when the future resolves. It is important that this happens @@ -251,10 +443,13 @@ def return_future(f): def chain_future(a, b): """Chain two futures together so that when one completes, so does the other. - The result (success or failure) of ``a`` will be copied to ``b``. + The result (success or failure) of ``a`` will be copied to ``b``, unless + ``b`` has already been completed or cancelled by the time ``a`` finishes. """ def copy(future): assert future is a + if b.done(): + return if (isinstance(a, TracebackFuture) and isinstance(b, TracebackFuture) and a.exc_info() is not None): b.set_exc_info(a.exc_info()) diff --git a/vendor/tornado/curl_httpclient.py b/vendor/tornado/curl_httpclient.py index e0900569..ebbe0e84 100644 --- a/vendor/tornado/curl_httpclient.py +++ b/vendor/tornado/curl_httpclient.py @@ -19,25 +19,21 @@ from __future__ import absolute_import, division, print_function, with_statement import collections +import functools import logging import pycurl import threading import time +from io import BytesIO from tornado import httputil from tornado import ioloop -from tornado.log import gen_log from tornado import stack_context from tornado.escape import utf8, native_str from tornado.httpclient import HTTPResponse, HTTPError, AsyncHTTPClient, main -from tornado.util import bytes_type - -try: - from io import BytesIO # py3 -except ImportError: - from cStringIO import StringIO as BytesIO # py2 +curl_log = logging.getLogger('tornado.curl_httpclient') class CurlAsyncHTTPClient(AsyncHTTPClient): def initialize(self, io_loop, max_clients=10, defaults=None): @@ -45,24 +41,12 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): self._multi = pycurl.CurlMulti() self._multi.setopt(pycurl.M_TIMERFUNCTION, self._set_timeout) self._multi.setopt(pycurl.M_SOCKETFUNCTION, self._handle_socket) - self._curls = [_curl_create() for i in range(max_clients)] + self._curls = [self._curl_create() for i in range(max_clients)] self._free_list = self._curls[:] self._requests = collections.deque() self._fds = {} self._timeout = None - try: - self._socket_action = self._multi.socket_action - except AttributeError: - # socket_action is found in pycurl since 7.18.2 (it's been - # in libcurl longer than that but wasn't accessible to - # python). - gen_log.warning("socket_action method missing from pycurl; " - "falling back to socket_all. Upgrading " - "libcurl and pycurl will improve performance") - self._socket_action = \ - lambda fd, action: self._multi.socket_all() - # libcurl has bugs that sometimes cause it to not report all # relevant file descriptors and timeouts to TIMERFUNCTION/ # SOCKETFUNCTION. Mitigate the effects of such bugs by @@ -87,7 +71,6 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): for curl in self._curls: curl.close() self._multi.close() - self._closed = True super(CurlAsyncHTTPClient, self).close() def fetch_impl(self, request, callback): @@ -143,7 +126,7 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): action |= pycurl.CSELECT_OUT while True: try: - ret, num_handles = self._socket_action(fd, action) + ret, num_handles = self._multi.socket_action(fd, action) except pycurl.error as e: ret = e.args[0] if ret != pycurl.E_CALL_MULTI_PERFORM: @@ -156,7 +139,7 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): self._timeout = None while True: try: - ret, num_handles = self._socket_action( + ret, num_handles = self._multi.socket_action( pycurl.SOCKET_TIMEOUT, 0) except pycurl.error as e: ret = e.args[0] @@ -224,13 +207,8 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): "callback": callback, "curl_start_time": time.time(), } - # Disable IPv6 to mitigate the effects of this bug - # on curl versions <= 7.21.0 - # http://sourceforge.net/tracker/?func=detail&aid=3017819&group_id=976&atid=100976 - if pycurl.version_info()[2] <= 0x71500: # 7.21.0 - curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4) - _curl_setup_request(curl, request, curl.info["buffer"], - curl.info["headers"]) + self._curl_setup_request(curl, request, curl.info["buffer"], + curl.info["headers"]) self._multi.add_handle(curl) if not started: @@ -268,6 +246,7 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): info["callback"](HTTPResponse( request=info["request"], code=code, headers=info["headers"], buffer=buffer, effective_url=effective_url, error=error, + reason=info['headers'].get("X-Http-Reason", None), request_time=time.time() - info["curl_start_time"], time_info=time_info)) except Exception: @@ -276,6 +255,206 @@ class CurlAsyncHTTPClient(AsyncHTTPClient): def handle_callback_exception(self, callback): self.io_loop.handle_callback_exception(callback) + def _curl_create(self): + curl = pycurl.Curl() + if curl_log.isEnabledFor(logging.DEBUG): + curl.setopt(pycurl.VERBOSE, 1) + curl.setopt(pycurl.DEBUGFUNCTION, self._curl_debug) + return curl + + def _curl_setup_request(self, curl, request, buffer, headers): + curl.setopt(pycurl.URL, native_str(request.url)) + + # libcurl's magic "Expect: 100-continue" behavior causes delays + # with servers that don't support it (which include, among others, + # Google's OpenID endpoint). Additionally, this behavior has + # a bug in conjunction with the curl_multi_socket_action API + # (https://sourceforge.net/tracker/?func=detail&atid=100976&aid=3039744&group_id=976), + # which increases the delays. It's more trouble than it's worth, + # so just turn off the feature (yes, setting Expect: to an empty + # value is the official way to disable this) + if "Expect" not in request.headers: + request.headers["Expect"] = "" + + # libcurl adds Pragma: no-cache by default; disable that too + if "Pragma" not in request.headers: + request.headers["Pragma"] = "" + + curl.setopt(pycurl.HTTPHEADER, + ["%s: %s" % (native_str(k), native_str(v)) + for k, v in request.headers.get_all()]) + + curl.setopt(pycurl.HEADERFUNCTION, + functools.partial(self._curl_header_callback, + headers, request.header_callback)) + if request.streaming_callback: + write_function = lambda chunk: self.io_loop.add_callback( + request.streaming_callback, chunk) + else: + write_function = buffer.write + if bytes is str: # py2 + curl.setopt(pycurl.WRITEFUNCTION, write_function) + else: # py3 + # Upstream pycurl doesn't support py3, but ubuntu 12.10 includes + # a fork/port. That version has a bug in which it passes unicode + # strings instead of bytes to the WRITEFUNCTION. This means that + # if you use a WRITEFUNCTION (which tornado always does), you cannot + # download arbitrary binary data. This needs to be fixed in the + # ported pycurl package, but in the meantime this lambda will + # make it work for downloading (utf8) text. + curl.setopt(pycurl.WRITEFUNCTION, lambda s: write_function(utf8(s))) + curl.setopt(pycurl.FOLLOWLOCATION, request.follow_redirects) + curl.setopt(pycurl.MAXREDIRS, request.max_redirects) + curl.setopt(pycurl.CONNECTTIMEOUT_MS, int(1000 * request.connect_timeout)) + curl.setopt(pycurl.TIMEOUT_MS, int(1000 * request.request_timeout)) + if request.user_agent: + curl.setopt(pycurl.USERAGENT, native_str(request.user_agent)) + else: + curl.setopt(pycurl.USERAGENT, "Mozilla/5.0 (compatible; pycurl)") + if request.network_interface: + curl.setopt(pycurl.INTERFACE, request.network_interface) + if request.decompress_response: + curl.setopt(pycurl.ENCODING, "gzip,deflate") + else: + curl.setopt(pycurl.ENCODING, "none") + if request.proxy_host and request.proxy_port: + curl.setopt(pycurl.PROXY, request.proxy_host) + curl.setopt(pycurl.PROXYPORT, request.proxy_port) + if request.proxy_username: + credentials = '%s:%s' % (request.proxy_username, + request.proxy_password) + curl.setopt(pycurl.PROXYUSERPWD, credentials) + else: + curl.setopt(pycurl.PROXY, '') + curl.unsetopt(pycurl.PROXYUSERPWD) + if request.validate_cert: + curl.setopt(pycurl.SSL_VERIFYPEER, 1) + curl.setopt(pycurl.SSL_VERIFYHOST, 2) + else: + curl.setopt(pycurl.SSL_VERIFYPEER, 0) + curl.setopt(pycurl.SSL_VERIFYHOST, 0) + if request.ca_certs is not None: + curl.setopt(pycurl.CAINFO, request.ca_certs) + else: + # There is no way to restore pycurl.CAINFO to its default value + # (Using unsetopt makes it reject all certificates). + # I don't see any way to read the default value from python so it + # can be restored later. We'll have to just leave CAINFO untouched + # if no ca_certs file was specified, and require that if any + # request uses a custom ca_certs file, they all must. + pass + + if request.allow_ipv6 is False: + # Curl behaves reasonably when DNS resolution gives an ipv6 address + # that we can't reach, so allow ipv6 unless the user asks to disable. + curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4) + else: + curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_WHATEVER) + + # Set the request method through curl's irritating interface which makes + # up names for almost every single method + curl_options = { + "GET": pycurl.HTTPGET, + "POST": pycurl.POST, + "PUT": pycurl.UPLOAD, + "HEAD": pycurl.NOBODY, + } + custom_methods = set(["DELETE", "OPTIONS", "PATCH"]) + for o in curl_options.values(): + curl.setopt(o, False) + if request.method in curl_options: + curl.unsetopt(pycurl.CUSTOMREQUEST) + curl.setopt(curl_options[request.method], True) + elif request.allow_nonstandard_methods or request.method in custom_methods: + curl.setopt(pycurl.CUSTOMREQUEST, request.method) + else: + raise KeyError('unknown method ' + request.method) + + # Handle curl's cryptic options for every individual HTTP method + if request.method == "GET": + if request.body is not None: + raise ValueError('Body must be None for GET request') + elif request.method in ("POST", "PUT") or request.body: + if request.body is None: + raise ValueError( + 'Body must not be None for "%s" request' + % request.method) + + request_buffer = BytesIO(utf8(request.body)) + def ioctl(cmd): + if cmd == curl.IOCMD_RESTARTREAD: + request_buffer.seek(0) + curl.setopt(pycurl.READFUNCTION, request_buffer.read) + curl.setopt(pycurl.IOCTLFUNCTION, ioctl) + if request.method == "POST": + curl.setopt(pycurl.POSTFIELDSIZE, len(request.body)) + else: + curl.setopt(pycurl.UPLOAD, True) + curl.setopt(pycurl.INFILESIZE, len(request.body)) + + if request.auth_username is not None: + userpwd = "%s:%s" % (request.auth_username, request.auth_password or '') + + if request.auth_mode is None or request.auth_mode == "basic": + curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC) + elif request.auth_mode == "digest": + curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_DIGEST) + else: + raise ValueError("Unsupported auth_mode %s" % request.auth_mode) + + curl.setopt(pycurl.USERPWD, native_str(userpwd)) + curl_log.debug("%s %s (username: %r)", request.method, request.url, + request.auth_username) + else: + curl.unsetopt(pycurl.USERPWD) + curl_log.debug("%s %s", request.method, request.url) + + if request.client_cert is not None: + curl.setopt(pycurl.SSLCERT, request.client_cert) + + if request.client_key is not None: + curl.setopt(pycurl.SSLKEY, request.client_key) + + if threading.activeCount() > 1: + # libcurl/pycurl is not thread-safe by default. When multiple threads + # are used, signals should be disabled. This has the side effect + # of disabling DNS timeouts in some environments (when libcurl is + # not linked against ares), so we don't do it when there is only one + # thread. Applications that use many short-lived threads may need + # to set NOSIGNAL manually in a prepare_curl_callback since + # there may not be any other threads running at the time we call + # threading.activeCount. + curl.setopt(pycurl.NOSIGNAL, 1) + if request.prepare_curl_callback is not None: + request.prepare_curl_callback(curl) + + def _curl_header_callback(self, headers, header_callback, header_line): + header_line = native_str(header_line) + if header_callback is not None: + self.io_loop.add_callback(header_callback, header_line) + # header_line as returned by curl includes the end-of-line characters. + header_line = header_line.strip() + if header_line.startswith("HTTP/"): + headers.clear() + try: + (__, __, reason) = httputil.parse_response_start_line(header_line) + header_line = "X-Http-Reason: %s" % reason + except httputil.HTTPInputError: + return + if not header_line: + return + headers.parse_line(header_line) + + def _curl_debug(self, debug_type, debug_msg): + debug_types = ('I', '<', '>', '<', '>') + if debug_type == 0: + curl_log.debug('%s', debug_msg.strip()) + elif debug_type in (1, 2): + for line in debug_msg.splitlines(): + curl_log.debug('%s %s', debug_types[debug_type], line) + elif debug_type == 4: + curl_log.debug('%s %r', debug_types[debug_type], debug_msg) + class CurlError(HTTPError): def __init__(self, errno, message): @@ -283,196 +462,6 @@ class CurlError(HTTPError): self.errno = errno -def _curl_create(): - curl = pycurl.Curl() - if gen_log.isEnabledFor(logging.DEBUG): - curl.setopt(pycurl.VERBOSE, 1) - curl.setopt(pycurl.DEBUGFUNCTION, _curl_debug) - return curl - - -def _curl_setup_request(curl, request, buffer, headers): - curl.setopt(pycurl.URL, native_str(request.url)) - - # libcurl's magic "Expect: 100-continue" behavior causes delays - # with servers that don't support it (which include, among others, - # Google's OpenID endpoint). Additionally, this behavior has - # a bug in conjunction with the curl_multi_socket_action API - # (https://sourceforge.net/tracker/?func=detail&atid=100976&aid=3039744&group_id=976), - # which increases the delays. It's more trouble than it's worth, - # so just turn off the feature (yes, setting Expect: to an empty - # value is the official way to disable this) - if "Expect" not in request.headers: - request.headers["Expect"] = "" - - # libcurl adds Pragma: no-cache by default; disable that too - if "Pragma" not in request.headers: - request.headers["Pragma"] = "" - - # Request headers may be either a regular dict or HTTPHeaders object - if isinstance(request.headers, httputil.HTTPHeaders): - curl.setopt(pycurl.HTTPHEADER, - [native_str("%s: %s" % i) for i in request.headers.get_all()]) - else: - curl.setopt(pycurl.HTTPHEADER, - [native_str("%s: %s" % i) for i in request.headers.items()]) - - if request.header_callback: - curl.setopt(pycurl.HEADERFUNCTION, request.header_callback) - else: - curl.setopt(pycurl.HEADERFUNCTION, - lambda line: _curl_header_callback(headers, line)) - if request.streaming_callback: - write_function = request.streaming_callback - else: - write_function = buffer.write - if bytes_type is str: # py2 - curl.setopt(pycurl.WRITEFUNCTION, write_function) - else: # py3 - # Upstream pycurl doesn't support py3, but ubuntu 12.10 includes - # a fork/port. That version has a bug in which it passes unicode - # strings instead of bytes to the WRITEFUNCTION. This means that - # if you use a WRITEFUNCTION (which tornado always does), you cannot - # download arbitrary binary data. This needs to be fixed in the - # ported pycurl package, but in the meantime this lambda will - # make it work for downloading (utf8) text. - curl.setopt(pycurl.WRITEFUNCTION, lambda s: write_function(utf8(s))) - curl.setopt(pycurl.FOLLOWLOCATION, request.follow_redirects) - curl.setopt(pycurl.MAXREDIRS, request.max_redirects) - curl.setopt(pycurl.CONNECTTIMEOUT_MS, int(1000 * request.connect_timeout)) - curl.setopt(pycurl.TIMEOUT_MS, int(1000 * request.request_timeout)) - if request.user_agent: - curl.setopt(pycurl.USERAGENT, native_str(request.user_agent)) - else: - curl.setopt(pycurl.USERAGENT, "Mozilla/5.0 (compatible; pycurl)") - if request.network_interface: - curl.setopt(pycurl.INTERFACE, request.network_interface) - if request.use_gzip: - curl.setopt(pycurl.ENCODING, "gzip,deflate") - else: - curl.setopt(pycurl.ENCODING, "none") - if request.proxy_host and request.proxy_port: - curl.setopt(pycurl.PROXY, request.proxy_host) - curl.setopt(pycurl.PROXYPORT, request.proxy_port) - if request.proxy_username: - credentials = '%s:%s' % (request.proxy_username, - request.proxy_password) - curl.setopt(pycurl.PROXYUSERPWD, credentials) - else: - curl.setopt(pycurl.PROXY, '') - if request.validate_cert: - curl.setopt(pycurl.SSL_VERIFYPEER, 1) - curl.setopt(pycurl.SSL_VERIFYHOST, 2) - else: - curl.setopt(pycurl.SSL_VERIFYPEER, 0) - curl.setopt(pycurl.SSL_VERIFYHOST, 0) - if request.ca_certs is not None: - curl.setopt(pycurl.CAINFO, request.ca_certs) - else: - # There is no way to restore pycurl.CAINFO to its default value - # (Using unsetopt makes it reject all certificates). - # I don't see any way to read the default value from python so it - # can be restored later. We'll have to just leave CAINFO untouched - # if no ca_certs file was specified, and require that if any - # request uses a custom ca_certs file, they all must. - pass - - if request.allow_ipv6 is False: - # Curl behaves reasonably when DNS resolution gives an ipv6 address - # that we can't reach, so allow ipv6 unless the user asks to disable. - # (but see version check in _process_queue above) - curl.setopt(pycurl.IPRESOLVE, pycurl.IPRESOLVE_V4) - - # Set the request method through curl's irritating interface which makes - # up names for almost every single method - curl_options = { - "GET": pycurl.HTTPGET, - "POST": pycurl.POST, - "PUT": pycurl.UPLOAD, - "HEAD": pycurl.NOBODY, - } - custom_methods = set(["DELETE", "OPTIONS", "PATCH"]) - for o in curl_options.values(): - curl.setopt(o, False) - if request.method in curl_options: - curl.unsetopt(pycurl.CUSTOMREQUEST) - curl.setopt(curl_options[request.method], True) - elif request.allow_nonstandard_methods or request.method in custom_methods: - curl.setopt(pycurl.CUSTOMREQUEST, request.method) - else: - raise KeyError('unknown method ' + request.method) - - # Handle curl's cryptic options for every individual HTTP method - if request.method in ("POST", "PUT"): - request_buffer = BytesIO(utf8(request.body)) - curl.setopt(pycurl.READFUNCTION, request_buffer.read) - if request.method == "POST": - def ioctl(cmd): - if cmd == curl.IOCMD_RESTARTREAD: - request_buffer.seek(0) - curl.setopt(pycurl.IOCTLFUNCTION, ioctl) - curl.setopt(pycurl.POSTFIELDSIZE, len(request.body)) - else: - curl.setopt(pycurl.INFILESIZE, len(request.body)) - - if request.auth_username is not None: - userpwd = "%s:%s" % (request.auth_username, request.auth_password or '') - - if request.auth_mode is None or request.auth_mode == "basic": - curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_BASIC) - elif request.auth_mode == "digest": - curl.setopt(pycurl.HTTPAUTH, pycurl.HTTPAUTH_DIGEST) - else: - raise ValueError("Unsupported auth_mode %s" % request.auth_mode) - - curl.setopt(pycurl.USERPWD, native_str(userpwd)) - gen_log.debug("%s %s (username: %r)", request.method, request.url, - request.auth_username) - else: - curl.unsetopt(pycurl.USERPWD) - gen_log.debug("%s %s", request.method, request.url) - - if request.client_cert is not None: - curl.setopt(pycurl.SSLCERT, request.client_cert) - - if request.client_key is not None: - curl.setopt(pycurl.SSLKEY, request.client_key) - - if threading.activeCount() > 1: - # libcurl/pycurl is not thread-safe by default. When multiple threads - # are used, signals should be disabled. This has the side effect - # of disabling DNS timeouts in some environments (when libcurl is - # not linked against ares), so we don't do it when there is only one - # thread. Applications that use many short-lived threads may need - # to set NOSIGNAL manually in a prepare_curl_callback since - # there may not be any other threads running at the time we call - # threading.activeCount. - curl.setopt(pycurl.NOSIGNAL, 1) - if request.prepare_curl_callback is not None: - request.prepare_curl_callback(curl) - - -def _curl_header_callback(headers, header_line): - # header_line as returned by curl includes the end-of-line characters. - header_line = header_line.strip() - if header_line.startswith("HTTP/"): - headers.clear() - return - if not header_line: - return - headers.parse_line(header_line) - - -def _curl_debug(debug_type, debug_msg): - debug_types = ('I', '<', '>', '<', '>') - if debug_type == 0: - gen_log.debug('%s', debug_msg.strip()) - elif debug_type in (1, 2): - for line in debug_msg.splitlines(): - gen_log.debug('%s %s', debug_types[debug_type], line) - elif debug_type == 4: - gen_log.debug('%s %r', debug_types[debug_type], debug_msg) - if __name__ == "__main__": AsyncHTTPClient.configure(CurlAsyncHTTPClient) main() diff --git a/vendor/tornado/escape.py b/vendor/tornado/escape.py index 91c3e740..24be2264 100644 --- a/vendor/tornado/escape.py +++ b/vendor/tornado/escape.py @@ -25,7 +25,7 @@ from __future__ import absolute_import, division, print_function, with_statement import re import sys -from tornado.util import bytes_type, unicode_type, basestring_type, u +from tornado.util import unicode_type, basestring_type, u try: from urllib.parse import parse_qs as _parse_qs # py3 @@ -49,12 +49,22 @@ try: except NameError: unichr = chr -_XHTML_ESCAPE_RE = re.compile('[&<>"]') -_XHTML_ESCAPE_DICT = {'&': '&', '<': '<', '>': '>', '"': '"'} +_XHTML_ESCAPE_RE = re.compile('[&<>"\']') +_XHTML_ESCAPE_DICT = {'&': '&', '<': '<', '>': '>', '"': '"', + '\'': '''} def xhtml_escape(value): - """Escapes a string so it is valid within HTML or XML.""" + """Escapes a string so it is valid within HTML or XML. + + Escapes the characters ``<``, ``>``, ``"``, ``'``, and ``&``. + When used in attribute values the escaped strings must be enclosed + in quotes. + + .. versionchanged:: 3.2 + + Added the single quote to the list of escaped characters. + """ return _XHTML_ESCAPE_RE.sub(lambda match: _XHTML_ESCAPE_DICT[match.group(0)], to_basestring(value)) @@ -65,7 +75,7 @@ def xhtml_unescape(value): # The fact that json_encode wraps json.dumps is an implementation detail. -# Please see https://github.com/facebook/tornado/pull/706 +# Please see https://github.com/tornadoweb/tornado/pull/706 # before sending a pull request that adds **kwargs to this function. def json_encode(value): """JSON-encodes the given Python object.""" @@ -177,7 +187,7 @@ else: return encoded -_UTF8_TYPES = (bytes_type, type(None)) +_UTF8_TYPES = (bytes, type(None)) def utf8(value): @@ -188,8 +198,10 @@ def utf8(value): """ if isinstance(value, _UTF8_TYPES): return value - assert isinstance(value, unicode_type), \ - "Expected bytes, unicode, or None; got %r" % type(value) + if not isinstance(value, unicode_type): + raise TypeError( + "Expected bytes, unicode, or None; got %r" % type(value) + ) return value.encode("utf-8") _TO_UNICODE_TYPES = (unicode_type, type(None)) @@ -203,8 +215,10 @@ def to_unicode(value): """ if isinstance(value, _TO_UNICODE_TYPES): return value - assert isinstance(value, bytes_type), \ - "Expected bytes, unicode, or None; got %r" % type(value) + if not isinstance(value, bytes): + raise TypeError( + "Expected bytes, unicode, or None; got %r" % type(value) + ) return value.decode("utf-8") # to_unicode was previously named _unicode not because it was private, @@ -232,8 +246,10 @@ def to_basestring(value): """ if isinstance(value, _BASESTRING_TYPES): return value - assert isinstance(value, bytes_type), \ - "Expected bytes, unicode, or None; got %r" % type(value) + if not isinstance(value, bytes): + raise TypeError( + "Expected bytes, unicode, or None; got %r" % type(value) + ) return value.decode("utf-8") @@ -248,7 +264,7 @@ def recursive_unicode(obj): return list(recursive_unicode(i) for i in obj) elif isinstance(obj, tuple): return tuple(recursive_unicode(i) for i in obj) - elif isinstance(obj, bytes_type): + elif isinstance(obj, bytes): return to_unicode(obj) else: return obj diff --git a/vendor/tornado/gen.py b/vendor/tornado/gen.py index 92b7458e..86fe2f19 100644 --- a/vendor/tornado/gen.py +++ b/vendor/tornado/gen.py @@ -29,17 +29,8 @@ could be written with ``gen`` as:: Most asynchronous functions in Tornado return a `.Future`; yielding this object returns its `~.Future.result`. -For functions that do not return ``Futures``, `Task` works with any -function that takes a ``callback`` keyword argument (most Tornado functions -can be used in either style, although the ``Future`` style is preferred -since it is both shorter and provides better exception handling):: - - @gen.coroutine - def get(self): - yield gen.Task(AsyncHTTPClient().fetch, "http://example.com") - -You can also yield a list of ``Futures`` and/or ``Tasks``, which will be -started at the same time and run in parallel; a list of results will +You can also yield a list or dict of ``Futures``, which will be +started at the same time and run in parallel; a list or dict of results will be returned when they are all finished:: @gen.coroutine @@ -47,31 +38,26 @@ be returned when they are all finished:: http_client = AsyncHTTPClient() response1, response2 = yield [http_client.fetch(url1), http_client.fetch(url2)] + response_dict = yield dict(response3=http_client.fetch(url3), + response4=http_client.fetch(url4)) + response3 = response_dict['response3'] + response4 = response_dict['response4'] -For more complicated interfaces, `Task` can be split into two parts: -`Callback` and `Wait`:: +If the `~functools.singledispatch` library is available (standard in +Python 3.4, available via the `singledispatch +`_ package on older +versions), additional types of objects may be yielded. Tornado includes +support for ``asyncio.Future`` and Twisted's ``Deferred`` class when +``tornado.platform.asyncio`` and ``tornado.platform.twisted`` are imported. +See the `convert_yielded` function to extend this mechanism. - class GenAsyncHandler2(RequestHandler): - @asynchronous - @gen.coroutine - def get(self): - http_client = AsyncHTTPClient() - http_client.fetch("http://example.com", - callback=(yield gen.Callback("key")) - response = yield gen.Wait("key") - do_something_with_response(response) - self.render("template.html") +.. versionchanged:: 3.2 + Dict support added. -The ``key`` argument to `Callback` and `Wait` allows for multiple -asynchronous operations to be started at different times and proceed -in parallel: yield several callbacks with different keys, then wait -for them once all the async operations have started. +.. versionchanged:: 4.1 + Support added for yielding ``asyncio`` Futures and Twisted Deferreds + via ``singledispatch``. -The result of a `Wait` or `Task` yield expression depends on how the callback -was run. If it was called with no arguments, the result is ``None``. If -it was called with one argument, the result is that argument. If it was -called with more than one argument or any keyword arguments, the result -is an `Arguments` object, which is a named tuple ``(args, kwargs)``. """ from __future__ import absolute_import, division, print_function, with_statement @@ -80,10 +66,20 @@ import functools import itertools import sys import types +import weakref -from tornado.concurrent import Future, TracebackFuture +from tornado.concurrent import Future, TracebackFuture, is_future, chain_future from tornado.ioloop import IOLoop -from tornado.stack_context import ExceptionStackContext, wrap +from tornado.log import app_log +from tornado import stack_context + +try: + from functools import singledispatch # py34+ +except ImportError as e: + try: + from singledispatch import singledispatch # backport + except ImportError: + singledispatch = None class KeyReuseError(Exception): @@ -106,6 +102,10 @@ class ReturnValueIgnoredError(Exception): pass +class TimeoutError(Exception): + """Exception raised by ``with_timeout``.""" + + def engine(func): """Callback-oriented decorator for asynchronous generators. @@ -123,45 +123,23 @@ def engine(func): `~tornado.web.RequestHandler` :ref:`HTTP verb methods `, which use ``self.finish()`` in place of a callback argument. """ + func = _make_coroutine_wrapper(func, replace_callback=False) @functools.wraps(func) def wrapper(*args, **kwargs): - runner = None - - def handle_exception(typ, value, tb): - # if the function throws an exception before its first "yield" - # (or is not a generator at all), the Runner won't exist yet. - # However, in that case we haven't reached anything asynchronous - # yet, so we can just let the exception propagate. - if runner is not None: - return runner.handle_exception(typ, value, tb) - return False - with ExceptionStackContext(handle_exception) as deactivate: - try: - result = func(*args, **kwargs) - except (Return, StopIteration) as e: - result = getattr(e, 'value', None) - else: - if isinstance(result, types.GeneratorType): - def final_callback(value): - if value is not None: - raise ReturnValueIgnoredError( - "@gen.engine functions cannot return values: " - "%r" % (value,)) - assert value is None - deactivate() - runner = Runner(result, final_callback) - runner.run() - return - if result is not None: + future = func(*args, **kwargs) + def final_callback(future): + if future.result() is not None: raise ReturnValueIgnoredError( "@gen.engine functions cannot return values: %r" % - (result,)) - deactivate() - # no yield, so we're done + (future.result(),)) + # The engine interface doesn't give us any way to return + # errors but to raise them into the stack context. + # Save the stack context here to use when the Future has resolved. + future.add_done_callback(stack_context.wrap(final_callback)) return wrapper -def coroutine(func): +def coroutine(func, replace_callback=True): """Decorator for asynchronous generators. Any generator that yields objects from this module must be wrapped @@ -184,44 +162,79 @@ def coroutine(func): From the caller's perspective, ``@gen.coroutine`` is similar to the combination of ``@return_future`` and ``@gen.engine``. + + .. warning:: + + When exceptions occur inside a coroutine, the exception + information will be stored in the `.Future` object. You must + examine the result of the `.Future` object, or the exception + may go unnoticed by your code. This means yielding the function + if called from another coroutine, using something like + `.IOLoop.run_sync` for top-level calls, or passing the `.Future` + to `.IOLoop.add_future`. + + """ + return _make_coroutine_wrapper(func, replace_callback=True) + + +def _make_coroutine_wrapper(func, replace_callback): + """The inner workings of ``@gen.coroutine`` and ``@gen.engine``. + + The two decorators differ in their treatment of the ``callback`` + argument, so we cannot simply implement ``@engine`` in terms of + ``@coroutine``. """ @functools.wraps(func) def wrapper(*args, **kwargs): - runner = None future = TracebackFuture() - if 'callback' in kwargs: + if replace_callback and 'callback' in kwargs: callback = kwargs.pop('callback') IOLoop.current().add_future( future, lambda future: callback(future.result())) - def handle_exception(typ, value, tb): - try: - if runner is not None and runner.handle_exception(typ, value, tb): - return True - except Exception: - typ, value, tb = sys.exc_info() - future.set_exc_info((typ, value, tb)) - return True - with ExceptionStackContext(handle_exception) as deactivate: - try: - result = func(*args, **kwargs) - except (Return, StopIteration) as e: - result = getattr(e, 'value', None) - except Exception: - deactivate() - future.set_exc_info(sys.exc_info()) - return future - else: - if isinstance(result, types.GeneratorType): - def final_callback(value): - deactivate() - future.set_result(value) - runner = Runner(result, final_callback) - runner.run() + try: + result = func(*args, **kwargs) + except (Return, StopIteration) as e: + result = getattr(e, 'value', None) + except Exception: + future.set_exc_info(sys.exc_info()) + return future + else: + if isinstance(result, types.GeneratorType): + # Inline the first iteration of Runner.run. This lets us + # avoid the cost of creating a Runner when the coroutine + # never actually yields, which in turn allows us to + # use "optional" coroutines in critical path code without + # performance penalty for the synchronous case. + try: + orig_stack_contexts = stack_context._state.contexts + yielded = next(result) + if stack_context._state.contexts is not orig_stack_contexts: + yielded = TracebackFuture() + yielded.set_exception( + stack_context.StackContextInconsistentError( + 'stack_context inconsistency (probably caused ' + 'by yield within a "with StackContext" block)')) + except (StopIteration, Return) as e: + future.set_result(getattr(e, 'value', None)) + except Exception: + future.set_exc_info(sys.exc_info()) + else: + Runner(result, future, yielded) + try: return future - deactivate() - future.set_result(result) + finally: + # Subtle memory optimization: if next() raised an exception, + # the future's exc_info contains a traceback which + # includes this stack frame. This creates a cycle, + # which will be collected at the next full GC but has + # been shown to greatly increase memory usage of + # benchmarks (relative to the refcount-based scheme + # used in the absence of cycles). We can avoid the + # cycle by clearing the local variable after we return it. + future = None + future.set_result(result) return future return wrapper @@ -250,12 +263,112 @@ class Return(Exception): super(Return, self).__init__() self.value = value +class WaitIterator(object): + """Provides an iterator to yield the results of futures as they finish. + + Yielding a set of futures like this: + + ``results = yield [future1, future2]`` + + pauses the coroutine until both ``future1`` and ``future2`` + return, and then restarts the coroutine with the results of both + futures. If either future is an exception, the expression will + raise that exception and all the results will be lost. + + If you need to get the result of each future as soon as possible, + or if you need the result of some futures even if others produce + errors, you can use ``WaitIterator``: + + :: + + wait_iterator = gen.WaitIterator(future1, future2) + while not wait_iterator.done(): + try: + result = yield wait_iterator.next() + except Exception as e: + print "Error {} from {}".format(e, wait_iterator.current_future) + else: + print "Result {} recieved from {} at {}".format( + result, wait_iterator.current_future, + wait_iterator.current_index) + + Because results are returned as soon as they are available the + output from the iterator *will not be in the same order as the + input arguments*. If you need to know which future produced the + current result, you can use the attributes + ``WaitIterator.current_future``, or ``WaitIterator.current_index`` + to get the index of the future from the input list. (if keyword + arguments were used in the construction of the `WaitIterator`, + ``current_index`` will use the corresponding keyword). + + .. versionadded:: 4.1 + """ + def __init__(self, *args, **kwargs): + if args and kwargs: + raise ValueError( + "You must provide args or kwargs, not both") + + if kwargs: + self._unfinished = dict((f, k) for (k, f) in kwargs.items()) + futures = list(kwargs.values()) + else: + self._unfinished = dict((f, i) for (i, f) in enumerate(args)) + futures = args + + self._finished = collections.deque() + self.current_index = self.current_future = None + self._running_future = None + + self_ref = weakref.ref(self) + for future in futures: + future.add_done_callback(functools.partial( + self._done_callback, self_ref)) + + def done(self): + """Returns True if this iterator has no more results.""" + if self._finished or self._unfinished: + return False + # Clear the 'current' values when iteration is done. + self.current_index = self.current_future = None + return True + + def next(self): + """Returns a `.Future` that will yield the next available result. + + Note that this `.Future` will not be the same object as any of + the inputs. + """ + self._running_future = TracebackFuture() + + if self._finished: + self._return_result(self._finished.popleft()) + + return self._running_future + + @staticmethod + def _done_callback(self_ref, done): + self = self_ref() + if self is not None: + if self._running_future and not self._running_future.done(): + self._return_result(done) + else: + self._finished.append(done) + + def _return_result(self, done): + """Called set the returned future's state that of the future + we yielded, and set the current future for the iterator. + """ + chain_future(done, self._running_future) + + self.current_future = done + self.current_index = self._unfinished.pop(done) + class YieldPoint(object): """Base class for objects that may be yielded from the generator. - Applications do not normally need to use this class, but it may be - subclassed to provide additional yielding behavior. + .. deprecated:: 4.0 + Use `Futures <.Future>` instead. """ def start(self, runner): """Called by the runner after the generator has yielded. @@ -291,6 +404,9 @@ class Callback(YieldPoint): The callback may be called with zero or one arguments; if an argument is given it will be returned by `Wait`. + + .. deprecated:: 4.0 + Use `Futures <.Future>` instead. """ def __init__(self, key): self.key = key @@ -307,7 +423,11 @@ class Callback(YieldPoint): class Wait(YieldPoint): - """Returns the argument passed to the result of a previous `Callback`.""" + """Returns the argument passed to the result of a previous `Callback`. + + .. deprecated:: 4.0 + Use `Futures <.Future>` instead. + """ def __init__(self, key): self.key = key @@ -328,6 +448,9 @@ class WaitAll(YieldPoint): a list of results in the same order. `WaitAll` is equivalent to yielding a list of `Wait` objects. + + .. deprecated:: 4.0 + Use `Futures <.Future>` instead. """ def __init__(self, keys): self.keys = keys @@ -342,71 +465,86 @@ class WaitAll(YieldPoint): return [self.runner.pop_result(key) for key in self.keys] -class Task(YieldPoint): - """Runs a single asynchronous operation. +def Task(func, *args, **kwargs): + """Adapts a callback-based asynchronous function for use in coroutines. Takes a function (and optional additional arguments) and runs it with those arguments plus a ``callback`` keyword argument. The argument passed to the callback is returned as the result of the yield expression. - A `Task` is equivalent to a `Callback`/`Wait` pair (with a unique - key generated automatically):: - - result = yield gen.Task(func, args) - - func(args, callback=(yield gen.Callback(key))) - result = yield gen.Wait(key) + .. versionchanged:: 4.0 + ``gen.Task`` is now a function that returns a `.Future`, instead of + a subclass of `YieldPoint`. It still behaves the same way when + yielded. """ - def __init__(self, func, *args, **kwargs): - assert "callback" not in kwargs - self.args = args - self.kwargs = kwargs - self.func = func - - def start(self, runner): - self.runner = runner - self.key = object() - runner.register_callback(self.key) - self.kwargs["callback"] = runner.result_callback(self.key) - self.func(*self.args, **self.kwargs) - - def is_ready(self): - return self.runner.is_ready(self.key) - - def get_result(self): - return self.runner.pop_result(self.key) + future = Future() + def handle_exception(typ, value, tb): + if future.done(): + return False + future.set_exc_info((typ, value, tb)) + return True + def set_result(result): + if future.done(): + return + future.set_result(result) + with stack_context.ExceptionStackContext(handle_exception): + func(*args, callback=_argument_adapter(set_result), **kwargs) + return future class YieldFuture(YieldPoint): def __init__(self, future, io_loop=None): + """Adapts a `.Future` to the `YieldPoint` interface. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. + """ self.future = future self.io_loop = io_loop or IOLoop.current() def start(self, runner): - self.runner = runner - self.key = object() - runner.register_callback(self.key) - self.io_loop.add_future(self.future, runner.result_callback(self.key)) + if not self.future.done(): + self.runner = runner + self.key = object() + runner.register_callback(self.key) + self.io_loop.add_future(self.future, runner.result_callback(self.key)) + else: + self.runner = None + self.result = self.future.result() def is_ready(self): - return self.runner.is_ready(self.key) + if self.runner is not None: + return self.runner.is_ready(self.key) + else: + return True def get_result(self): - return self.runner.pop_result(self.key).result() + if self.runner is not None: + return self.runner.pop_result(self.key).result() + else: + return self.result class Multi(YieldPoint): """Runs multiple asynchronous operations in parallel. - Takes a list of ``Tasks`` or other ``YieldPoints`` and returns a list of + Takes a list of ``YieldPoints`` or ``Futures`` and returns a list of their responses. It is not necessary to call `Multi` explicitly, since the engine will do so automatically when the generator yields - a list of ``YieldPoints``. + a list of ``YieldPoints`` or a mixture of ``YieldPoints`` and ``Futures``. + + Instead of a list, the argument may also be a dictionary whose values are + Futures, in which case a parallel dictionary is returned mapping the same + keys to their results. """ def __init__(self, children): + self.keys = None + if isinstance(children, dict): + self.keys = list(children.keys()) + children = children.values() self.children = [] for i in children: - if isinstance(i, Future): + if is_future(i): i = YieldFuture(i) self.children.append(i) assert all(isinstance(i, YieldPoint) for i in self.children) @@ -423,21 +561,171 @@ class Multi(YieldPoint): return not self.unfinished_children def get_result(self): - return [i.get_result() for i in self.children] + result = (i.get_result() for i in self.children) + if self.keys is not None: + return dict(zip(self.keys, result)) + else: + return list(result) -class _NullYieldPoint(YieldPoint): - def start(self, runner): - pass +def multi_future(children): + """Wait for multiple asynchronous futures in parallel. - def is_ready(self): - return True + Takes a list of ``Futures`` (but *not* other ``YieldPoints``) and returns + a new Future that resolves when all the other Futures are done. + If all the ``Futures`` succeeded, the returned Future's result is a list + of their results. If any failed, the returned Future raises the exception + of the first one to fail. - def get_result(self): - return None + Instead of a list, the argument may also be a dictionary whose values are + Futures, in which case a parallel dictionary is returned mapping the same + keys to their results. + + It is not necessary to call `multi_future` explcitly, since the engine will + do so automatically when the generator yields a list of `Futures`. + This function is faster than the `Multi` `YieldPoint` because it does not + require the creation of a stack context. + + .. versionadded:: 4.0 + """ + if isinstance(children, dict): + keys = list(children.keys()) + children = children.values() + else: + keys = None + assert all(is_future(i) for i in children) + unfinished_children = set(children) + + future = Future() + if not children: + future.set_result({} if keys is not None else []) + def callback(f): + unfinished_children.remove(f) + if not unfinished_children: + try: + result_list = [i.result() for i in children] + except Exception: + future.set_exc_info(sys.exc_info()) + else: + if keys is not None: + future.set_result(dict(zip(keys, result_list))) + else: + future.set_result(result_list) + for f in children: + f.add_done_callback(callback) + return future -_null_yield_point = _NullYieldPoint() +def maybe_future(x): + """Converts ``x`` into a `.Future`. + + If ``x`` is already a `.Future`, it is simply returned; otherwise + it is wrapped in a new `.Future`. This is suitable for use as + ``result = yield gen.maybe_future(f())`` when you don't know whether + ``f()`` returns a `.Future` or not. + """ + if is_future(x): + return x + else: + fut = Future() + fut.set_result(x) + return fut + + +def with_timeout(timeout, future, io_loop=None, quiet_exceptions=()): + """Wraps a `.Future` in a timeout. + + Raises `TimeoutError` if the input future does not complete before + ``timeout``, which may be specified in any form allowed by + `.IOLoop.add_timeout` (i.e. a `datetime.timedelta` or an absolute time + relative to `.IOLoop.time`) + + If the wrapped `.Future` fails after it has timed out, the exception + will be logged unless it is of a type contained in ``quiet_exceptions`` + (which may be an exception type or a sequence of types). + + Currently only supports Futures, not other `YieldPoint` classes. + + .. versionadded:: 4.0 + + .. versionchanged:: 4.1 + Added the ``quiet_exceptions`` argument and the logging of unhandled + exceptions. + """ + # TODO: allow yield points in addition to futures? + # Tricky to do with stack_context semantics. + # + # It's tempting to optimize this by cancelling the input future on timeout + # instead of creating a new one, but A) we can't know if we are the only + # one waiting on the input future, so cancelling it might disrupt other + # callers and B) concurrent futures can only be cancelled while they are + # in the queue, so cancellation cannot reliably bound our waiting time. + result = Future() + chain_future(future, result) + if io_loop is None: + io_loop = IOLoop.current() + def error_callback(future): + try: + future.result() + except Exception as e: + if not isinstance(e, quiet_exceptions): + app_log.error("Exception in Future %r after timeout", + future, exc_info=True) + def timeout_callback(): + result.set_exception(TimeoutError("Timeout")) + # In case the wrapped future goes on to fail, log it. + future.add_done_callback(error_callback) + timeout_handle = io_loop.add_timeout( + timeout, timeout_callback) + if isinstance(future, Future): + # We know this future will resolve on the IOLoop, so we don't + # need the extra thread-safety of IOLoop.add_future (and we also + # don't care about StackContext here. + future.add_done_callback( + lambda future: io_loop.remove_timeout(timeout_handle)) + else: + # concurrent.futures.Futures may resolve on any thread, so we + # need to route them back to the IOLoop. + io_loop.add_future( + future, lambda future: io_loop.remove_timeout(timeout_handle)) + return result + + +def sleep(duration): + """Return a `.Future` that resolves after the given number of seconds. + + When used with ``yield`` in a coroutine, this is a non-blocking + analogue to `time.sleep` (which should not be used in coroutines + because it is blocking):: + + yield gen.sleep(0.5) + + Note that calling this function on its own does nothing; you must + wait on the `.Future` it returns (usually by yielding it). + + .. versionadded:: 4.1 + """ + f = Future() + IOLoop.current().call_later(duration, lambda: f.set_result(None)) + return f + + +_null_future = Future() +_null_future.set_result(None) + +moment = Future() +moment.__doc__ = \ + """A special object which may be yielded to allow the IOLoop to run for +one iteration. + +This is not needed in normal use but it can be helpful in long-running +coroutines that are likely to yield Futures that are ready instantly. + +Usage: ``yield gen.moment`` + +.. versionadded:: 4.0 +""" +moment.set_result(None) class Runner(object): @@ -445,35 +733,55 @@ class Runner(object): Maintains information about pending callbacks and their results. - ``final_callback`` is run after the generator exits. + The results of the generator are stored in ``result_future`` (a + `.TracebackFuture`) """ - def __init__(self, gen, final_callback): + def __init__(self, gen, result_future, first_yielded): self.gen = gen - self.final_callback = final_callback - self.yield_point = _null_yield_point - self.pending_callbacks = set() - self.results = {} + self.result_future = result_future + self.future = _null_future + self.yield_point = None + self.pending_callbacks = None + self.results = None self.running = False self.finished = False - self.exc_info = None self.had_exception = False + self.io_loop = IOLoop.current() + # For efficiency, we do not create a stack context until we + # reach a YieldPoint (stack contexts are required for the historical + # semantics of YieldPoints, but not for Futures). When we have + # done so, this field will be set and must be called at the end + # of the coroutine. + self.stack_context_deactivate = None + if self.handle_yield(first_yielded): + self.run() def register_callback(self, key): """Adds ``key`` to the list of callbacks.""" + if self.pending_callbacks is None: + # Lazily initialize the old-style YieldPoint data structures. + self.pending_callbacks = set() + self.results = {} if key in self.pending_callbacks: raise KeyReuseError("key %r is already pending" % (key,)) self.pending_callbacks.add(key) def is_ready(self, key): """Returns true if a result is available for ``key``.""" - if key not in self.pending_callbacks: + if self.pending_callbacks is None or key not in self.pending_callbacks: raise UnknownKeyError("key %r is not pending" % (key,)) return key in self.results def set_result(self, key, result): """Sets the result for ``key`` and attempts to resume the generator.""" self.results[key] = result - self.run() + if self.yield_point is not None and self.yield_point.is_ready(): + try: + self.future.set_result(self.yield_point.get_result()) + except: + self.future.set_exc_info(sys.exc_info()) + self.yield_point = None + self.run() def pop_result(self, key): """Returns the result for ``key`` and unregisters it.""" @@ -489,25 +797,27 @@ class Runner(object): try: self.running = True while True: - if self.exc_info is None: - try: - if not self.yield_point.is_ready(): - return - next = self.yield_point.get_result() - self.yield_point = None - except Exception: - self.exc_info = sys.exc_info() + future = self.future + if not future.done(): + return + self.future = None try: - if self.exc_info is not None: + orig_stack_contexts = stack_context._state.contexts + try: + value = future.result() + except Exception: self.had_exception = True - exc_info = self.exc_info - self.exc_info = None - yielded = self.gen.throw(*exc_info) + yielded = self.gen.throw(*sys.exc_info()) else: - yielded = self.gen.send(next) + yielded = self.gen.send(value) + if stack_context._state.contexts is not orig_stack_contexts: + self.gen.throw( + stack_context.StackContextInconsistentError( + 'stack_context inconsistency (probably caused ' + 'by yield within a "with StackContext" block)')) except (StopIteration, Return) as e: self.finished = True - self.yield_point = _null_yield_point + self.future = _null_future if self.pending_callbacks and not self.had_exception: # If we ran cleanly without waiting on all callbacks # raise an error (really more of a warning). If we @@ -516,46 +826,134 @@ class Runner(object): raise LeakedCallbackError( "finished without waiting for callbacks %r" % self.pending_callbacks) - self.final_callback(getattr(e, 'value', None)) - self.final_callback = None + self.result_future.set_result(getattr(e, 'value', None)) + self.result_future = None + self._deactivate_stack_context() return except Exception: self.finished = True - self.yield_point = _null_yield_point - raise - if isinstance(yielded, list): - yielded = Multi(yielded) - elif isinstance(yielded, Future): - yielded = YieldFuture(yielded) - if isinstance(yielded, YieldPoint): - self.yield_point = yielded - try: - self.yield_point.start(self) - except Exception: - self.exc_info = sys.exc_info() - else: - self.exc_info = (BadYieldError( - "yielded unknown object %r" % (yielded,)),) + self.future = _null_future + self.result_future.set_exc_info(sys.exc_info()) + self.result_future = None + self._deactivate_stack_context() + return + if not self.handle_yield(yielded): + return finally: self.running = False - def result_callback(self, key): - def inner(*args, **kwargs): - if kwargs or len(args) > 1: - result = Arguments(args, kwargs) - elif args: - result = args[0] + def handle_yield(self, yielded): + # Lists containing YieldPoints require stack contexts; + # other lists are handled via multi_future in convert_yielded. + if (isinstance(yielded, list) and + any(isinstance(f, YieldPoint) for f in yielded)): + yielded = Multi(yielded) + elif (isinstance(yielded, dict) and + any(isinstance(f, YieldPoint) for f in yielded.values())): + yielded = Multi(yielded) + + if isinstance(yielded, YieldPoint): + # YieldPoints are too closely coupled to the Runner to go + # through the generic convert_yielded mechanism. + self.future = TracebackFuture() + def start_yield_point(): + try: + yielded.start(self) + if yielded.is_ready(): + self.future.set_result( + yielded.get_result()) + else: + self.yield_point = yielded + except Exception: + self.future = TracebackFuture() + self.future.set_exc_info(sys.exc_info()) + + if self.stack_context_deactivate is None: + # Start a stack context if this is the first + # YieldPoint we've seen. + with stack_context.ExceptionStackContext( + self.handle_exception) as deactivate: + self.stack_context_deactivate = deactivate + def cb(): + start_yield_point() + self.run() + self.io_loop.add_callback(cb) + return False else: - result = None - self.set_result(key, result) - return wrap(inner) + start_yield_point() + else: + try: + self.future = convert_yielded(yielded) + except BadYieldError: + self.future = TracebackFuture() + self.future.set_exc_info(sys.exc_info()) + + if not self.future.done() or self.future is moment: + self.io_loop.add_future( + self.future, lambda f: self.run()) + return False + return True + + def result_callback(self, key): + return stack_context.wrap(_argument_adapter( + functools.partial(self.set_result, key))) def handle_exception(self, typ, value, tb): if not self.running and not self.finished: - self.exc_info = (typ, value, tb) + self.future = TracebackFuture() + self.future.set_exc_info((typ, value, tb)) self.run() return True else: return False + def _deactivate_stack_context(self): + if self.stack_context_deactivate is not None: + self.stack_context_deactivate() + self.stack_context_deactivate = None + Arguments = collections.namedtuple('Arguments', ['args', 'kwargs']) + + +def _argument_adapter(callback): + """Returns a function that when invoked runs ``callback`` with one arg. + + If the function returned by this function is called with exactly + one argument, that argument is passed to ``callback``. Otherwise + the args tuple and kwargs dict are wrapped in an `Arguments` object. + """ + def wrapper(*args, **kwargs): + if kwargs or len(args) > 1: + callback(Arguments(args, kwargs)) + elif args: + callback(args[0]) + else: + callback(None) + return wrapper + + +def convert_yielded(yielded): + """Convert a yielded object into a `.Future`. + + The default implementation accepts lists, dictionaries, and Futures. + + If the `~functools.singledispatch` library is available, this function + may be extended to support additional types. For example:: + + @convert_yielded.register(asyncio.Future) + def _(asyncio_future): + return tornado.platform.asyncio.to_tornado_future(asyncio_future) + + .. versionadded:: 4.1 + """ + # Lists and dicts containing YieldPoints were handled separately + # via Multi(). + if isinstance(yielded, (list, dict)): + return multi_future(yielded) + elif is_future(yielded): + return yielded + else: + raise BadYieldError("yielded unknown object %r" % (yielded,)) + +if singledispatch is not None: + convert_yielded = singledispatch(convert_yielded) diff --git a/vendor/tornado/http1connection.py b/vendor/tornado/http1connection.py new file mode 100644 index 00000000..181319c4 --- /dev/null +++ b/vendor/tornado/http1connection.py @@ -0,0 +1,707 @@ +#!/usr/bin/env python +# +# Copyright 2014 Facebook +# +# 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. + +"""Client and server implementations of HTTP/1.x. + +.. versionadded:: 4.0 +""" + +from __future__ import absolute_import, division, print_function, with_statement + +import re + +from tornado.concurrent import Future +from tornado.escape import native_str, utf8 +from tornado import gen +from tornado import httputil +from tornado import iostream +from tornado.log import gen_log, app_log +from tornado import stack_context +from tornado.util import GzipDecompressor + + +class _QuietException(Exception): + def __init__(self): + pass + +class _ExceptionLoggingContext(object): + """Used with the ``with`` statement when calling delegate methods to + log any exceptions with the given logger. Any exceptions caught are + converted to _QuietException + """ + def __init__(self, logger): + self.logger = logger + + def __enter__(self): + pass + + def __exit__(self, typ, value, tb): + if value is not None: + self.logger.error("Uncaught exception", exc_info=(typ, value, tb)) + raise _QuietException + +class HTTP1ConnectionParameters(object): + """Parameters for `.HTTP1Connection` and `.HTTP1ServerConnection`. + """ + def __init__(self, no_keep_alive=False, chunk_size=None, + max_header_size=None, header_timeout=None, max_body_size=None, + body_timeout=None, decompress=False): + """ + :arg bool no_keep_alive: If true, always close the connection after + one request. + :arg int chunk_size: how much data to read into memory at once + :arg int max_header_size: maximum amount of data for HTTP headers + :arg float header_timeout: how long to wait for all headers (seconds) + :arg int max_body_size: maximum amount of data for body + :arg float body_timeout: how long to wait while reading body (seconds) + :arg bool decompress: if true, decode incoming + ``Content-Encoding: gzip`` + """ + self.no_keep_alive = no_keep_alive + self.chunk_size = chunk_size or 65536 + self.max_header_size = max_header_size or 65536 + self.header_timeout = header_timeout + self.max_body_size = max_body_size + self.body_timeout = body_timeout + self.decompress = decompress + + +class HTTP1Connection(httputil.HTTPConnection): + """Implements the HTTP/1.x protocol. + + This class can be on its own for clients, or via `HTTP1ServerConnection` + for servers. + """ + def __init__(self, stream, is_client, params=None, context=None): + """ + :arg stream: an `.IOStream` + :arg bool is_client: client or server + :arg params: a `.HTTP1ConnectionParameters` instance or ``None`` + :arg context: an opaque application-defined object that can be accessed + as ``connection.context``. + """ + self.is_client = is_client + self.stream = stream + if params is None: + params = HTTP1ConnectionParameters() + self.params = params + self.context = context + self.no_keep_alive = params.no_keep_alive + # The body limits can be altered by the delegate, so save them + # here instead of just referencing self.params later. + self._max_body_size = (self.params.max_body_size or + self.stream.max_buffer_size) + self._body_timeout = self.params.body_timeout + # _write_finished is set to True when finish() has been called, + # i.e. there will be no more data sent. Data may still be in the + # stream's write buffer. + self._write_finished = False + # True when we have read the entire incoming body. + self._read_finished = False + # _finish_future resolves when all data has been written and flushed + # to the IOStream. + self._finish_future = Future() + # If true, the connection should be closed after this request + # (after the response has been written in the server side, + # and after it has been read in the client) + self._disconnect_on_finish = False + self._clear_callbacks() + # Save the start lines after we read or write them; they + # affect later processing (e.g. 304 responses and HEAD methods + # have content-length but no bodies) + self._request_start_line = None + self._response_start_line = None + self._request_headers = None + # True if we are writing output with chunked encoding. + self._chunking_output = None + # While reading a body with a content-length, this is the + # amount left to read. + self._expected_content_remaining = None + # A Future for our outgoing writes, returned by IOStream.write. + self._pending_write = None + + def read_response(self, delegate): + """Read a single HTTP response. + + Typical client-mode usage is to write a request using `write_headers`, + `write`, and `finish`, and then call ``read_response``. + + :arg delegate: a `.HTTPMessageDelegate` + + Returns a `.Future` that resolves to None after the full response has + been read. + """ + if self.params.decompress: + delegate = _GzipMessageDelegate(delegate, self.params.chunk_size) + return self._read_message(delegate) + + @gen.coroutine + def _read_message(self, delegate): + need_delegate_close = False + try: + header_future = self.stream.read_until_regex( + b"\r?\n\r?\n", + max_bytes=self.params.max_header_size) + if self.params.header_timeout is None: + header_data = yield header_future + else: + try: + header_data = yield gen.with_timeout( + self.stream.io_loop.time() + self.params.header_timeout, + header_future, + io_loop=self.stream.io_loop, + quiet_exceptions=iostream.StreamClosedError) + except gen.TimeoutError: + self.close() + raise gen.Return(False) + start_line, headers = self._parse_headers(header_data) + if self.is_client: + start_line = httputil.parse_response_start_line(start_line) + self._response_start_line = start_line + else: + start_line = httputil.parse_request_start_line(start_line) + self._request_start_line = start_line + self._request_headers = headers + + self._disconnect_on_finish = not self._can_keep_alive( + start_line, headers) + need_delegate_close = True + with _ExceptionLoggingContext(app_log): + header_future = delegate.headers_received(start_line, headers) + if header_future is not None: + yield header_future + if self.stream is None: + # We've been detached. + need_delegate_close = False + raise gen.Return(False) + skip_body = False + if self.is_client: + if (self._request_start_line is not None and + self._request_start_line.method == 'HEAD'): + skip_body = True + code = start_line.code + if code == 304: + # 304 responses may include the content-length header + # but do not actually have a body. + # http://tools.ietf.org/html/rfc7230#section-3.3 + skip_body = True + if code >= 100 and code < 200: + # 1xx responses should never indicate the presence of + # a body. + if ('Content-Length' in headers or + 'Transfer-Encoding' in headers): + raise httputil.HTTPInputError( + "Response code %d cannot have body" % code) + # TODO: client delegates will get headers_received twice + # in the case of a 100-continue. Document or change? + yield self._read_message(delegate) + else: + if (headers.get("Expect") == "100-continue" and + not self._write_finished): + self.stream.write(b"HTTP/1.1 100 (Continue)\r\n\r\n") + if not skip_body: + body_future = self._read_body( + start_line.code if self.is_client else 0, headers, delegate) + if body_future is not None: + if self._body_timeout is None: + yield body_future + else: + try: + yield gen.with_timeout( + self.stream.io_loop.time() + self._body_timeout, + body_future, self.stream.io_loop, + quiet_exceptions=iostream.StreamClosedError) + except gen.TimeoutError: + gen_log.info("Timeout reading body from %s", + self.context) + self.stream.close() + raise gen.Return(False) + self._read_finished = True + if not self._write_finished or self.is_client: + need_delegate_close = False + with _ExceptionLoggingContext(app_log): + delegate.finish() + # If we're waiting for the application to produce an asynchronous + # response, and we're not detached, register a close callback + # on the stream (we didn't need one while we were reading) + if (not self._finish_future.done() and + self.stream is not None and + not self.stream.closed()): + self.stream.set_close_callback(self._on_connection_close) + yield self._finish_future + if self.is_client and self._disconnect_on_finish: + self.close() + if self.stream is None: + raise gen.Return(False) + except httputil.HTTPInputError as e: + gen_log.info("Malformed HTTP message from %s: %s", + self.context, e) + self.close() + raise gen.Return(False) + finally: + if need_delegate_close: + with _ExceptionLoggingContext(app_log): + delegate.on_connection_close() + self._clear_callbacks() + raise gen.Return(True) + + def _clear_callbacks(self): + """Clears the callback attributes. + + This allows the request handler to be garbage collected more + quickly in CPython by breaking up reference cycles. + """ + self._write_callback = None + self._write_future = None + self._close_callback = None + if self.stream is not None: + self.stream.set_close_callback(None) + + def set_close_callback(self, callback): + """Sets a callback that will be run when the connection is closed. + + .. deprecated:: 4.0 + Use `.HTTPMessageDelegate.on_connection_close` instead. + """ + self._close_callback = stack_context.wrap(callback) + + def _on_connection_close(self): + # Note that this callback is only registered on the IOStream + # when we have finished reading the request and are waiting for + # the application to produce its response. + if self._close_callback is not None: + callback = self._close_callback + self._close_callback = None + callback() + if not self._finish_future.done(): + self._finish_future.set_result(None) + self._clear_callbacks() + + def close(self): + if self.stream is not None: + self.stream.close() + self._clear_callbacks() + if not self._finish_future.done(): + self._finish_future.set_result(None) + + def detach(self): + """Take control of the underlying stream. + + Returns the underlying `.IOStream` object and stops all further + HTTP processing. May only be called during + `.HTTPMessageDelegate.headers_received`. Intended for implementing + protocols like websockets that tunnel over an HTTP handshake. + """ + self._clear_callbacks() + stream = self.stream + self.stream = None + if not self._finish_future.done(): + self._finish_future.set_result(None) + return stream + + def set_body_timeout(self, timeout): + """Sets the body timeout for a single request. + + Overrides the value from `.HTTP1ConnectionParameters`. + """ + self._body_timeout = timeout + + def set_max_body_size(self, max_body_size): + """Sets the body size limit for a single request. + + Overrides the value from `.HTTP1ConnectionParameters`. + """ + self._max_body_size = max_body_size + + def write_headers(self, start_line, headers, chunk=None, callback=None): + """Implements `.HTTPConnection.write_headers`.""" + lines = [] + if self.is_client: + self._request_start_line = start_line + lines.append(utf8('%s %s HTTP/1.1' % (start_line[0], start_line[1]))) + # Client requests with a non-empty body must have either a + # Content-Length or a Transfer-Encoding. + self._chunking_output = ( + start_line.method in ('POST', 'PUT', 'PATCH') and + 'Content-Length' not in headers and + 'Transfer-Encoding' not in headers) + else: + self._response_start_line = start_line + lines.append(utf8('HTTP/1.1 %s %s' % (start_line[1], start_line[2]))) + self._chunking_output = ( + # TODO: should this use + # self._request_start_line.version or + # start_line.version? + self._request_start_line.version == 'HTTP/1.1' and + # 304 responses have no body (not even a zero-length body), and so + # should not have either Content-Length or Transfer-Encoding. + # headers. + start_line.code != 304 and + # No need to chunk the output if a Content-Length is specified. + 'Content-Length' not in headers and + # Applications are discouraged from touching Transfer-Encoding, + # but if they do, leave it alone. + 'Transfer-Encoding' not in headers) + # If a 1.0 client asked for keep-alive, add the header. + if (self._request_start_line.version == 'HTTP/1.0' and + (self._request_headers.get('Connection', '').lower() + == 'keep-alive')): + headers['Connection'] = 'Keep-Alive' + if self._chunking_output: + headers['Transfer-Encoding'] = 'chunked' + if (not self.is_client and + (self._request_start_line.method == 'HEAD' or + start_line.code == 304)): + self._expected_content_remaining = 0 + elif 'Content-Length' in headers: + self._expected_content_remaining = int(headers['Content-Length']) + else: + self._expected_content_remaining = None + lines.extend([utf8(n) + b": " + utf8(v) for n, v in headers.get_all()]) + for line in lines: + if b'\n' in line: + raise ValueError('Newline in header: ' + repr(line)) + future = None + if self.stream.closed(): + future = self._write_future = Future() + future.set_exception(iostream.StreamClosedError()) + future.exception() + else: + if callback is not None: + self._write_callback = stack_context.wrap(callback) + else: + future = self._write_future = Future() + data = b"\r\n".join(lines) + b"\r\n\r\n" + if chunk: + data += self._format_chunk(chunk) + self._pending_write = self.stream.write(data) + self._pending_write.add_done_callback(self._on_write_complete) + return future + + def _format_chunk(self, chunk): + if self._expected_content_remaining is not None: + self._expected_content_remaining -= len(chunk) + if self._expected_content_remaining < 0: + # Close the stream now to stop further framing errors. + self.stream.close() + raise httputil.HTTPOutputError( + "Tried to write more data than Content-Length") + if self._chunking_output and chunk: + # Don't write out empty chunks because that means END-OF-STREAM + # with chunked encoding + return utf8("%x" % len(chunk)) + b"\r\n" + chunk + b"\r\n" + else: + return chunk + + def write(self, chunk, callback=None): + """Implements `.HTTPConnection.write`. + + For backwards compatibility is is allowed but deprecated to + skip `write_headers` and instead call `write()` with a + pre-encoded header block. + """ + future = None + if self.stream.closed(): + future = self._write_future = Future() + self._write_future.set_exception(iostream.StreamClosedError()) + self._write_future.exception() + else: + if callback is not None: + self._write_callback = stack_context.wrap(callback) + else: + future = self._write_future = Future() + self._pending_write = self.stream.write(self._format_chunk(chunk)) + self._pending_write.add_done_callback(self._on_write_complete) + return future + + def finish(self): + """Implements `.HTTPConnection.finish`.""" + if (self._expected_content_remaining is not None and + self._expected_content_remaining != 0 and + not self.stream.closed()): + self.stream.close() + raise httputil.HTTPOutputError( + "Tried to write %d bytes less than Content-Length" % + self._expected_content_remaining) + if self._chunking_output: + if not self.stream.closed(): + self._pending_write = self.stream.write(b"0\r\n\r\n") + self._pending_write.add_done_callback(self._on_write_complete) + self._write_finished = True + # If the app finished the request while we're still reading, + # divert any remaining data away from the delegate and + # close the connection when we're done sending our response. + # Closing the connection is the only way to avoid reading the + # whole input body. + if not self._read_finished: + self._disconnect_on_finish = True + # No more data is coming, so instruct TCP to send any remaining + # data immediately instead of waiting for a full packet or ack. + self.stream.set_nodelay(True) + if self._pending_write is None: + self._finish_request(None) + else: + self._pending_write.add_done_callback(self._finish_request) + + def _on_write_complete(self, future): + exc = future.exception() + if exc is not None and not isinstance(exc, iostream.StreamClosedError): + future.result() + if self._write_callback is not None: + callback = self._write_callback + self._write_callback = None + self.stream.io_loop.add_callback(callback) + if self._write_future is not None: + future = self._write_future + self._write_future = None + future.set_result(None) + + def _can_keep_alive(self, start_line, headers): + if self.params.no_keep_alive: + return False + connection_header = headers.get("Connection") + if connection_header is not None: + connection_header = connection_header.lower() + if start_line.version == "HTTP/1.1": + return connection_header != "close" + elif ("Content-Length" in headers + or headers.get("Transfer-Encoding", "").lower() == "chunked" + or start_line.method in ("HEAD", "GET")): + return connection_header == "keep-alive" + return False + + def _finish_request(self, future): + self._clear_callbacks() + if not self.is_client and self._disconnect_on_finish: + self.close() + return + # Turn Nagle's algorithm back on, leaving the stream in its + # default state for the next request. + self.stream.set_nodelay(False) + if not self._finish_future.done(): + self._finish_future.set_result(None) + + def _parse_headers(self, data): + # The lstrip removes newlines that some implementations sometimes + # insert between messages of a reused connection. Per RFC 7230, + # we SHOULD ignore at least one empty line before the request. + # http://tools.ietf.org/html/rfc7230#section-3.5 + data = native_str(data.decode('latin1')).lstrip("\r\n") + # RFC 7230 section allows for both CRLF and bare LF. + eol = data.find("\n") + start_line = data[:eol].rstrip("\r") + try: + headers = httputil.HTTPHeaders.parse(data[eol:]) + except ValueError: + # probably form split() if there was no ':' in the line + raise httputil.HTTPInputError("Malformed HTTP headers: %r" % + data[eol:100]) + return start_line, headers + + def _read_body(self, code, headers, delegate): + if "Content-Length" in headers: + if "," in headers["Content-Length"]: + # Proxies sometimes cause Content-Length headers to get + # duplicated. If all the values are identical then we can + # use them but if they differ it's an error. + pieces = re.split(r',\s*', headers["Content-Length"]) + if any(i != pieces[0] for i in pieces): + raise httputil.HTTPInputError( + "Multiple unequal Content-Lengths: %r" % + headers["Content-Length"]) + headers["Content-Length"] = pieces[0] + content_length = int(headers["Content-Length"]) + + if content_length > self._max_body_size: + raise httputil.HTTPInputError("Content-Length too long") + else: + content_length = None + + if code == 204: + # This response code is not allowed to have a non-empty body, + # and has an implicit length of zero instead of read-until-close. + # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 + if ("Transfer-Encoding" in headers or + content_length not in (None, 0)): + raise httputil.HTTPInputError( + "Response with code %d should not have body" % code) + content_length = 0 + + if content_length is not None: + return self._read_fixed_body(content_length, delegate) + if headers.get("Transfer-Encoding") == "chunked": + return self._read_chunked_body(delegate) + if self.is_client: + return self._read_body_until_close(delegate) + return None + + @gen.coroutine + def _read_fixed_body(self, content_length, delegate): + while content_length > 0: + body = yield self.stream.read_bytes( + min(self.params.chunk_size, content_length), partial=True) + content_length -= len(body) + if not self._write_finished or self.is_client: + with _ExceptionLoggingContext(app_log): + yield gen.maybe_future(delegate.data_received(body)) + + @gen.coroutine + def _read_chunked_body(self, delegate): + # TODO: "chunk extensions" http://tools.ietf.org/html/rfc2616#section-3.6.1 + total_size = 0 + while True: + chunk_len = yield self.stream.read_until(b"\r\n", max_bytes=64) + chunk_len = int(chunk_len.strip(), 16) + if chunk_len == 0: + return + total_size += chunk_len + if total_size > self._max_body_size: + raise httputil.HTTPInputError("chunked body too large") + bytes_to_read = chunk_len + while bytes_to_read: + chunk = yield self.stream.read_bytes( + min(bytes_to_read, self.params.chunk_size), partial=True) + bytes_to_read -= len(chunk) + if not self._write_finished or self.is_client: + with _ExceptionLoggingContext(app_log): + yield gen.maybe_future(delegate.data_received(chunk)) + # chunk ends with \r\n + crlf = yield self.stream.read_bytes(2) + assert crlf == b"\r\n" + + @gen.coroutine + def _read_body_until_close(self, delegate): + body = yield self.stream.read_until_close() + if not self._write_finished or self.is_client: + with _ExceptionLoggingContext(app_log): + delegate.data_received(body) + + +class _GzipMessageDelegate(httputil.HTTPMessageDelegate): + """Wraps an `HTTPMessageDelegate` to decode ``Content-Encoding: gzip``. + """ + def __init__(self, delegate, chunk_size): + self._delegate = delegate + self._chunk_size = chunk_size + self._decompressor = None + + def headers_received(self, start_line, headers): + if headers.get("Content-Encoding") == "gzip": + self._decompressor = GzipDecompressor() + # Downstream delegates will only see uncompressed data, + # so rename the content-encoding header. + # (but note that curl_httpclient doesn't do this). + headers.add("X-Consumed-Content-Encoding", + headers["Content-Encoding"]) + del headers["Content-Encoding"] + return self._delegate.headers_received(start_line, headers) + + @gen.coroutine + def data_received(self, chunk): + if self._decompressor: + compressed_data = chunk + while compressed_data: + decompressed = self._decompressor.decompress( + compressed_data, self._chunk_size) + if decompressed: + yield gen.maybe_future( + self._delegate.data_received(decompressed)) + compressed_data = self._decompressor.unconsumed_tail + else: + yield gen.maybe_future(self._delegate.data_received(chunk)) + + def finish(self): + if self._decompressor is not None: + tail = self._decompressor.flush() + if tail: + # I believe the tail will always be empty (i.e. + # decompress will return all it can). The purpose + # of the flush call is to detect errors such + # as truncated input. But in case it ever returns + # anything, treat it as an extra chunk + self._delegate.data_received(tail) + return self._delegate.finish() + + def on_connection_close(self): + return self._delegate.on_connection_close() + + +class HTTP1ServerConnection(object): + """An HTTP/1.x server.""" + def __init__(self, stream, params=None, context=None): + """ + :arg stream: an `.IOStream` + :arg params: a `.HTTP1ConnectionParameters` or None + :arg context: an opaque application-defined object that is accessible + as ``connection.context`` + """ + self.stream = stream + if params is None: + params = HTTP1ConnectionParameters() + self.params = params + self.context = context + self._serving_future = None + + @gen.coroutine + def close(self): + """Closes the connection. + + Returns a `.Future` that resolves after the serving loop has exited. + """ + self.stream.close() + # Block until the serving loop is done, but ignore any exceptions + # (start_serving is already responsible for logging them). + try: + yield self._serving_future + except Exception: + pass + + def start_serving(self, delegate): + """Starts serving requests on this connection. + + :arg delegate: a `.HTTPServerConnectionDelegate` + """ + assert isinstance(delegate, httputil.HTTPServerConnectionDelegate) + self._serving_future = self._server_request_loop(delegate) + # Register the future on the IOLoop so its errors get logged. + self.stream.io_loop.add_future(self._serving_future, + lambda f: f.result()) + + @gen.coroutine + def _server_request_loop(self, delegate): + try: + while True: + conn = HTTP1Connection(self.stream, False, + self.params, self.context) + request_delegate = delegate.start_request(self, conn) + try: + ret = yield conn.read_response(request_delegate) + except (iostream.StreamClosedError, + iostream.UnsatisfiableReadError): + return + except _QuietException: + # This exception was already logged. + conn.close() + return + except Exception: + gen_log.error("Uncaught exception", exc_info=True) + conn.close() + return + if not ret: + return + yield gen.moment + finally: + delegate.on_close(self) diff --git a/vendor/tornado/httpclient.py b/vendor/tornado/httpclient.py index a34eb66b..0ae9e480 100644 --- a/vendor/tornado/httpclient.py +++ b/vendor/tornado/httpclient.py @@ -22,9 +22,20 @@ to switch to ``curl_httpclient`` for reasons such as the following: * ``curl_httpclient`` was the default prior to Tornado 2.0. -Note that if you are using ``curl_httpclient``, it is highly recommended that -you use a recent version of ``libcurl`` and ``pycurl``. Currently the minimum -supported version is 7.18.2, and the recommended version is 7.21.1 or newer. +Note that if you are using ``curl_httpclient``, it is highly +recommended that you use a recent version of ``libcurl`` and +``pycurl``. Currently the minimum supported version of libcurl is +7.21.1, and the minimum version of pycurl is 7.18.2. It is highly +recommended that your ``libcurl`` installation is built with +asynchronous DNS resolver (threaded or c-ares), otherwise you may +encounter various problems with request timeouts (for more +information, see +http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTCONNECTTIMEOUTMS +and comments in curl_httpclient.py). + +To select ``curl_httpclient``, call `AsyncHTTPClient.configure` at startup:: + + AsyncHTTPClient.configure("tornado.curl_httpclient.CurlAsyncHTTPClient") """ from __future__ import absolute_import, division, print_function, with_statement @@ -33,8 +44,8 @@ import functools import time import weakref -from tornado.concurrent import Future -from tornado.escape import utf8 +from tornado.concurrent import TracebackFuture +from tornado.escape import utf8, native_str from tornado import httputil, stack_context from tornado.ioloop import IOLoop from tornado.util import Configurable @@ -52,7 +63,12 @@ class HTTPClient(object): response = http_client.fetch("http://www.google.com/") print response.body except httpclient.HTTPError as e: - print "Error:", e + # HTTPError is raised for non-200 responses; the response + # can be found in e.response. + print("Error: " + str(e)) + except Exception as e: + # Other errors are possible, such as IOError. + print("Error: " + str(e)) http_client.close() """ def __init__(self, async_client_class=None, **kwargs): @@ -79,7 +95,8 @@ class HTTPClient(object): If it is a string, we construct an `HTTPRequest` using any additional kwargs: ``HTTPRequest(request, **kwargs)`` - If an error occurs during the fetch, we raise an `HTTPError`. + If an error occurs during the fetch, we raise an `HTTPError` unless + the ``raise_error`` keyword argument is set to False. """ response = self._io_loop.run_sync(functools.partial( self._async_client.fetch, request, **kwargs)) @@ -105,10 +122,24 @@ class AsyncHTTPClient(Configurable): actually creates an instance of an implementation-specific subclass, and instances are reused as a kind of pseudo-singleton (one per `.IOLoop`). The keyword argument ``force_instance=True`` - can be used to suppress this singleton behavior. Constructor - arguments other than ``io_loop`` and ``force_instance`` are - deprecated. The implementation subclass as well as arguments to - its constructor can be set with the static method `configure()` + can be used to suppress this singleton behavior. Unless + ``force_instance=True`` is used, no arguments other than + ``io_loop`` should be passed to the `AsyncHTTPClient` constructor. + The implementation subclass as well as arguments to its + constructor can be set with the static method `configure()` + + All `AsyncHTTPClient` implementations support a ``defaults`` + keyword argument, which can be used to set default values for + `HTTPRequest` attributes. For example:: + + AsyncHTTPClient.configure( + None, defaults=dict(user_agent="MyUserAgent")) + # or with force_instance: + client = AsyncHTTPClient(force_instance=True, + defaults=dict(user_agent="MyUserAgent")) + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ @classmethod def configurable_base(cls): @@ -128,12 +159,21 @@ class AsyncHTTPClient(Configurable): def __new__(cls, io_loop=None, force_instance=False, **kwargs): io_loop = io_loop or IOLoop.current() - if io_loop in cls._async_clients() and not force_instance: - return cls._async_clients()[io_loop] + if force_instance: + instance_cache = None + else: + instance_cache = cls._async_clients() + if instance_cache is not None and io_loop in instance_cache: + return instance_cache[io_loop] instance = super(AsyncHTTPClient, cls).__new__(cls, io_loop=io_loop, **kwargs) - if not force_instance: - cls._async_clients()[io_loop] = instance + # Make sure the instance knows which cache to remove itself from. + # It can't simply call _async_clients() because we may be in + # __new__(AsyncHTTPClient) but instance.__class__ may be + # SimpleAsyncHTTPClient. + instance._instance_cache = instance_cache + if instance_cache is not None: + instance_cache[instance.io_loop] = instance return instance def initialize(self, io_loop, defaults=None): @@ -141,17 +181,30 @@ class AsyncHTTPClient(Configurable): self.defaults = dict(HTTPRequest._DEFAULTS) if defaults is not None: self.defaults.update(defaults) + self._closed = False def close(self): """Destroys this HTTP client, freeing any file descriptors used. - Not needed in normal use, but may be helpful in unittests that - create and destroy http clients. No other methods may be called - on the `AsyncHTTPClient` after ``close()``. - """ - if self._async_clients().get(self.io_loop) is self: - del self._async_clients()[self.io_loop] - def fetch(self, request, callback=None, **kwargs): + This method is **not needed in normal use** due to the way + that `AsyncHTTPClient` objects are transparently reused. + ``close()`` is generally only necessary when either the + `.IOLoop` is also being closed, or the ``force_instance=True`` + argument was used when creating the `AsyncHTTPClient`. + + No other methods may be called on the `AsyncHTTPClient` after + ``close()``. + + """ + if self._closed: + return + self._closed = True + if self._instance_cache is not None: + if self._instance_cache.get(self.io_loop) is not self: + raise RuntimeError("inconsistent AsyncHTTPClient cache") + del self._instance_cache[self.io_loop] + + def fetch(self, request, callback=None, raise_error=True, **kwargs): """Executes a request, asynchronously returning an `HTTPResponse`. The request may be either a string URL or an `HTTPRequest` object. @@ -159,14 +212,18 @@ class AsyncHTTPClient(Configurable): kwargs: ``HTTPRequest(request, **kwargs)`` This method returns a `.Future` whose result is an - `HTTPResponse`. The ``Future`` wil raise an `HTTPError` if - the request returned a non-200 response code. + `HTTPResponse`. By default, the ``Future`` will raise an `HTTPError` + if the request returned a non-200 response code. Instead, if + ``raise_error`` is set to False, the response will always be + returned regardless of the response code. If a ``callback`` is given, it will be invoked with the `HTTPResponse`. In the callback interface, `HTTPError` is not automatically raised. Instead, you must check the response's ``error`` attribute or call its `~HTTPResponse.rethrow` method. """ + if self._closed: + raise RuntimeError("fetch() called on closed AsyncHTTPClient") if not isinstance(request, HTTPRequest): request = HTTPRequest(url=request, **kwargs) # We may modify this (to add Host, Accept-Encoding, etc), @@ -174,7 +231,7 @@ class AsyncHTTPClient(Configurable): # where normal dicts get converted to HTTPHeaders objects. request.headers = httputil.HTTPHeaders(request.headers) request = _RequestProxy(request, self.defaults) - future = Future() + future = TracebackFuture() if callback is not None: callback = stack_context.wrap(callback) @@ -192,7 +249,7 @@ class AsyncHTTPClient(Configurable): future.add_done_callback(handle_future) def handle_response(response): - if response.error: + if raise_error and response.error: future.set_exception(response.error) else: future.set_result(response) @@ -236,7 +293,7 @@ class HTTPRequest(object): request_timeout=20.0, follow_redirects=True, max_redirects=5, - use_gzip=True, + decompress_response=True, proxy_password='', allow_nonstandard_methods=False, validate_cert=True) @@ -252,14 +309,27 @@ class HTTPRequest(object): proxy_password=None, allow_nonstandard_methods=None, validate_cert=None, ca_certs=None, allow_ipv6=None, - client_key=None, client_cert=None): + client_key=None, client_cert=None, body_producer=None, + expect_100_continue=False, decompress_response=None): r"""All parameters except ``url`` are optional. :arg string url: URL to fetch :arg string method: HTTP method, e.g. "GET" or "POST" :arg headers: Additional HTTP headers to pass on the request - :arg body: HTTP body to pass on the request :type headers: `~tornado.httputil.HTTPHeaders` or `dict` + :arg body: HTTP request body as a string (byte or unicode; if unicode + the utf-8 encoding will be used) + :arg body_producer: Callable used for lazy/asynchronous request bodies. + It is called with one argument, a ``write`` function, and should + return a `.Future`. It should call the write function with new + data as it becomes available. The write function returns a + `.Future` which can be used for flow control. + Only one of ``body`` and ``body_producer`` may + be specified. ``body_producer`` is not supported on + ``curl_httpclient``. When using ``body_producer`` it is recommended + to pass a ``Content-Length`` in the headers as otherwise chunked + encoding will be used, and many servers do not support chunked + encoding on requests. New in Tornado 4.0 :arg string auth_username: Username for HTTP authentication :arg string auth_password: Password for HTTP authentication :arg string auth_mode: Authentication mode; default is "basic". @@ -274,8 +344,13 @@ class HTTPRequest(object): or return the 3xx response? :arg int max_redirects: Limit for ``follow_redirects`` :arg string user_agent: String to send as ``User-Agent`` header - :arg bool use_gzip: Request gzip encoding from the server - :arg string network_interface: Network interface to use for request + :arg bool decompress_response: Request a compressed response from + the server and decompress it after downloading. Default is True. + New in Tornado 4.0. + :arg bool use_gzip: Deprecated alias for ``decompress_response`` + since Tornado 4.0. + :arg string network_interface: Network interface to use for request. + ``curl_httpclient`` only; see note below. :arg callable streaming_callback: If set, ``streaming_callback`` will be run with each chunk of data as it is received, and ``HTTPResponse.body`` and ``HTTPResponse.buffer`` will be empty in @@ -303,22 +378,42 @@ class HTTPRequest(object): :arg bool validate_cert: For HTTPS requests, validate the server's certificate? :arg string ca_certs: filename of CA certificates in PEM format, - or None to use defaults. Note that in ``curl_httpclient``, if - any request uses a custom ``ca_certs`` file, they all must (they - don't have to all use the same ``ca_certs``, but it's not possible - to mix requests with ``ca_certs`` and requests that use the defaults. + or None to use defaults. See note below when used with + ``curl_httpclient``. :arg bool allow_ipv6: Use IPv6 when available? Default is false in ``simple_httpclient`` and true in ``curl_httpclient`` - :arg string client_key: Filename for client SSL key, if any - :arg string client_cert: Filename for client SSL certificate, if any + :arg string client_key: Filename for client SSL key, if any. See + note below when used with ``curl_httpclient``. + :arg string client_cert: Filename for client SSL certificate, if any. + See note below when used with ``curl_httpclient``. + :arg bool expect_100_continue: If true, send the + ``Expect: 100-continue`` header and wait for a continue response + before sending the request body. Only supported with + simple_httpclient. + + .. note:: + + When using ``curl_httpclient`` certain options may be + inherited by subsequent fetches because ``pycurl`` does + not allow them to be cleanly reset. This applies to the + ``ca_certs``, ``client_key``, ``client_cert``, and + ``network_interface`` arguments. If you use these + options, you should pass them on every request (you don't + have to always use the same values, but it's not possible + to mix requests that specify these options with ones that + use the defaults). .. versionadded:: 3.1 The ``auth_mode`` argument. + + .. versionadded:: 4.0 + The ``body_producer`` and ``expect_100_continue`` arguments. """ - if headers is None: - headers = httputil.HTTPHeaders() + # Note that some of these attributes go through property setters + # defined below. + self.headers = headers if if_modified_since: - headers["If-Modified-Since"] = httputil.format_timestamp( + self.headers["If-Modified-Since"] = httputil.format_timestamp( if_modified_since) self.proxy_host = proxy_host self.proxy_port = proxy_port @@ -326,8 +421,8 @@ class HTTPRequest(object): self.proxy_password = proxy_password self.url = url self.method = method - self.headers = headers - self.body = utf8(body) + self.body = body + self.body_producer = body_producer self.auth_username = auth_username self.auth_password = auth_password self.auth_mode = auth_mode @@ -336,19 +431,74 @@ class HTTPRequest(object): self.follow_redirects = follow_redirects self.max_redirects = max_redirects self.user_agent = user_agent - self.use_gzip = use_gzip + if decompress_response is not None: + self.decompress_response = decompress_response + else: + self.decompress_response = use_gzip self.network_interface = network_interface - self.streaming_callback = stack_context.wrap(streaming_callback) - self.header_callback = stack_context.wrap(header_callback) - self.prepare_curl_callback = stack_context.wrap(prepare_curl_callback) + self.streaming_callback = streaming_callback + self.header_callback = header_callback + self.prepare_curl_callback = prepare_curl_callback self.allow_nonstandard_methods = allow_nonstandard_methods self.validate_cert = validate_cert self.ca_certs = ca_certs self.allow_ipv6 = allow_ipv6 self.client_key = client_key self.client_cert = client_cert + self.expect_100_continue = expect_100_continue self.start_time = time.time() + @property + def headers(self): + return self._headers + + @headers.setter + def headers(self, value): + if value is None: + self._headers = httputil.HTTPHeaders() + else: + self._headers = value + + @property + def body(self): + return self._body + + @body.setter + def body(self, value): + self._body = utf8(value) + + @property + def body_producer(self): + return self._body_producer + + @body_producer.setter + def body_producer(self, value): + self._body_producer = stack_context.wrap(value) + + @property + def streaming_callback(self): + return self._streaming_callback + + @streaming_callback.setter + def streaming_callback(self, value): + self._streaming_callback = stack_context.wrap(value) + + @property + def header_callback(self): + return self._header_callback + + @header_callback.setter + def header_callback(self, value): + self._header_callback = stack_context.wrap(value) + + @property + def prepare_curl_callback(self): + return self._prepare_curl_callback + + @prepare_curl_callback.setter + def prepare_curl_callback(self, value): + self._prepare_curl_callback = stack_context.wrap(value) + class HTTPResponse(object): """HTTP Response object. @@ -360,11 +510,12 @@ class HTTPResponse(object): * code: numeric HTTP status code, e.g. 200 or 404 * reason: human-readable reason phrase describing the status code - (with curl_httpclient, this is a default value rather than the - server's actual response) * headers: `tornado.httputil.HTTPHeaders` object + * effective_url: final location of the resource after following any + redirects + * buffer: ``cStringIO`` object for response body * body: response body as string (created on demand from ``self.buffer``) @@ -400,7 +551,8 @@ class HTTPResponse(object): self.effective_url = effective_url if error is None: if self.code < 200 or self.code >= 300: - self.error = HTTPError(self.code, response=self) + self.error = HTTPError(self.code, message=self.reason, + response=self) else: self.error = None else: @@ -490,7 +642,7 @@ def main(): if options.print_headers: print(response.headers) if options.print_body: - print(response.body) + print(native_str(response.body)) client.close() if __name__ == "__main__": diff --git a/vendor/tornado/httpserver.py b/vendor/tornado/httpserver.py index d005545e..e470e0e7 100644 --- a/vendor/tornado/httpserver.py +++ b/vendor/tornado/httpserver.py @@ -20,69 +20,36 @@ Typical applications have little direct interaction with the `HTTPServer` class except to start a server at the beginning of the process (and even that is often done indirectly via `tornado.web.Application.listen`). -This module also defines the `HTTPRequest` class which is exposed via -`tornado.web.RequestHandler.request`. +.. versionchanged:: 4.0 + + The ``HTTPRequest`` class that used to live in this module has been moved + to `tornado.httputil.HTTPServerRequest`. The old name remains as an alias. """ from __future__ import absolute_import, division, print_function, with_statement import socket -import ssl -import time -from tornado.escape import native_str, parse_qs_bytes +from tornado.escape import native_str +from tornado.http1connection import HTTP1ServerConnection, HTTP1ConnectionParameters +from tornado import gen from tornado import httputil from tornado import iostream -from tornado.log import gen_log from tornado import netutil from tornado.tcpserver import TCPServer -from tornado import stack_context -from tornado.util import bytes_type - -try: - import Cookie # py2 -except ImportError: - import http.cookies as Cookie # py3 -class HTTPServer(TCPServer): +class HTTPServer(TCPServer, httputil.HTTPServerConnectionDelegate): r"""A non-blocking, single-threaded HTTP server. - A server is defined by a request callback that takes an HTTPRequest - instance as an argument and writes a valid HTTP response with - `HTTPRequest.write`. `HTTPRequest.finish` finishes the request (but does - not necessarily close the connection in the case of HTTP/1.1 keep-alive - requests). A simple example server that echoes back the URI you - requested:: - - import tornado.httpserver - import tornado.ioloop - - def handle_request(request): - message = "You requested %s\n" % request.uri - request.write("HTTP/1.1 200 OK\r\nContent-Length: %d\r\n\r\n%s" % ( - len(message), message)) - request.finish() - - http_server = tornado.httpserver.HTTPServer(handle_request) - http_server.listen(8888) - tornado.ioloop.IOLoop.instance().start() - - `HTTPServer` is a very basic connection handler. It parses the request - headers and body, but the request callback is responsible for producing - the response exactly as it will appear on the wire. This affords - maximum flexibility for applications to implement whatever parts - of HTTP responses are required. + A server is defined by a subclass of `.HTTPServerConnectionDelegate`, + or, for backwards compatibility, a callback that takes an + `.HTTPServerRequest` as an argument. The delegate is usually a + `tornado.web.Application`. `HTTPServer` supports keep-alive connections by default (automatically for HTTP/1.1, or for HTTP/1.0 when the client - requests ``Connection: keep-alive``). This means that the request - callback must generate a properly-framed response, using either - the ``Content-Length`` header or ``Transfer-Encoding: chunked``. - Applications that are unable to frame their responses properly - should instead return a ``Connection: close`` header in each - response and pass ``no_keep_alive=True`` to the `HTTPServer` - constructor. + requests ``Connection: keep-alive``). If ``xheaders`` is ``True``, we support the ``X-Real-Ip``/``X-Forwarded-For`` and @@ -142,388 +109,176 @@ class HTTPServer(TCPServer): servers if you want to create your listening sockets in some way other than `tornado.netutil.bind_sockets`. + .. versionchanged:: 4.0 + Added ``decompress_request``, ``chunk_size``, ``max_header_size``, + ``idle_connection_timeout``, ``body_timeout``, ``max_body_size`` + arguments. Added support for `.HTTPServerConnectionDelegate` + instances as ``request_callback``. + + .. versionchanged:: 4.1 + `.HTTPServerConnectionDelegate.start_request` is now called with + two arguments ``(server_conn, request_conn)`` (in accordance with the + documentation) instead of one ``(request_conn)``. """ def __init__(self, request_callback, no_keep_alive=False, io_loop=None, - xheaders=False, ssl_options=None, protocol=None, **kwargs): + xheaders=False, ssl_options=None, protocol=None, + decompress_request=False, + chunk_size=None, max_header_size=None, + idle_connection_timeout=None, body_timeout=None, + max_body_size=None, max_buffer_size=None): self.request_callback = request_callback self.no_keep_alive = no_keep_alive self.xheaders = xheaders self.protocol = protocol + self.conn_params = HTTP1ConnectionParameters( + decompress=decompress_request, + chunk_size=chunk_size, + max_header_size=max_header_size, + header_timeout=idle_connection_timeout or 3600, + max_body_size=max_body_size, + body_timeout=body_timeout) TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options, - **kwargs) + max_buffer_size=max_buffer_size, + read_chunk_size=chunk_size) + self._connections = set() + + @gen.coroutine + def close_all_connections(self): + while self._connections: + # Peek at an arbitrary element of the set + conn = next(iter(self._connections)) + yield conn.close() def handle_stream(self, stream, address): - HTTPConnection(stream, address, self.request_callback, - self.no_keep_alive, self.xheaders, self.protocol) + context = _HTTPRequestContext(stream, address, + self.protocol) + conn = HTTP1ServerConnection( + stream, self.conn_params, context) + self._connections.add(conn) + conn.start_serving(self) + + def start_request(self, server_conn, request_conn): + return _ServerRequestAdapter(self, server_conn, request_conn) + + def on_close(self, server_conn): + self._connections.remove(server_conn) -class _BadRequestException(Exception): - """Exception class for malformed HTTP requests.""" - pass - - -class HTTPConnection(object): - """Handles a connection to an HTTP client, executing HTTP requests. - - We parse HTTP headers and bodies, and execute the request callback - until the HTTP conection is closed. - """ - def __init__(self, stream, address, request_callback, no_keep_alive=False, - xheaders=False, protocol=None): - self.stream = stream +class _HTTPRequestContext(object): + def __init__(self, stream, address, protocol): self.address = address + self.protocol = protocol # Save the socket's address family now so we know how to # interpret self.address even after the stream is closed # and its socket attribute replaced with None. - self.address_family = stream.socket.family - self.request_callback = request_callback - self.no_keep_alive = no_keep_alive - self.xheaders = xheaders - self.protocol = protocol - self._clear_request_state() - # Save stack context here, outside of any request. This keeps - # contexts from one request from leaking into the next. - self._header_callback = stack_context.wrap(self._on_headers) - self.stream.set_close_callback(self._on_connection_close) - self.stream.read_until(b"\r\n\r\n", self._header_callback) - - def _clear_request_state(self): - """Clears the per-request state. - - This is run in between requests to allow the previous handler - to be garbage collected (and prevent spurious close callbacks), - and when the connection is closed (to break up cycles and - facilitate garbage collection in cpython). - """ - self._request = None - self._request_finished = False - self._write_callback = None - self._close_callback = None - - def set_close_callback(self, callback): - """Sets a callback that will be run when the connection is closed. - - Use this instead of accessing - `HTTPConnection.stream.set_close_callback - <.BaseIOStream.set_close_callback>` directly (which was the - recommended approach prior to Tornado 3.0). - """ - self._close_callback = stack_context.wrap(callback) - - def _on_connection_close(self): - if self._close_callback is not None: - callback = self._close_callback - self._close_callback = None - callback() - # Delete any unfinished callbacks to break up reference cycles. - self._header_callback = None - self._clear_request_state() - - def close(self): - self.stream.close() - # Remove this reference to self, which would otherwise cause a - # cycle and delay garbage collection of this connection. - self._header_callback = None - self._clear_request_state() - - def write(self, chunk, callback=None): - """Writes a chunk of output to the stream.""" - if not self.stream.closed(): - self._write_callback = stack_context.wrap(callback) - self.stream.write(chunk, self._on_write_complete) - - def finish(self): - """Finishes the request.""" - self._request_finished = True - # No more data is coming, so instruct TCP to send any remaining - # data immediately instead of waiting for a full packet or ack. - self.stream.set_nodelay(True) - if not self.stream.writing(): - self._finish_request() - - def _on_write_complete(self): - if self._write_callback is not None: - callback = self._write_callback - self._write_callback = None - callback() - # _on_write_complete is enqueued on the IOLoop whenever the - # IOStream's write buffer becomes empty, but it's possible for - # another callback that runs on the IOLoop before it to - # simultaneously write more data and finish the request. If - # there is still data in the IOStream, a future - # _on_write_complete will be responsible for calling - # _finish_request. - if self._request_finished and not self.stream.writing(): - self._finish_request() - - def _finish_request(self): - if self.no_keep_alive or self._request is None: - disconnect = True + if stream.socket is not None: + self.address_family = stream.socket.family else: - connection_header = self._request.headers.get("Connection") - if connection_header is not None: - connection_header = connection_header.lower() - if self._request.supports_http_1_1(): - disconnect = connection_header == "close" - elif ("Content-Length" in self._request.headers - or self._request.method in ("HEAD", "GET")): - disconnect = connection_header != "keep-alive" - else: - disconnect = True - self._clear_request_state() - if disconnect: - self.close() - return - try: - # Use a try/except instead of checking stream.closed() - # directly, because in some cases the stream doesn't discover - # that it's closed until you try to read from it. - self.stream.read_until(b"\r\n\r\n", self._header_callback) - - # Turn Nagle's algorithm back on, leaving the stream in its - # default state for the next request. - self.stream.set_nodelay(False) - except iostream.StreamClosedError: - self.close() - - def _on_headers(self, data): - try: - data = native_str(data.decode('latin1')) - eol = data.find("\r\n") - start_line = data[:eol] - try: - method, uri, version = start_line.split(" ") - except ValueError: - raise _BadRequestException("Malformed HTTP request line") - if not version.startswith("HTTP/"): - raise _BadRequestException("Malformed HTTP version in HTTP Request-Line") - try: - headers = httputil.HTTPHeaders.parse(data[eol:]) - except ValueError: - # Probably from split() if there was no ':' in the line - raise _BadRequestException("Malformed HTTP headers") - - # HTTPRequest wants an IP, not a full socket address - if self.address_family in (socket.AF_INET, socket.AF_INET6): - remote_ip = self.address[0] - else: - # Unix (or other) socket; fake the remote address - remote_ip = '0.0.0.0' - - self._request = HTTPRequest( - connection=self, method=method, uri=uri, version=version, - headers=headers, remote_ip=remote_ip, protocol=self.protocol) - - content_length = headers.get("Content-Length") - if content_length: - content_length = int(content_length) - if content_length > self.stream.max_buffer_size: - raise _BadRequestException("Content-Length too long") - if headers.get("Expect") == "100-continue": - self.stream.write(b"HTTP/1.1 100 (Continue)\r\n\r\n") - self.stream.read_bytes(content_length, self._on_request_body) - return - - self.request_callback(self._request) - except _BadRequestException as e: - gen_log.info("Malformed HTTP request from %s: %s", - self.address[0], e) - self.close() - return - - def _on_request_body(self, data): - self._request.body = data - if self._request.method in ("POST", "PATCH", "PUT"): - httputil.parse_body_arguments( - self._request.headers.get("Content-Type", ""), data, - self._request.arguments, self._request.files) - self.request_callback(self._request) - - -class HTTPRequest(object): - """A single HTTP request. - - All attributes are type `str` unless otherwise noted. - - .. attribute:: method - - HTTP request method, e.g. "GET" or "POST" - - .. attribute:: uri - - The requested uri. - - .. attribute:: path - - The path portion of `uri` - - .. attribute:: query - - The query portion of `uri` - - .. attribute:: version - - HTTP version specified in request, e.g. "HTTP/1.1" - - .. attribute:: headers - - `.HTTPHeaders` dictionary-like object for request headers. Acts like - a case-insensitive dictionary with additional methods for repeated - headers. - - .. attribute:: body - - Request body, if present, as a byte string. - - .. attribute:: remote_ip - - Client's IP address as a string. If ``HTTPServer.xheaders`` is set, - will pass along the real IP address provided by a load balancer - in the ``X-Real-Ip`` or ``X-Forwarded-For`` header. - - .. versionchanged:: 3.1 - The list format of ``X-Forwarded-For`` is now supported. - - .. attribute:: protocol - - The protocol used, either "http" or "https". If ``HTTPServer.xheaders`` - is set, will pass along the protocol used by a load balancer if - reported via an ``X-Scheme`` header. - - .. attribute:: host - - The requested hostname, usually taken from the ``Host`` header. - - .. attribute:: arguments - - GET/POST arguments are available in the arguments property, which - maps arguments names to lists of values (to support multiple values - for individual names). Names are of type `str`, while arguments - are byte strings. Note that this is different from - `.RequestHandler.get_argument`, which returns argument values as - unicode strings. - - .. attribute:: files - - File uploads are available in the files property, which maps file - names to lists of `.HTTPFile`. - - .. attribute:: connection - - An HTTP request is attached to a single HTTP connection, which can - be accessed through the "connection" attribute. Since connections - are typically kept open in HTTP/1.1, multiple requests can be handled - sequentially on a single connection. - """ - def __init__(self, method, uri, version="HTTP/1.0", headers=None, - body=None, remote_ip=None, protocol=None, host=None, - files=None, connection=None): - self.method = method - self.uri = uri - self.version = version - self.headers = headers or httputil.HTTPHeaders() - self.body = body or "" - - # set remote IP and protocol - self.remote_ip = remote_ip + self.address_family = None + # In HTTPServerRequest we want an IP, not a full socket address. + if (self.address_family in (socket.AF_INET, socket.AF_INET6) and + address is not None): + self.remote_ip = address[0] + else: + # Unix (or other) socket; fake the remote address. + self.remote_ip = '0.0.0.0' if protocol: self.protocol = protocol - elif connection and isinstance(connection.stream, - iostream.SSLIOStream): + elif isinstance(stream, iostream.SSLIOStream): self.protocol = "https" else: self.protocol = "http" + self._orig_remote_ip = self.remote_ip + self._orig_protocol = self.protocol - # xheaders can override the defaults - if connection and connection.xheaders: - # Squid uses X-Forwarded-For, others use X-Real-Ip - ip = self.headers.get("X-Forwarded-For", self.remote_ip) - ip = ip.split(',')[-1].strip() - ip = self.headers.get( - "X-Real-Ip", ip) - if netutil.is_valid_ip(ip): - self.remote_ip = ip - # AWS uses X-Forwarded-Proto - proto = self.headers.get( - "X-Scheme", self.headers.get("X-Forwarded-Proto", self.protocol)) - if proto in ("http", "https"): - self.protocol = proto + def __str__(self): + if self.address_family in (socket.AF_INET, socket.AF_INET6): + return self.remote_ip + elif isinstance(self.address, bytes): + # Python 3 with the -bb option warns about str(bytes), + # so convert it explicitly. + # Unix socket addresses are str on mac but bytes on linux. + return native_str(self.address) + else: + return str(self.address) - self.host = host or self.headers.get("Host") or "127.0.0.1" - self.files = files or {} - self.connection = connection - self._start_time = time.time() - self._finish_time = None + def _apply_xheaders(self, headers): + """Rewrite the ``remote_ip`` and ``protocol`` fields.""" + # Squid uses X-Forwarded-For, others use X-Real-Ip + ip = headers.get("X-Forwarded-For", self.remote_ip) + ip = ip.split(',')[-1].strip() + ip = headers.get("X-Real-Ip", ip) + if netutil.is_valid_ip(ip): + self.remote_ip = ip + # AWS uses X-Forwarded-Proto + proto_header = headers.get( + "X-Scheme", headers.get("X-Forwarded-Proto", + self.protocol)) + if proto_header in ("http", "https"): + self.protocol = proto_header - self.path, sep, self.query = uri.partition('?') - self.arguments = parse_qs_bytes(self.query, keep_blank_values=True) + def _unapply_xheaders(self): + """Undo changes from `_apply_xheaders`. - def supports_http_1_1(self): - """Returns True if this request supports HTTP/1.1 semantics""" - return self.version == "HTTP/1.1" + Xheaders are per-request so they should not leak to the next + request on the same connection. + """ + self.remote_ip = self._orig_remote_ip + self.protocol = self._orig_protocol - @property - def cookies(self): - """A dictionary of Cookie.Morsel objects.""" - if not hasattr(self, "_cookies"): - self._cookies = Cookie.SimpleCookie() - if "Cookie" in self.headers: - try: - self._cookies.load( - native_str(self.headers["Cookie"])) - except Exception: - self._cookies = {} - return self._cookies - def write(self, chunk, callback=None): - """Writes the given chunk to the response stream.""" - assert isinstance(chunk, bytes_type) - self.connection.write(chunk, callback=callback) +class _ServerRequestAdapter(httputil.HTTPMessageDelegate): + """Adapts the `HTTPMessageDelegate` interface to the interface expected + by our clients. + """ + def __init__(self, server, server_conn, request_conn): + self.server = server + self.connection = request_conn + self.request = None + if isinstance(server.request_callback, + httputil.HTTPServerConnectionDelegate): + self.delegate = server.request_callback.start_request( + server_conn, request_conn) + self._chunks = None + else: + self.delegate = None + self._chunks = [] + + def headers_received(self, start_line, headers): + if self.server.xheaders: + self.connection.context._apply_xheaders(headers) + if self.delegate is None: + self.request = httputil.HTTPServerRequest( + connection=self.connection, start_line=start_line, + headers=headers) + else: + return self.delegate.headers_received(start_line, headers) + + def data_received(self, chunk): + if self.delegate is None: + self._chunks.append(chunk) + else: + return self.delegate.data_received(chunk) def finish(self): - """Finishes this HTTP request on the open connection.""" - self.connection.finish() - self._finish_time = time.time() - - def full_url(self): - """Reconstructs the full URL for this request.""" - return self.protocol + "://" + self.host + self.uri - - def request_time(self): - """Returns the amount of time it took for this request to execute.""" - if self._finish_time is None: - return time.time() - self._start_time + if self.delegate is None: + self.request.body = b''.join(self._chunks) + self.request._parse_body() + self.server.request_callback(self.request) else: - return self._finish_time - self._start_time + self.delegate.finish() + self._cleanup() - def get_ssl_certificate(self, binary_form=False): - """Returns the client's SSL certificate, if any. + def on_connection_close(self): + if self.delegate is None: + self._chunks = None + else: + self.delegate.on_connection_close() + self._cleanup() - To use client certificates, the HTTPServer must have been constructed - with cert_reqs set in ssl_options, e.g.:: + def _cleanup(self): + if self.server.xheaders: + self.connection.context._unapply_xheaders() - server = HTTPServer(app, - ssl_options=dict( - certfile="foo.crt", - keyfile="foo.key", - cert_reqs=ssl.CERT_REQUIRED, - ca_certs="cacert.crt")) - By default, the return value is a dictionary (or None, if no - client certificate is present). If ``binary_form`` is true, a - DER-encoded form of the certificate is returned instead. See - SSLSocket.getpeercert() in the standard library for more - details. - http://docs.python.org/library/ssl.html#sslsocket-objects - """ - try: - return self.connection.stream.socket.getpeercert( - binary_form=binary_form) - except ssl.SSLError: - return None - - def __repr__(self): - attrs = ("protocol", "host", "method", "uri", "version", "remote_ip") - args = ", ".join(["%s=%r" % (n, getattr(self, n)) for n in attrs]) - return "%s(%s, headers=%s)" % ( - self.__class__.__name__, args, dict(self.headers)) +HTTPRequest = httputil.HTTPServerRequest diff --git a/vendor/tornado/httputil.py b/vendor/tornado/httputil.py index 3e7337d9..9c99b3ef 100644 --- a/vendor/tornado/httputil.py +++ b/vendor/tornado/httputil.py @@ -14,21 +14,32 @@ # License for the specific language governing permissions and limitations # under the License. -"""HTTP utility code shared by clients and servers.""" +"""HTTP utility code shared by clients and servers. + +This module also defines the `HTTPServerRequest` class which is exposed +via `tornado.web.RequestHandler.request`. +""" from __future__ import absolute_import, division, print_function, with_statement import calendar import collections +import copy import datetime import email.utils import numbers +import re import time from tornado.escape import native_str, parse_qs_bytes, utf8 from tornado.log import gen_log from tornado.util import ObjectDict +try: + import Cookie # py2 +except ImportError: + import http.cookies as Cookie # py3 + try: from httplib import responses # py2 except ImportError: @@ -43,6 +54,18 @@ try: except ImportError: from urllib.parse import urlencode # py3 +try: + from ssl import SSLError +except ImportError: + # ssl is unavailable on app engine. + class SSLError(Exception): + pass + + +# RFC 7230 section 3.5: a recipient MAY recognize a single LF as a line +# terminator and ignore any preceding CR. +_CRLF_RE = re.compile(r'\r?\n') + class _NormalizedHeaderCache(dict): """Dynamic cached mapping of header names to Http-Header-Case. @@ -175,7 +198,7 @@ class HTTPHeaders(dict): [('Content-Length', '42'), ('Content-Type', 'text/html')] """ h = cls() - for line in headers.splitlines(): + for line in _CRLF_RE.split(headers): if line: h.parse_line(line) return h @@ -212,12 +235,352 @@ class HTTPHeaders(dict): return HTTPHeaders(self) +class HTTPServerRequest(object): + """A single HTTP request. + + All attributes are type `str` unless otherwise noted. + + .. attribute:: method + + HTTP request method, e.g. "GET" or "POST" + + .. attribute:: uri + + The requested uri. + + .. attribute:: path + + The path portion of `uri` + + .. attribute:: query + + The query portion of `uri` + + .. attribute:: version + + HTTP version specified in request, e.g. "HTTP/1.1" + + .. attribute:: headers + + `.HTTPHeaders` dictionary-like object for request headers. Acts like + a case-insensitive dictionary with additional methods for repeated + headers. + + .. attribute:: body + + Request body, if present, as a byte string. + + .. attribute:: remote_ip + + Client's IP address as a string. If ``HTTPServer.xheaders`` is set, + will pass along the real IP address provided by a load balancer + in the ``X-Real-Ip`` or ``X-Forwarded-For`` header. + + .. versionchanged:: 3.1 + The list format of ``X-Forwarded-For`` is now supported. + + .. attribute:: protocol + + The protocol used, either "http" or "https". If ``HTTPServer.xheaders`` + is set, will pass along the protocol used by a load balancer if + reported via an ``X-Scheme`` header. + + .. attribute:: host + + The requested hostname, usually taken from the ``Host`` header. + + .. attribute:: arguments + + GET/POST arguments are available in the arguments property, which + maps arguments names to lists of values (to support multiple values + for individual names). Names are of type `str`, while arguments + are byte strings. Note that this is different from + `.RequestHandler.get_argument`, which returns argument values as + unicode strings. + + .. attribute:: query_arguments + + Same format as ``arguments``, but contains only arguments extracted + from the query string. + + .. versionadded:: 3.2 + + .. attribute:: body_arguments + + Same format as ``arguments``, but contains only arguments extracted + from the request body. + + .. versionadded:: 3.2 + + .. attribute:: files + + File uploads are available in the files property, which maps file + names to lists of `.HTTPFile`. + + .. attribute:: connection + + An HTTP request is attached to a single HTTP connection, which can + be accessed through the "connection" attribute. Since connections + are typically kept open in HTTP/1.1, multiple requests can be handled + sequentially on a single connection. + + .. versionchanged:: 4.0 + Moved from ``tornado.httpserver.HTTPRequest``. + """ + def __init__(self, method=None, uri=None, version="HTTP/1.0", headers=None, + body=None, host=None, files=None, connection=None, + start_line=None): + if start_line is not None: + method, uri, version = start_line + self.method = method + self.uri = uri + self.version = version + self.headers = headers or HTTPHeaders() + self.body = body or b"" + + # set remote IP and protocol + context = getattr(connection, 'context', None) + self.remote_ip = getattr(context, 'remote_ip', None) + self.protocol = getattr(context, 'protocol', "http") + + self.host = host or self.headers.get("Host") or "127.0.0.1" + self.files = files or {} + self.connection = connection + self._start_time = time.time() + self._finish_time = None + + self.path, sep, self.query = uri.partition('?') + self.arguments = parse_qs_bytes(self.query, keep_blank_values=True) + self.query_arguments = copy.deepcopy(self.arguments) + self.body_arguments = {} + + def supports_http_1_1(self): + """Returns True if this request supports HTTP/1.1 semantics. + + .. deprecated:: 4.0 + Applications are less likely to need this information with the + introduction of `.HTTPConnection`. If you still need it, access + the ``version`` attribute directly. + """ + return self.version == "HTTP/1.1" + + @property + def cookies(self): + """A dictionary of Cookie.Morsel objects.""" + if not hasattr(self, "_cookies"): + self._cookies = Cookie.SimpleCookie() + if "Cookie" in self.headers: + try: + self._cookies.load( + native_str(self.headers["Cookie"])) + except Exception: + self._cookies = {} + return self._cookies + + def write(self, chunk, callback=None): + """Writes the given chunk to the response stream. + + .. deprecated:: 4.0 + Use ``request.connection`` and the `.HTTPConnection` methods + to write the response. + """ + assert isinstance(chunk, bytes) + self.connection.write(chunk, callback=callback) + + def finish(self): + """Finishes this HTTP request on the open connection. + + .. deprecated:: 4.0 + Use ``request.connection`` and the `.HTTPConnection` methods + to write the response. + """ + self.connection.finish() + self._finish_time = time.time() + + def full_url(self): + """Reconstructs the full URL for this request.""" + return self.protocol + "://" + self.host + self.uri + + def request_time(self): + """Returns the amount of time it took for this request to execute.""" + if self._finish_time is None: + return time.time() - self._start_time + else: + return self._finish_time - self._start_time + + def get_ssl_certificate(self, binary_form=False): + """Returns the client's SSL certificate, if any. + + To use client certificates, the HTTPServer must have been constructed + with cert_reqs set in ssl_options, e.g.:: + + server = HTTPServer(app, + ssl_options=dict( + certfile="foo.crt", + keyfile="foo.key", + cert_reqs=ssl.CERT_REQUIRED, + ca_certs="cacert.crt")) + + By default, the return value is a dictionary (or None, if no + client certificate is present). If ``binary_form`` is true, a + DER-encoded form of the certificate is returned instead. See + SSLSocket.getpeercert() in the standard library for more + details. + http://docs.python.org/library/ssl.html#sslsocket-objects + """ + try: + return self.connection.stream.socket.getpeercert( + binary_form=binary_form) + except SSLError: + return None + + def _parse_body(self): + parse_body_arguments( + self.headers.get("Content-Type", ""), self.body, + self.body_arguments, self.files, + self.headers) + + for k, v in self.body_arguments.items(): + self.arguments.setdefault(k, []).extend(v) + + def __repr__(self): + attrs = ("protocol", "host", "method", "uri", "version", "remote_ip") + args = ", ".join(["%s=%r" % (n, getattr(self, n)) for n in attrs]) + return "%s(%s, headers=%s)" % ( + self.__class__.__name__, args, dict(self.headers)) + + +class HTTPInputError(Exception): + """Exception class for malformed HTTP requests or responses + from remote sources. + + .. versionadded:: 4.0 + """ + pass + + +class HTTPOutputError(Exception): + """Exception class for errors in HTTP output. + + .. versionadded:: 4.0 + """ + pass + + +class HTTPServerConnectionDelegate(object): + """Implement this interface to handle requests from `.HTTPServer`. + + .. versionadded:: 4.0 + """ + def start_request(self, server_conn, request_conn): + """This method is called by the server when a new request has started. + + :arg server_conn: is an opaque object representing the long-lived + (e.g. tcp-level) connection. + :arg request_conn: is a `.HTTPConnection` object for a single + request/response exchange. + + This method should return a `.HTTPMessageDelegate`. + """ + raise NotImplementedError() + + def on_close(self, server_conn): + """This method is called when a connection has been closed. + + :arg server_conn: is a server connection that has previously been + passed to ``start_request``. + """ + pass + + +class HTTPMessageDelegate(object): + """Implement this interface to handle an HTTP request or response. + + .. versionadded:: 4.0 + """ + def headers_received(self, start_line, headers): + """Called when the HTTP headers have been received and parsed. + + :arg start_line: a `.RequestStartLine` or `.ResponseStartLine` + depending on whether this is a client or server message. + :arg headers: a `.HTTPHeaders` instance. + + Some `.HTTPConnection` methods can only be called during + ``headers_received``. + + May return a `.Future`; if it does the body will not be read + until it is done. + """ + pass + + def data_received(self, chunk): + """Called when a chunk of data has been received. + + May return a `.Future` for flow control. + """ + pass + + def finish(self): + """Called after the last chunk of data has been received.""" + pass + + def on_connection_close(self): + """Called if the connection is closed without finishing the request. + + If ``headers_received`` is called, either ``finish`` or + ``on_connection_close`` will be called, but not both. + """ + pass + + +class HTTPConnection(object): + """Applications use this interface to write their responses. + + .. versionadded:: 4.0 + """ + def write_headers(self, start_line, headers, chunk=None, callback=None): + """Write an HTTP header block. + + :arg start_line: a `.RequestStartLine` or `.ResponseStartLine`. + :arg headers: a `.HTTPHeaders` instance. + :arg chunk: the first (optional) chunk of data. This is an optimization + so that small responses can be written in the same call as their + headers. + :arg callback: a callback to be run when the write is complete. + + The ``version`` field of ``start_line`` is ignored. + + Returns a `.Future` if no callback is given. + """ + raise NotImplementedError() + + def write(self, chunk, callback=None): + """Writes a chunk of body data. + + The callback will be run when the write is complete. If no callback + is given, returns a Future. + """ + raise NotImplementedError() + + def finish(self): + """Indicates that the last body data has been written. + """ + raise NotImplementedError() + + def url_concat(url, args): - """Concatenate url and argument dictionary regardless of whether + """Concatenate url and arguments regardless of whether url has existing query parameters. + ``args`` may be either a dictionary or a list of key-value pairs + (the latter allows for multiple values with the same key. + + >>> url_concat("http://example.com/foo", dict(c="d")) + 'http://example.com/foo?c=d' >>> url_concat("http://example.com/foo?a=b", dict(c="d")) 'http://example.com/foo?a=b&c=d' + >>> url_concat("http://example.com/foo?a=b", [("c", "d"), ("c", "d2")]) + 'http://example.com/foo?a=b&c=d&c=d2' """ if not args: return url @@ -310,7 +673,7 @@ def _int_or_none(val): return int(val) -def parse_body_arguments(content_type, body, arguments, files): +def parse_body_arguments(content_type, body, arguments, files, headers=None): """Parses a form request body. Supports ``application/x-www-form-urlencoded`` and @@ -319,20 +682,31 @@ def parse_body_arguments(content_type, body, arguments, files): and ``files`` parameters are dictionaries that will be updated with the parsed contents. """ + if headers and 'Content-Encoding' in headers: + gen_log.warning("Unsupported Content-Encoding: %s", + headers['Content-Encoding']) + return if content_type.startswith("application/x-www-form-urlencoded"): - uri_arguments = parse_qs_bytes(native_str(body), keep_blank_values=True) + try: + uri_arguments = parse_qs_bytes(native_str(body), keep_blank_values=True) + except Exception as e: + gen_log.warning('Invalid x-www-form-urlencoded body: %s', e) + uri_arguments = {} for name, values in uri_arguments.items(): if values: arguments.setdefault(name, []).extend(values) elif content_type.startswith("multipart/form-data"): - fields = content_type.split(";") - for field in fields: - k, sep, v = field.strip().partition("=") - if k == "boundary" and v: - parse_multipart_form_data(utf8(v), body, arguments, files) - break - else: - gen_log.warning("Invalid multipart/form-data") + try: + fields = content_type.split(";") + for field in fields: + k, sep, v = field.strip().partition("=") + if k == "boundary" and v: + parse_multipart_form_data(utf8(v), body, arguments, files) + break + else: + raise ValueError("multipart boundary not found") + except Exception as e: + gen_log.warning("Invalid multipart/form-data: %s", e) def parse_multipart_form_data(boundary, data, arguments, files): @@ -401,9 +775,53 @@ def format_timestamp(ts): raise TypeError("unknown timestamp type: %r" % ts) return email.utils.formatdate(ts, usegmt=True) + +RequestStartLine = collections.namedtuple( + 'RequestStartLine', ['method', 'path', 'version']) + + +def parse_request_start_line(line): + """Returns a (method, path, version) tuple for an HTTP 1.x request line. + + The response is a `collections.namedtuple`. + + >>> parse_request_start_line("GET /foo HTTP/1.1") + RequestStartLine(method='GET', path='/foo', version='HTTP/1.1') + """ + try: + method, path, version = line.split(" ") + except ValueError: + raise HTTPInputError("Malformed HTTP request line") + if not re.match(r"^HTTP/1\.[0-9]$", version): + raise HTTPInputError( + "Malformed HTTP version in HTTP Request-Line: %r" % version) + return RequestStartLine(method, path, version) + + +ResponseStartLine = collections.namedtuple( + 'ResponseStartLine', ['version', 'code', 'reason']) + + +def parse_response_start_line(line): + """Returns a (version, code, reason) tuple for an HTTP 1.x response line. + + The response is a `collections.namedtuple`. + + >>> parse_response_start_line("HTTP/1.1 200 OK") + ResponseStartLine(version='HTTP/1.1', code=200, reason='OK') + """ + line = native_str(line) + match = re.match("(HTTP/1.[0-9]) ([0-9]+) ([^\r]*)", line) + if not match: + raise HTTPInputError("Error parsing response start line") + return ResponseStartLine(match.group(1), int(match.group(2)), + match.group(3)) + # _parseparam and _parse_header are copied and modified from python2.7's cgi.py # The original 2.7 version of this code did not correctly support some # combinations of semicolons and double quotes. +# It has also been modified to support valueless parameters as seen in +# websocket extension negotiations. def _parseparam(s): @@ -437,9 +855,47 @@ def _parse_header(line): value = value[1:-1] value = value.replace('\\\\', '\\').replace('\\"', '"') pdict[name] = value + else: + pdict[p] = None return key, pdict +def _encode_header(key, pdict): + """Inverse of _parse_header. + + >>> _encode_header('permessage-deflate', + ... {'client_max_window_bits': 15, 'client_no_context_takeover': None}) + 'permessage-deflate; client_max_window_bits=15; client_no_context_takeover' + """ + if not pdict: + return key + out = [key] + # Sort the parameters just to make it easy to test. + for k, v in sorted(pdict.items()): + if v is None: + out.append(k) + else: + # TODO: quote if necessary. + out.append('%s=%s' % (k, v)) + return '; '.join(out) + + def doctests(): import doctest return doctest.DocTestSuite() + +def split_host_and_port(netloc): + """Returns ``(host, port)`` tuple from ``netloc``. + + Returned ``port`` will be ``None`` if not present. + + .. versionadded:: 4.1 + """ + match = re.match(r'^(.+):(\d+)$', netloc) + if match: + host = match.group(1) + port = int(match.group(2)) + else: + host = netloc + port = None + return (host, port) diff --git a/vendor/tornado/ioloop.py b/vendor/tornado/ioloop.py index 5f37032f..680dc401 100644 --- a/vendor/tornado/ioloop.py +++ b/vendor/tornado/ioloop.py @@ -32,6 +32,7 @@ import datetime import errno import functools import heapq +import itertools import logging import numbers import os @@ -41,10 +42,10 @@ import threading import time import traceback -from tornado.concurrent import Future, TracebackFuture +from tornado.concurrent import TracebackFuture, is_future from tornado.log import app_log, gen_log from tornado import stack_context -from tornado.util import Configurable +from tornado.util import Configurable, errno_from_exception, timedelta_to_seconds try: import signal @@ -59,6 +60,9 @@ except ImportError: from tornado.platform.auto import set_close_exec, Waker +_POLL_TIMEOUT = 3600.0 + + class TimeoutError(Exception): pass @@ -154,28 +158,35 @@ class IOLoop(Configurable): IOLoop._instance = self @staticmethod - def current(): + def clear_instance(): + """Clear the global `IOLoop` instance. + + .. versionadded:: 4.0 + """ + if hasattr(IOLoop, "_instance"): + del IOLoop._instance + + @staticmethod + def current(instance=True): """Returns the current thread's `IOLoop`. - If an `IOLoop` is currently running or has been marked as current - by `make_current`, returns that instance. Otherwise returns - `IOLoop.instance()`, i.e. the main thread's `IOLoop`. - - A common pattern for classes that depend on ``IOLoops`` is to use - a default argument to enable programs with multiple ``IOLoops`` - but not require the argument for simpler applications:: - - class MyClass(object): - def __init__(self, io_loop=None): - self.io_loop = io_loop or IOLoop.current() + If an `IOLoop` is currently running or has been marked as + current by `make_current`, returns that instance. If there is + no current `IOLoop`, returns `IOLoop.instance()` (i.e. the + main thread's `IOLoop`, creating one if necessary) if ``instance`` + is true. In general you should use `IOLoop.current` as the default when constructing an asynchronous object, and use `IOLoop.instance` when you mean to communicate to the main thread from a different one. + + .. versionchanged:: 4.1 + Added ``instance`` argument to control the + """ current = getattr(IOLoop._current, "instance", None) - if current is None: + if current is None and instance: return IOLoop.instance() return current @@ -184,9 +195,13 @@ class IOLoop(Configurable): An `IOLoop` automatically becomes current for its thread when it is started, but it is sometimes useful to call - `make_current` explictly before starting the `IOLoop`, + `make_current` explicitly before starting the `IOLoop`, so that code run at startup time can find the right instance. + + .. versionchanged:: 4.1 + An `IOLoop` created while there is no current `IOLoop` + will automatically become current. """ IOLoop._current.instance = self @@ -211,7 +226,8 @@ class IOLoop(Configurable): return SelectIOLoop def initialize(self): - pass + if IOLoop.current(instance=False) is None: + self.make_current() def close(self, all_fds=False): """Closes the `IOLoop`, freeing any resources used. @@ -241,21 +257,40 @@ class IOLoop(Configurable): raise NotImplementedError() def add_handler(self, fd, handler, events): - """Registers the given handler to receive the given events for fd. + """Registers the given handler to receive the given events for ``fd``. + + The ``fd`` argument may either be an integer file descriptor or + a file-like object with a ``fileno()`` method (and optionally a + ``close()`` method, which may be called when the `IOLoop` is shut + down). The ``events`` argument is a bitwise or of the constants ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``. When an event occurs, ``handler(fd, events)`` will be run. + + .. versionchanged:: 4.0 + Added the ability to pass file-like objects in addition to + raw file descriptors. """ raise NotImplementedError() def update_handler(self, fd, events): - """Changes the events we listen for fd.""" + """Changes the events we listen for ``fd``. + + .. versionchanged:: 4.0 + Added the ability to pass file-like objects in addition to + raw file descriptors. + """ raise NotImplementedError() def remove_handler(self, fd): - """Stop listening for events on fd.""" + """Stop listening for events on ``fd``. + + .. versionchanged:: 4.0 + Added the ability to pass file-like objects in addition to + raw file descriptors. + """ raise NotImplementedError() def set_blocking_signal_threshold(self, seconds, action): @@ -298,6 +333,22 @@ class IOLoop(Configurable): """ raise NotImplementedError() + def _setup_logging(self): + """The IOLoop catches and logs exceptions, so it's + important that log output be visible. However, python's + default behavior for non-root loggers (prior to python + 3.2) is to print an unhelpful "no handlers could be + found" message rather than the actual log entry, so we + must explicitly configure logging if we've made it this + far without anything. + + This method should be called from start() in subclasses. + """ + if not any([logging.getLogger().handlers, + logging.getLogger('tornado').handlers, + logging.getLogger('tornado.application').handlers]): + logging.basicConfig() + def stop(self): """Stop the I/O loop. @@ -353,10 +404,10 @@ class IOLoop(Configurable): future_cell[0] = TracebackFuture() future_cell[0].set_exc_info(sys.exc_info()) else: - if isinstance(result, Future): + if is_future(result): future_cell[0] = result else: - future_cell[0] = Future() + future_cell[0] = TracebackFuture() future_cell[0].set_result(result) self.add_future(future_cell[0], lambda future: self.stop()) self.add_callback(run) @@ -384,7 +435,7 @@ class IOLoop(Configurable): """ return time.time() - def add_timeout(self, deadline, callback): + def add_timeout(self, deadline, callback, *args, **kwargs): """Runs the ``callback`` at the time ``deadline`` from the I/O loop. Returns an opaque handle that may be passed to @@ -393,13 +444,59 @@ class IOLoop(Configurable): ``deadline`` may be a number denoting a time (on the same scale as `IOLoop.time`, normally `time.time`), or a `datetime.timedelta` object for a deadline relative to the - current time. + current time. Since Tornado 4.0, `call_later` is a more + convenient alternative for the relative case since it does not + require a timedelta object. Note that it is not safe to call `add_timeout` from other threads. Instead, you must use `add_callback` to transfer control to the `IOLoop`'s thread, and then call `add_timeout` from there. + + Subclasses of IOLoop must implement either `add_timeout` or + `call_at`; the default implementations of each will call + the other. `call_at` is usually easier to implement, but + subclasses that wish to maintain compatibility with Tornado + versions prior to 4.0 must use `add_timeout` instead. + + .. versionchanged:: 4.0 + Now passes through ``*args`` and ``**kwargs`` to the callback. """ - raise NotImplementedError() + if isinstance(deadline, numbers.Real): + return self.call_at(deadline, callback, *args, **kwargs) + elif isinstance(deadline, datetime.timedelta): + return self.call_at(self.time() + timedelta_to_seconds(deadline), + callback, *args, **kwargs) + else: + raise TypeError("Unsupported deadline %r" % deadline) + + def call_later(self, delay, callback, *args, **kwargs): + """Runs the ``callback`` after ``delay`` seconds have passed. + + Returns an opaque handle that may be passed to `remove_timeout` + to cancel. Note that unlike the `asyncio` method of the same + name, the returned object does not have a ``cancel()`` method. + + See `add_timeout` for comments on thread-safety and subclassing. + + .. versionadded:: 4.0 + """ + return self.call_at(self.time() + delay, callback, *args, **kwargs) + + def call_at(self, when, callback, *args, **kwargs): + """Runs the ``callback`` at the absolute time designated by ``when``. + + ``when`` must be a number using the same reference point as + `IOLoop.time`. + + Returns an opaque handle that may be passed to `remove_timeout` + to cancel. Note that unlike the `asyncio` method of the same + name, the returned object does not have a ``cancel()`` method. + + See `add_timeout` for comments on thread-safety and subclassing. + + .. versionadded:: 4.0 + """ + return self.add_timeout(when, callback, *args, **kwargs) def remove_timeout(self, timeout): """Cancels a pending timeout. @@ -437,6 +534,19 @@ class IOLoop(Configurable): """ raise NotImplementedError() + def spawn_callback(self, callback, *args, **kwargs): + """Calls the given callback on the next IOLoop iteration. + + Unlike all other callback-related methods on IOLoop, + ``spawn_callback`` does not associate the callback with its caller's + ``stack_context``, so it is suitable for fire-and-forget callbacks + that should not interfere with the caller. + + .. versionadded:: 4.0 + """ + with stack_context.NullContext(): + self.add_callback(callback, *args, **kwargs) + def add_future(self, future, callback): """Schedules a callback on the ``IOLoop`` when the given `.Future` is finished. @@ -444,7 +554,7 @@ class IOLoop(Configurable): The callback is invoked with one argument, the `.Future`. """ - assert isinstance(future, Future) + assert is_future(future) callback = stack_context.wrap(callback) future.add_done_callback( lambda future: self.add_callback(callback, future)) @@ -455,7 +565,13 @@ class IOLoop(Configurable): For use in subclasses. """ try: - callback() + ret = callback() + if ret is not None and is_future(ret): + # Functions that return Futures typically swallow all + # exceptions and store them in the Future. If a Future + # makes it out to the IOLoop, ensure its exception (if any) + # gets logged too. + self.add_future(ret, lambda f: f.result()) except Exception: self.handle_callback_exception(callback) @@ -471,6 +587,47 @@ class IOLoop(Configurable): """ app_log.error("Exception in callback %r", callback, exc_info=True) + def split_fd(self, fd): + """Returns an (fd, obj) pair from an ``fd`` parameter. + + We accept both raw file descriptors and file-like objects as + input to `add_handler` and related methods. When a file-like + object is passed, we must retain the object itself so we can + close it correctly when the `IOLoop` shuts down, but the + poller interfaces favor file descriptors (they will accept + file-like objects and call ``fileno()`` for you, but they + always return the descriptor itself). + + This method is provided for use by `IOLoop` subclasses and should + not generally be used by application code. + + .. versionadded:: 4.0 + """ + try: + return fd.fileno(), fd + except AttributeError: + return fd, fd + + def close_fd(self, fd): + """Utility method to close an ``fd``. + + If ``fd`` is a file-like object, we close it directly; otherwise + we use `os.close`. + + This method is provided for use by `IOLoop` subclasses (in + implementations of ``IOLoop.close(all_fds=True)`` and should + not generally be used by application code. + + .. versionadded:: 4.0 + """ + try: + try: + fd.close() + except AttributeError: + os.close(fd) + except OSError: + pass + class PollIOLoop(IOLoop): """Base class for IOLoops built around a select-like function. @@ -496,6 +653,7 @@ class PollIOLoop(IOLoop): self._closing = False self._thread_ident = None self._blocking_signal_threshold = None + self._timeout_counter = itertools.count() # Create a pipe that we send bogus data to when we want to wake # the I/O loop when it is idle @@ -509,26 +667,24 @@ class PollIOLoop(IOLoop): self._closing = True self.remove_handler(self._waker.fileno()) if all_fds: - for fd in self._handlers.keys(): - try: - close_method = getattr(fd, 'close', None) - if close_method is not None: - close_method() - else: - os.close(fd) - except Exception: - gen_log.debug("error closing fd %s", fd, exc_info=True) + for fd, handler in self._handlers.values(): + self.close_fd(fd) self._waker.close() self._impl.close() + self._callbacks = None + self._timeouts = None def add_handler(self, fd, handler, events): - self._handlers[fd] = stack_context.wrap(handler) + fd, obj = self.split_fd(fd) + self._handlers[fd] = (obj, stack_context.wrap(handler)) self._impl.register(fd, events | self.ERROR) def update_handler(self, fd, events): + fd, obj = self.split_fd(fd) self._impl.modify(fd, events | self.ERROR) def remove_handler(self, fd): + fd, obj = self.split_fd(fd) self._handlers.pop(fd, None) self._events.pop(fd, None) try: @@ -547,15 +703,9 @@ class PollIOLoop(IOLoop): action if action is not None else signal.SIG_DFL) def start(self): - if not logging.getLogger().handlers: - # The IOLoop catches and logs exceptions, so it's - # important that log output be visible. However, python's - # default behavior for non-root loggers (prior to python - # 3.2) is to print an unhelpful "no handlers could be - # found" message rather than the actual log entry, so we - # must explicitly configure logging if we've made it this - # far without anything. - logging.basicConfig() + if self._running: + raise RuntimeError("IOLoop is already running") + self._setup_logging() if self._stopped: self._stopped = False return @@ -577,7 +727,7 @@ class PollIOLoop(IOLoop): # # If someone has already set a wakeup fd, we don't want to # disturb it. This is an issue for twisted, which does its - # SIGCHILD processing in response to its own wakeup fd being + # SIGCHLD processing in response to its own wakeup fd being # written to. As long as the wakeup fd is registered on the IOLoop, # the loop will still wake up and everything should work. old_wakeup_fd = None @@ -595,98 +745,117 @@ class PollIOLoop(IOLoop): except ValueError: # non-main thread pass - while True: - poll_timeout = 3600.0 + try: + while True: + # Prevent IO event starvation by delaying new callbacks + # to the next iteration of the event loop. + with self._callback_lock: + callbacks = self._callbacks + self._callbacks = [] - # Prevent IO event starvation by delaying new callbacks - # to the next iteration of the event loop. - with self._callback_lock: - callbacks = self._callbacks - self._callbacks = [] - for callback in callbacks: - self._run_callback(callback) + # Add any timeouts that have come due to the callback list. + # Do not run anything until we have determined which ones + # are ready, so timeouts that call add_timeout cannot + # schedule anything in this iteration. + due_timeouts = [] + if self._timeouts: + now = self.time() + while self._timeouts: + if self._timeouts[0].callback is None: + # The timeout was cancelled. Note that the + # cancellation check is repeated below for timeouts + # that are cancelled by another timeout or callback. + heapq.heappop(self._timeouts) + self._cancellations -= 1 + elif self._timeouts[0].deadline <= now: + due_timeouts.append(heapq.heappop(self._timeouts)) + else: + break + if (self._cancellations > 512 + and self._cancellations > (len(self._timeouts) >> 1)): + # Clean up the timeout queue when it gets large and it's + # more than half cancellations. + self._cancellations = 0 + self._timeouts = [x for x in self._timeouts + if x.callback is not None] + heapq.heapify(self._timeouts) - if self._timeouts: - now = self.time() - while self._timeouts: - if self._timeouts[0].callback is None: - # the timeout was cancelled - heapq.heappop(self._timeouts) - self._cancellations -= 1 - elif self._timeouts[0].deadline <= now: - timeout = heapq.heappop(self._timeouts) + for callback in callbacks: + self._run_callback(callback) + for timeout in due_timeouts: + if timeout.callback is not None: self._run_callback(timeout.callback) - else: - seconds = self._timeouts[0].deadline - now - poll_timeout = min(seconds, poll_timeout) - break - if (self._cancellations > 512 - and self._cancellations > (len(self._timeouts) >> 1)): - # Clean up the timeout queue when it gets large and it's - # more than half cancellations. - self._cancellations = 0 - self._timeouts = [x for x in self._timeouts - if x.callback is not None] - heapq.heapify(self._timeouts) + # Closures may be holding on to a lot of memory, so allow + # them to be freed before we go into our poll wait. + callbacks = callback = due_timeouts = timeout = None - if self._callbacks: - # If any callbacks or timeouts called add_callback, - # we don't want to wait in poll() before we run them. - poll_timeout = 0.0 - - if not self._running: - break - - if self._blocking_signal_threshold is not None: - # clear alarm so it doesn't fire while poll is waiting for - # events. - signal.setitimer(signal.ITIMER_REAL, 0, 0) - - try: - event_pairs = self._impl.poll(poll_timeout) - except Exception as e: - # Depending on python version and IOLoop implementation, - # different exception types may be thrown and there are - # two ways EINTR might be signaled: - # * e.errno == errno.EINTR - # * e.args is like (errno.EINTR, 'Interrupted system call') - if (getattr(e, 'errno', None) == errno.EINTR or - (isinstance(getattr(e, 'args', None), tuple) and - len(e.args) == 2 and e.args[0] == errno.EINTR)): - continue + if self._callbacks: + # If any callbacks or timeouts called add_callback, + # we don't want to wait in poll() before we run them. + poll_timeout = 0.0 + elif self._timeouts: + # If there are any timeouts, schedule the first one. + # Use self.time() instead of 'now' to account for time + # spent running callbacks. + poll_timeout = self._timeouts[0].deadline - self.time() + poll_timeout = max(0, min(poll_timeout, _POLL_TIMEOUT)) else: - raise + # No timeouts and no callbacks, so use the default. + poll_timeout = _POLL_TIMEOUT - if self._blocking_signal_threshold is not None: - signal.setitimer(signal.ITIMER_REAL, - self._blocking_signal_threshold, 0) + if not self._running: + break + + if self._blocking_signal_threshold is not None: + # clear alarm so it doesn't fire while poll is waiting for + # events. + signal.setitimer(signal.ITIMER_REAL, 0, 0) - # Pop one fd at a time from the set of pending fds and run - # its handler. Since that handler may perform actions on - # other file descriptors, there may be reentrant calls to - # this IOLoop that update self._events - self._events.update(event_pairs) - while self._events: - fd, events = self._events.popitem() try: - self._handlers[fd](fd, events) - except (OSError, IOError) as e: - if e.args[0] == errno.EPIPE: - # Happens when the client closes the connection - pass + event_pairs = self._impl.poll(poll_timeout) + except Exception as e: + # Depending on python version and IOLoop implementation, + # different exception types may be thrown and there are + # two ways EINTR might be signaled: + # * e.errno == errno.EINTR + # * e.args is like (errno.EINTR, 'Interrupted system call') + if errno_from_exception(e) == errno.EINTR: + continue else: - app_log.error("Exception in I/O handler for fd %s", - fd, exc_info=True) - except Exception: - app_log.error("Exception in I/O handler for fd %s", - fd, exc_info=True) - # reset the stopped flag so another start/stop pair can be issued - self._stopped = False - if self._blocking_signal_threshold is not None: - signal.setitimer(signal.ITIMER_REAL, 0, 0) - IOLoop._current.instance = old_current - if old_wakeup_fd is not None: - signal.set_wakeup_fd(old_wakeup_fd) + raise + + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, + self._blocking_signal_threshold, 0) + + # Pop one fd at a time from the set of pending fds and run + # its handler. Since that handler may perform actions on + # other file descriptors, there may be reentrant calls to + # this IOLoop that update self._events + self._events.update(event_pairs) + while self._events: + fd, events = self._events.popitem() + try: + fd_obj, handler_func = self._handlers[fd] + handler_func(fd_obj, events) + except (OSError, IOError) as e: + if errno_from_exception(e) == errno.EPIPE: + # Happens when the client closes the connection + pass + else: + self.handle_callback_exception(self._handlers.get(fd)) + except Exception: + self.handle_callback_exception(self._handlers.get(fd)) + fd_obj = handler_func = None + + finally: + # reset the stopped flag so another start/stop pair can be issued + self._stopped = False + if self._blocking_signal_threshold is not None: + signal.setitimer(signal.ITIMER_REAL, 0, 0) + IOLoop._current.instance = old_current + if old_wakeup_fd is not None: + signal.set_wakeup_fd(old_wakeup_fd) def stop(self): self._running = False @@ -696,8 +865,11 @@ class PollIOLoop(IOLoop): def time(self): return self.time_func() - def add_timeout(self, deadline, callback): - timeout = _Timeout(deadline, stack_context.wrap(callback), self) + def call_at(self, deadline, callback, *args, **kwargs): + timeout = _Timeout( + deadline, + functools.partial(stack_context.wrap(callback), *args, **kwargs), + self) heapq.heappush(self._timeouts, timeout) return timeout @@ -717,14 +889,14 @@ class PollIOLoop(IOLoop): list_empty = not self._callbacks self._callbacks.append(functools.partial( stack_context.wrap(callback), *args, **kwargs)) - if list_empty and thread.get_ident() != self._thread_ident: - # If we're in the IOLoop's thread, we know it's not currently - # polling. If we're not, and we added the first callback to an - # empty list, we may need to wake it up (it may wake up on its - # own, but an occasional extra wake is harmless). Waking - # up a polling IOLoop is relatively expensive, so we try to - # avoid it when we can. - self._waker.wake() + if list_empty and thread.get_ident() != self._thread_ident: + # If we're in the IOLoop's thread, we know it's not currently + # polling. If we're not, and we added the first callback to an + # empty list, we may need to wake it up (it may wake up on its + # own, but an occasional extra wake is harmless). Waking + # up a polling IOLoop is relatively expensive, so we try to + # avoid it when we can. + self._waker.wake() def add_callback_from_signal(self, callback, *args, **kwargs): with stack_context.NullContext(): @@ -749,33 +921,26 @@ class _Timeout(object): """An IOLoop timeout, a UNIX timestamp and a callback""" # Reduce memory overhead when there are lots of pending callbacks - __slots__ = ['deadline', 'callback'] + __slots__ = ['deadline', 'callback', 'tiebreaker'] def __init__(self, deadline, callback, io_loop): - if isinstance(deadline, numbers.Real): - self.deadline = deadline - elif isinstance(deadline, datetime.timedelta): - self.deadline = io_loop.time() + _Timeout.timedelta_to_seconds(deadline) - else: + if not isinstance(deadline, numbers.Real): raise TypeError("Unsupported deadline %r" % deadline) + self.deadline = deadline self.callback = callback - - @staticmethod - def timedelta_to_seconds(td): - """Equivalent to td.total_seconds() (introduced in python 2.7).""" - return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 ** 6) / float(10 ** 6) + self.tiebreaker = next(io_loop._timeout_counter) # Comparison methods to sort by deadline, with object id as a tiebreaker # to guarantee a consistent ordering. The heapq module uses __le__ # in python2.5, and __lt__ in 2.6+ (sort() and most other comparisons # use __lt__). def __lt__(self, other): - return ((self.deadline, id(self)) < - (other.deadline, id(other))) + return ((self.deadline, self.tiebreaker) < + (other.deadline, other.tiebreaker)) def __le__(self, other): - return ((self.deadline, id(self)) <= - (other.deadline, id(other))) + return ((self.deadline, self.tiebreaker) <= + (other.deadline, other.tiebreaker)) class PeriodicCallback(object): @@ -784,6 +949,9 @@ class PeriodicCallback(object): The callback is called every ``callback_time`` milliseconds. `start` must be called after the `PeriodicCallback` is created. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ def __init__(self, callback, callback_time, io_loop=None): self.callback = callback @@ -807,14 +975,22 @@ class PeriodicCallback(object): self.io_loop.remove_timeout(self._timeout) self._timeout = None + def is_running(self): + """Return True if this `.PeriodicCallback` has been started. + + .. versionadded:: 4.1 + """ + return self._running + def _run(self): if not self._running: return try: - self.callback() + return self.callback() except Exception: - app_log.error("Error in periodic callback", exc_info=True) - self._schedule_next() + self.io_loop.handle_callback_exception(self.callback) + finally: + self._schedule_next() def _schedule_next(self): if self._running: diff --git a/vendor/tornado/iostream.py b/vendor/tornado/iostream.py index 079012c9..cdb6250b 100644 --- a/vendor/tornado/iostream.py +++ b/vendor/tornado/iostream.py @@ -31,22 +31,58 @@ import errno import numbers import os import socket -import ssl import sys import re +from tornado.concurrent import TracebackFuture from tornado import ioloop from tornado.log import gen_log, app_log from tornado.netutil import ssl_wrap_socket, ssl_match_hostname, SSLCertificateError from tornado import stack_context -from tornado.util import bytes_type +from tornado.util import errno_from_exception try: from tornado.platform.posix import _set_nonblocking except ImportError: _set_nonblocking = None +try: + import ssl +except ImportError: + # ssl is not available on Google App Engine + ssl = None +# These errnos indicate that a non-blocking operation must be retried +# at a later time. On most platforms they're the same value, but on +# some they differ. +_ERRNO_WOULDBLOCK = (errno.EWOULDBLOCK, errno.EAGAIN) + +if hasattr(errno, "WSAEWOULDBLOCK"): + _ERRNO_WOULDBLOCK += (errno.WSAEWOULDBLOCK,) + +# These errnos indicate that a connection has been abruptly terminated. +# They should be caught and handled less noisily than other errors. +_ERRNO_CONNRESET = (errno.ECONNRESET, errno.ECONNABORTED, errno.EPIPE, + errno.ETIMEDOUT) + +if hasattr(errno, "WSAECONNRESET"): + _ERRNO_CONNRESET += (errno.WSAECONNRESET, errno.WSAECONNABORTED, errno.WSAETIMEDOUT) + +if sys.platform == 'darwin': + # OSX appears to have a race condition that causes send(2) to return + # EPROTOTYPE if called while a socket is being torn down: + # http://erickt.github.io/blog/2014/11/19/adventures-in-debugging-a-potential-osx-kernel-bug/ + # Since the socket is being closed anyway, treat this as an ECONNRESET + # instead of an unexpected error. + _ERRNO_CONNRESET += (errno.EPROTOTYPE,) + +# More non-portable errnos: +_ERRNO_INPROGRESS = (errno.EINPROGRESS,) + +if hasattr(errno, "WSAEINPROGRESS"): + _ERRNO_INPROGRESS += (errno.WSAEINPROGRESS,) + +####################################################### class StreamClosedError(IOError): """Exception raised by `IOStream` methods when the stream is closed. @@ -57,12 +93,31 @@ class StreamClosedError(IOError): pass +class UnsatisfiableReadError(Exception): + """Exception raised when a read cannot be satisfied. + + Raised by ``read_until`` and ``read_until_regex`` with a ``max_bytes`` + argument. + """ + pass + + +class StreamBufferFullError(Exception): + """Exception raised by `IOStream` methods when the buffer is full. + """ + + class BaseIOStream(object): """A utility class to write to and read from a non-blocking file or socket. We support a non-blocking ``write()`` and a family of ``read_*()`` methods. - All of the methods take callbacks (since writing and reading are - non-blocking and asynchronous). + All of the methods take an optional ``callback`` argument and return a + `.Future` only if no callback is given. When the operation completes, + the callback will be run or the `.Future` will resolve with the data + read (or ``None`` for ``write()``). All outstanding ``Futures`` will + resolve with a `StreamClosedError` when the stream is closed; users + of the callback interface will be notified via + `.BaseIOStream.set_close_callback` instead. When a stream is closed due to an error, the IOStream's ``error`` attribute contains the exception object. @@ -71,24 +126,49 @@ class BaseIOStream(object): `read_from_fd`, and optionally `get_fd_error`. """ def __init__(self, io_loop=None, max_buffer_size=None, - read_chunk_size=4096): + read_chunk_size=None, max_write_buffer_size=None): + """`BaseIOStream` constructor. + + :arg io_loop: The `.IOLoop` to use; defaults to `.IOLoop.current`. + Deprecated since Tornado 4.1. + :arg max_buffer_size: Maximum amount of incoming data to buffer; + defaults to 100MB. + :arg read_chunk_size: Amount of data to read at one time from the + underlying transport; defaults to 64KB. + :arg max_write_buffer_size: Amount of outgoing data to buffer; + defaults to unlimited. + + .. versionchanged:: 4.0 + Add the ``max_write_buffer_size`` parameter. Changed default + ``read_chunk_size`` to 64KB. + """ self.io_loop = io_loop or ioloop.IOLoop.current() self.max_buffer_size = max_buffer_size or 104857600 - self.read_chunk_size = read_chunk_size + # A chunk size that is too close to max_buffer_size can cause + # spurious failures. + self.read_chunk_size = min(read_chunk_size or 65536, + self.max_buffer_size // 2) + self.max_write_buffer_size = max_write_buffer_size self.error = None self._read_buffer = collections.deque() self._write_buffer = collections.deque() self._read_buffer_size = 0 + self._write_buffer_size = 0 self._write_buffer_frozen = False self._read_delimiter = None self._read_regex = None + self._read_max_bytes = None self._read_bytes = None + self._read_partial = False self._read_until_close = False self._read_callback = None + self._read_future = None self._streaming_callback = None self._write_callback = None + self._write_future = None self._close_callback = None self._connect_callback = None + self._connect_future = None self._connecting = False self._state = None self._pending_callbacks = 0 @@ -133,98 +213,182 @@ class BaseIOStream(object): """ return None - def read_until_regex(self, regex, callback): - """Run ``callback`` when we read the given regex pattern. + def read_until_regex(self, regex, callback=None, max_bytes=None): + """Asynchronously read until we have matched the given regex. - The callback will get the data read (including the data that - matched the regex and anything that came before it) as an argument. + The result includes the data that matches the regex and anything + that came before it. If a callback is given, it will be run + with the data as an argument; if not, this method returns a + `.Future`. + + If ``max_bytes`` is not None, the connection will be closed + if more than ``max_bytes`` bytes have been read and the regex is + not satisfied. + + .. versionchanged:: 4.0 + Added the ``max_bytes`` argument. The ``callback`` argument is + now optional and a `.Future` will be returned if it is omitted. """ - self._set_read_callback(callback) + future = self._set_read_callback(callback) self._read_regex = re.compile(regex) - self._try_inline_read() + self._read_max_bytes = max_bytes + try: + self._try_inline_read() + except UnsatisfiableReadError as e: + # Handle this the same way as in _handle_events. + gen_log.info("Unsatisfiable read, closing connection: %s" % e) + self.close(exc_info=True) + return future + except: + if future is not None: + # Ensure that the future doesn't log an error because its + # failure was never examined. + future.add_done_callback(lambda f: f.exception()) + raise + return future - def read_until(self, delimiter, callback): - """Run ``callback`` when we read the given delimiter. + def read_until(self, delimiter, callback=None, max_bytes=None): + """Asynchronously read until we have found the given delimiter. - The callback will get the data read (including the delimiter) - as an argument. + The result includes all the data read including the delimiter. + If a callback is given, it will be run with the data as an argument; + if not, this method returns a `.Future`. + + If ``max_bytes`` is not None, the connection will be closed + if more than ``max_bytes`` bytes have been read and the delimiter + is not found. + + .. versionchanged:: 4.0 + Added the ``max_bytes`` argument. The ``callback`` argument is + now optional and a `.Future` will be returned if it is omitted. """ - self._set_read_callback(callback) + future = self._set_read_callback(callback) self._read_delimiter = delimiter - self._try_inline_read() + self._read_max_bytes = max_bytes + try: + self._try_inline_read() + except UnsatisfiableReadError as e: + # Handle this the same way as in _handle_events. + gen_log.info("Unsatisfiable read, closing connection: %s" % e) + self.close(exc_info=True) + return future + except: + if future is not None: + future.add_done_callback(lambda f: f.exception()) + raise + return future - def read_bytes(self, num_bytes, callback, streaming_callback=None): - """Run callback when we read the given number of bytes. + def read_bytes(self, num_bytes, callback=None, streaming_callback=None, + partial=False): + """Asynchronously read a number of bytes. If a ``streaming_callback`` is given, it will be called with chunks - of data as they become available, and the argument to the final - ``callback`` will be empty. Otherwise, the ``callback`` gets - the data as an argument. + of data as they become available, and the final result will be empty. + Otherwise, the result is all the data that was read. + If a callback is given, it will be run with the data as an argument; + if not, this method returns a `.Future`. + + If ``partial`` is true, the callback is run as soon as we have + any bytes to return (but never more than ``num_bytes``) + + .. versionchanged:: 4.0 + Added the ``partial`` argument. The callback argument is now + optional and a `.Future` will be returned if it is omitted. """ - self._set_read_callback(callback) + future = self._set_read_callback(callback) assert isinstance(num_bytes, numbers.Integral) self._read_bytes = num_bytes + self._read_partial = partial self._streaming_callback = stack_context.wrap(streaming_callback) - self._try_inline_read() + try: + self._try_inline_read() + except: + if future is not None: + future.add_done_callback(lambda f: f.exception()) + raise + return future - def read_until_close(self, callback, streaming_callback=None): - """Reads all data from the socket until it is closed. + def read_until_close(self, callback=None, streaming_callback=None): + """Asynchronously reads all data from the socket until it is closed. If a ``streaming_callback`` is given, it will be called with chunks - of data as they become available, and the argument to the final - ``callback`` will be empty. Otherwise, the ``callback`` gets the - data as an argument. + of data as they become available, and the final result will be empty. + Otherwise, the result is all the data that was read. + If a callback is given, it will be run with the data as an argument; + if not, this method returns a `.Future`. - Subject to ``max_buffer_size`` limit from `IOStream` constructor if - a ``streaming_callback`` is not used. + .. versionchanged:: 4.0 + The callback argument is now optional and a `.Future` will + be returned if it is omitted. """ - self._set_read_callback(callback) + future = self._set_read_callback(callback) self._streaming_callback = stack_context.wrap(streaming_callback) if self.closed(): if self._streaming_callback is not None: - self._run_callback(self._streaming_callback, - self._consume(self._read_buffer_size)) - self._run_callback(self._read_callback, - self._consume(self._read_buffer_size)) - self._streaming_callback = None - self._read_callback = None - return + self._run_read_callback(self._read_buffer_size, True) + self._run_read_callback(self._read_buffer_size, False) + return future self._read_until_close = True - self._streaming_callback = stack_context.wrap(streaming_callback) - self._try_inline_read() + try: + self._try_inline_read() + except: + future.add_done_callback(lambda f: f.exception()) + raise + return future def write(self, data, callback=None): - """Write the given data to this stream. + """Asynchronously write the given data to this stream. If ``callback`` is given, we call it when all of the buffered write data has been successfully written to the stream. If there was previously buffered write data and an old write callback, that callback is simply overwritten with this new callback. + + If no ``callback`` is given, this method returns a `.Future` that + resolves (with a result of ``None``) when the write has been + completed. If `write` is called again before that `.Future` has + resolved, the previous future will be orphaned and will never resolve. + + .. versionchanged:: 4.0 + Now returns a `.Future` if no callback is given. """ - assert isinstance(data, bytes_type) + assert isinstance(data, bytes) self._check_closed() # We use bool(_write_buffer) as a proxy for write_buffer_size>0, # so never put empty strings in the buffer. if data: + if (self.max_write_buffer_size is not None and + self._write_buffer_size + len(data) > self.max_write_buffer_size): + raise StreamBufferFullError("Reached maximum write buffer size") # Break up large contiguous strings before inserting them in the # write buffer, so we don't have to recopy the entire thing # as we slice off pieces to send to the socket. WRITE_BUFFER_CHUNK_SIZE = 128 * 1024 - if len(data) > WRITE_BUFFER_CHUNK_SIZE: - for i in range(0, len(data), WRITE_BUFFER_CHUNK_SIZE): - self._write_buffer.append(data[i:i + WRITE_BUFFER_CHUNK_SIZE]) - else: - self._write_buffer.append(data) - self._write_callback = stack_context.wrap(callback) + for i in range(0, len(data), WRITE_BUFFER_CHUNK_SIZE): + self._write_buffer.append(data[i:i + WRITE_BUFFER_CHUNK_SIZE]) + self._write_buffer_size += len(data) + if callback is not None: + self._write_callback = stack_context.wrap(callback) + future = None + else: + future = self._write_future = TracebackFuture() + future.add_done_callback(lambda f: f.exception()) if not self._connecting: self._handle_write() if self._write_buffer: self._add_io_state(self.io_loop.WRITE) self._maybe_add_error_listener() + return future def set_close_callback(self, callback): - """Call the given callback when the stream is closed.""" + """Call the given callback when the stream is closed. + + This is not necessary for applications that use the `.Future` + interface; all outstanding ``Futures`` will resolve with a + `StreamClosedError` when the stream is closed. + """ self._close_callback = stack_context.wrap(callback) + self._maybe_add_error_listener() def close(self, exc_info=False): """Close this stream. @@ -242,13 +406,9 @@ class BaseIOStream(object): if self._read_until_close: if (self._streaming_callback is not None and self._read_buffer_size): - self._run_callback(self._streaming_callback, - self._consume(self._read_buffer_size)) - callback = self._read_callback - self._read_callback = None + self._run_read_callback(self._read_buffer_size, True) self._read_until_close = False - self._run_callback(callback, - self._consume(self._read_buffer_size)) + self._run_read_callback(self._read_buffer_size, False) if self._state is not None: self.io_loop.remove_handler(self.fileno()) self._state = None @@ -257,19 +417,42 @@ class BaseIOStream(object): self._maybe_run_close_callback() def _maybe_run_close_callback(self): - if (self.closed() and self._close_callback and - self._pending_callbacks == 0): - # if there are pending callbacks, don't run the close callback - # until they're done (see _maybe_add_error_handler) - cb = self._close_callback - self._close_callback = None - self._run_callback(cb) + # If there are pending callbacks, don't run the close callback + # until they're done (see _maybe_add_error_handler) + if self.closed() and self._pending_callbacks == 0: + futures = [] + if self._read_future is not None: + futures.append(self._read_future) + self._read_future = None + if self._write_future is not None: + futures.append(self._write_future) + self._write_future = None + if self._connect_future is not None: + futures.append(self._connect_future) + self._connect_future = None + for future in futures: + if (isinstance(self.error, (socket.error, IOError)) and + errno_from_exception(self.error) in _ERRNO_CONNRESET): + # Treat connection resets as closed connections so + # clients only have to catch one kind of exception + # to avoid logging. + future.set_exception(StreamClosedError()) + else: + future.set_exception(self.error or StreamClosedError()) + if self._close_callback is not None: + cb = self._close_callback + self._close_callback = None + self._run_callback(cb) # Delete any unfinished callbacks to break up reference cycles. self._read_callback = self._write_callback = None + # Clear the buffers so they can be cleared immediately even + # if the IOStream object is kept alive by a reference cycle. + # TODO: Clear the read buffer too; it currently breaks some tests. + self._write_buffer = None def reading(self): """Returns true if we are currently reading from the stream.""" - return self._read_callback is not None + return self._read_callback is not None or self._read_future is not None def writing(self): """Returns true if we are currently writing to the stream.""" @@ -296,16 +479,22 @@ class BaseIOStream(object): def _handle_events(self, fd, events): if self.closed(): - gen_log.warning("Got events for closed stream %d", fd) + gen_log.warning("Got events for closed stream %s", fd) return try: + if self._connecting: + # Most IOLoops will report a write failed connect + # with the WRITE event, but SelectIOLoop reports a + # READ as well so we must check for connecting before + # either. + self._handle_connect() + if self.closed(): + return if events & self.io_loop.READ: self._handle_read() if self.closed(): return if events & self.io_loop.WRITE: - if self._connecting: - self._handle_connect() self._handle_write() if self.closed(): return @@ -321,13 +510,20 @@ class BaseIOStream(object): state |= self.io_loop.READ if self.writing(): state |= self.io_loop.WRITE - if state == self.io_loop.ERROR: + if state == self.io_loop.ERROR and self._read_buffer_size == 0: + # If the connection is idle, listen for reads too so + # we can tell if the connection is closed. If there is + # data in the read buffer we won't run the close callback + # yet anyway, so we don't need to listen in this case. state |= self.io_loop.READ if state != self._state: assert self._state is not None, \ "shouldn't happen: _handle_events without self._state" self._state = state self.io_loop.update_handler(self.fileno(), self._state) + except UnsatisfiableReadError as e: + gen_log.info("Unsatisfiable read, closing connection: %s" % e) + self.close(exc_info=True) except Exception: gen_log.error("Uncaught exception, closing connection.", exc_info=True) @@ -338,7 +534,7 @@ class BaseIOStream(object): def wrapper(): self._pending_callbacks -= 1 try: - callback(*args) + return callback(*args) except Exception: app_log.error("Uncaught exception, closing connection.", exc_info=True) @@ -350,7 +546,8 @@ class BaseIOStream(object): # Re-raise the exception so that IOLoop.handle_callback_exception # can see it and log the error raise - self._maybe_add_error_listener() + finally: + self._maybe_add_error_listener() # We schedule callbacks to be run on the next IOLoop iteration # rather than running them directly for several reasons: # * Prevents unbounded stack growth when a callback calls an @@ -368,42 +565,108 @@ class BaseIOStream(object): self._pending_callbacks += 1 self.io_loop.add_callback(wrapper) + def _read_to_buffer_loop(self): + # This method is called from _handle_read and _try_inline_read. + try: + if self._read_bytes is not None: + target_bytes = self._read_bytes + elif self._read_max_bytes is not None: + target_bytes = self._read_max_bytes + elif self.reading(): + # For read_until without max_bytes, or + # read_until_close, read as much as we can before + # scanning for the delimiter. + target_bytes = None + else: + target_bytes = 0 + next_find_pos = 0 + # Pretend to have a pending callback so that an EOF in + # _read_to_buffer doesn't trigger an immediate close + # callback. At the end of this method we'll either + # establish a real pending callback via + # _read_from_buffer or run the close callback. + # + # We need two try statements here so that + # pending_callbacks is decremented before the `except` + # clause below (which calls `close` and does need to + # trigger the callback) + self._pending_callbacks += 1 + while not self.closed(): + # Read from the socket until we get EWOULDBLOCK or equivalent. + # SSL sockets do some internal buffering, and if the data is + # sitting in the SSL object's buffer select() and friends + # can't see it; the only way to find out if it's there is to + # try to read it. + if self._read_to_buffer() == 0: + break + + self._run_streaming_callback() + + # If we've read all the bytes we can use, break out of + # this loop. We can't just call read_from_buffer here + # because of subtle interactions with the + # pending_callback and error_listener mechanisms. + # + # If we've reached target_bytes, we know we're done. + if (target_bytes is not None and + self._read_buffer_size >= target_bytes): + break + + # Otherwise, we need to call the more expensive find_read_pos. + # It's inefficient to do this on every read, so instead + # do it on the first read and whenever the read buffer + # size has doubled. + if self._read_buffer_size >= next_find_pos: + pos = self._find_read_pos() + if pos is not None: + return pos + next_find_pos = self._read_buffer_size * 2 + return self._find_read_pos() + finally: + self._pending_callbacks -= 1 + def _handle_read(self): try: - try: - # Pretend to have a pending callback so that an EOF in - # _read_to_buffer doesn't trigger an immediate close - # callback. At the end of this method we'll either - # estabilsh a real pending callback via - # _read_from_buffer or run the close callback. - # - # We need two try statements here so that - # pending_callbacks is decremented before the `except` - # clause below (which calls `close` and does need to - # trigger the callback) - self._pending_callbacks += 1 - while not self.closed(): - # Read from the socket until we get EWOULDBLOCK or equivalent. - # SSL sockets do some internal buffering, and if the data is - # sitting in the SSL object's buffer select() and friends - # can't see it; the only way to find out if it's there is to - # try to read it. - if self._read_to_buffer() == 0: - break - finally: - self._pending_callbacks -= 1 + pos = self._read_to_buffer_loop() + except UnsatisfiableReadError: + raise except Exception: gen_log.warning("error on read", exc_info=True) self.close(exc_info=True) return - if self._read_from_buffer(): + if pos is not None: + self._read_from_buffer(pos) return else: self._maybe_run_close_callback() def _set_read_callback(self, callback): - assert not self._read_callback, "Already reading" - self._read_callback = stack_context.wrap(callback) + assert self._read_callback is None, "Already reading" + assert self._read_future is None, "Already reading" + if callback is not None: + self._read_callback = stack_context.wrap(callback) + else: + self._read_future = TracebackFuture() + return self._read_future + + def _run_read_callback(self, size, streaming): + if streaming: + callback = self._streaming_callback + else: + callback = self._read_callback + self._read_callback = self._streaming_callback = None + if self._read_future is not None: + assert callback is None + future = self._read_future + self._read_future = None + future.set_result(self._consume(size)) + if callback is not None: + assert self._read_future is None + self._run_callback(callback, self._consume(size)) + else: + # If we scheduled a callback, we will add the error listener + # afterwards. If we didn't, we have to do it now. + self._maybe_add_error_listener() def _try_inline_read(self): """Attempt to complete the current read operation from buffered data. @@ -413,18 +676,14 @@ class BaseIOStream(object): listening for reads on the socket. """ # See if we've already got the data from a previous read - if self._read_from_buffer(): + self._run_streaming_callback() + pos = self._find_read_pos() + if pos is not None: + self._read_from_buffer(pos) return self._check_closed() try: - try: - # See comments in _handle_read about incrementing _pending_callbacks - self._pending_callbacks += 1 - while not self.closed(): - if self._read_to_buffer() == 0: - break - finally: - self._pending_callbacks -= 1 + pos = self._read_to_buffer_loop() except Exception: # If there was an in _read_to_buffer, we called close() already, # but couldn't run the close callback because of _pending_callbacks. @@ -432,9 +691,15 @@ class BaseIOStream(object): # applicable. self._maybe_run_close_callback() raise - if self._read_from_buffer(): + if pos is not None: + self._read_from_buffer(pos) return - self._maybe_add_error_listener() + # We couldn't satisfy the read inline, so either close the stream + # or listen for new data. + if self.closed(): + self._maybe_run_close_callback() + else: + self._add_io_state(ioloop.IOLoop.READ) def _read_to_buffer(self): """Reads from the socket and appends the result to the read buffer. @@ -447,7 +712,7 @@ class BaseIOStream(object): chunk = self.read_from_fd() except (socket.error, IOError, OSError) as e: # ssl.SSLError is a subclass of socket.error - if e.args[0] == errno.ECONNRESET: + if e.args[0] in _ERRNO_CONNRESET: # Treat ECONNRESET as a connection close rather than # an error to minimize log spam (the exception will # be available on self.error for apps that care). @@ -459,32 +724,42 @@ class BaseIOStream(object): return 0 self._read_buffer.append(chunk) self._read_buffer_size += len(chunk) - if self._read_buffer_size >= self.max_buffer_size: + if self._read_buffer_size > self.max_buffer_size: gen_log.error("Reached maximum read buffer size") self.close() - raise IOError("Reached maximum read buffer size") + raise StreamBufferFullError("Reached maximum read buffer size") return len(chunk) - def _read_from_buffer(self): - """Attempts to complete the currently-pending read from the buffer. - - Returns True if the read was completed. - """ + def _run_streaming_callback(self): if self._streaming_callback is not None and self._read_buffer_size: bytes_to_consume = self._read_buffer_size if self._read_bytes is not None: bytes_to_consume = min(self._read_bytes, bytes_to_consume) self._read_bytes -= bytes_to_consume - self._run_callback(self._streaming_callback, - self._consume(bytes_to_consume)) - if self._read_bytes is not None and self._read_buffer_size >= self._read_bytes: - num_bytes = self._read_bytes - callback = self._read_callback - self._read_callback = None - self._streaming_callback = None - self._read_bytes = None - self._run_callback(callback, self._consume(num_bytes)) - return True + self._run_read_callback(bytes_to_consume, True) + + def _read_from_buffer(self, pos): + """Attempts to complete the currently-pending read from the buffer. + + The argument is either a position in the read buffer or None, + as returned by _find_read_pos. + """ + self._read_bytes = self._read_delimiter = self._read_regex = None + self._read_partial = False + self._run_read_callback(pos, False) + + def _find_read_pos(self): + """Attempts to find a position in the read buffer that satisfies + the currently-pending read. + + Returns a position in the buffer if the current read can be satisfied, + or None if it cannot. + """ + if (self._read_bytes is not None and + (self._read_buffer_size >= self._read_bytes or + (self._read_partial and self._read_buffer_size > 0))): + num_bytes = min(self._read_bytes, self._read_buffer_size) + return num_bytes elif self._read_delimiter is not None: # Multi-byte delimiters (e.g. '\r\n') may straddle two # chunks in the read buffer, so we can't easily find them @@ -493,37 +768,40 @@ class BaseIOStream(object): # length) tend to be "line" oriented, the delimiter is likely # to be in the first few chunks. Merge the buffer gradually # since large merges are relatively expensive and get undone in - # consume(). + # _consume(). if self._read_buffer: while True: loc = self._read_buffer[0].find(self._read_delimiter) if loc != -1: - callback = self._read_callback delimiter_len = len(self._read_delimiter) - self._read_callback = None - self._streaming_callback = None - self._read_delimiter = None - self._run_callback(callback, - self._consume(loc + delimiter_len)) - return True + self._check_max_bytes(self._read_delimiter, + loc + delimiter_len) + return loc + delimiter_len if len(self._read_buffer) == 1: break _double_prefix(self._read_buffer) + self._check_max_bytes(self._read_delimiter, + len(self._read_buffer[0])) elif self._read_regex is not None: if self._read_buffer: while True: m = self._read_regex.search(self._read_buffer[0]) if m is not None: - callback = self._read_callback - self._read_callback = None - self._streaming_callback = None - self._read_regex = None - self._run_callback(callback, self._consume(m.end())) - return True + self._check_max_bytes(self._read_regex, m.end()) + return m.end() if len(self._read_buffer) == 1: break _double_prefix(self._read_buffer) - return False + self._check_max_bytes(self._read_regex, + len(self._read_buffer[0])) + return None + + def _check_max_bytes(self, delimiter, size): + if (self._read_max_bytes is not None and + size > self._read_max_bytes): + raise UnsatisfiableReadError( + "delimiter %r not found within %d bytes" % ( + delimiter, self._read_max_bytes)) def _handle_write(self): while self._write_buffer: @@ -550,23 +828,29 @@ class BaseIOStream(object): self._write_buffer_frozen = False _merge_prefix(self._write_buffer, num_bytes) self._write_buffer.popleft() - except socket.error as e: - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + self._write_buffer_size -= num_bytes + except (socket.error, IOError, OSError) as e: + if e.args[0] in _ERRNO_WOULDBLOCK: self._write_buffer_frozen = True break else: - if e.args[0] not in (errno.EPIPE, errno.ECONNRESET): + if e.args[0] not in _ERRNO_CONNRESET: # Broken pipe errors are usually caused by connection # reset, and its better to not log EPIPE errors to # minimize log spam - gen_log.warning("Write error on %d: %s", + gen_log.warning("Write error on %s: %s", self.fileno(), e) self.close(exc_info=True) return - if not self._write_buffer and self._write_callback: - callback = self._write_callback - self._write_callback = None - self._run_callback(callback) + if not self._write_buffer: + if self._write_callback: + callback = self._write_callback + self._write_callback = None + self._run_callback(callback) + if self._write_future: + future = self._write_future + self._write_future = None + future.set_result(None) def _consume(self, loc): if loc == 0: @@ -580,10 +864,19 @@ class BaseIOStream(object): raise StreamClosedError("Stream is closed") def _maybe_add_error_listener(self): - if self._state is None and self._pending_callbacks == 0: + # This method is part of an optimization: to detect a connection that + # is closed when we're not actively reading or writing, we must listen + # for read events. However, it is inefficient to do this when the + # connection is first established because we are going to read or write + # immediately anyway. Instead, we insert checks at various times to + # see if the connection is idle and add the read listener then. + if self._pending_callbacks != 0: + return + if self._state is None or self._state == ioloop.IOLoop.ERROR: if self.closed(): self._maybe_run_close_callback() - else: + elif (self._read_buffer_size == 0 and + self._close_callback is not None): self._add_io_state(ioloop.IOLoop.READ) def _add_io_state(self, state): @@ -667,7 +960,7 @@ class IOStream(BaseIOStream): super(IOStream, self).__init__(*args, **kwargs) def fileno(self): - return self.socket.fileno() + return self.socket def close_fd(self): self.socket.close() @@ -682,7 +975,7 @@ class IOStream(BaseIOStream): try: chunk = self.socket.recv(self.read_chunk_size) except socket.error as e: - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + if e.args[0] in _ERRNO_WOULDBLOCK: return None else: raise @@ -699,9 +992,19 @@ class IOStream(BaseIOStream): May only be called if the socket passed to the constructor was not previously connected. The address parameter is in the - same format as for `socket.connect `, - i.e. a ``(host, port)`` tuple. If ``callback`` is specified, - it will be called when the connection is completed. + same format as for `socket.connect ` for + the type of socket passed to the IOStream constructor, + e.g. an ``(ip, port)`` tuple. Hostnames are accepted here, + but will be resolved synchronously and block the IOLoop. + If you have a hostname instead of an IP address, the `.TCPClient` + class is recommended instead of calling this method directly. + `.TCPClient` will do asynchronous DNS resolution and handle + both IPv4 and IPv6. + + If ``callback`` is specified, it will be called with no + arguments when the connection is completed; if not this method + returns a `.Future` (whose result after a successful + connection will be the stream itself). If specified, the ``server_hostname`` parameter will be used in SSL connections for certificate validation (if requested in @@ -713,8 +1016,17 @@ class IOStream(BaseIOStream): which case the data will be written as soon as the connection is ready. Calling `IOStream` read methods before the socket is connected works on some platforms but is non-portable. + + .. versionchanged:: 4.0 + If no callback is given, returns a `.Future`. + """ self._connecting = True + if callback is not None: + self._connect_callback = stack_context.wrap(callback) + future = None + else: + future = self._connect_future = TracebackFuture() try: self.socket.connect(address) except socket.error as e: @@ -725,13 +1037,81 @@ class IOStream(BaseIOStream): # returned immediately when attempting to connect to # localhost, so handle them the same way as an error # reported later in _handle_connect. - if e.args[0] not in (errno.EINPROGRESS, errno.EWOULDBLOCK): - gen_log.warning("Connect error on fd %d: %s", - self.socket.fileno(), e) + if (errno_from_exception(e) not in _ERRNO_INPROGRESS and + errno_from_exception(e) not in _ERRNO_WOULDBLOCK): + if future is None: + gen_log.warning("Connect error on fd %s: %s", + self.socket.fileno(), e) self.close(exc_info=True) - return - self._connect_callback = stack_context.wrap(callback) + return future self._add_io_state(self.io_loop.WRITE) + return future + + def start_tls(self, server_side, ssl_options=None, server_hostname=None): + """Convert this `IOStream` to an `SSLIOStream`. + + This enables protocols that begin in clear-text mode and + switch to SSL after some initial negotiation (such as the + ``STARTTLS`` extension to SMTP and IMAP). + + This method cannot be used if there are outstanding reads + or writes on the stream, or if there is any data in the + IOStream's buffer (data in the operating system's socket + buffer is allowed). This means it must generally be used + immediately after reading or writing the last clear-text + data. It can also be used immediately after connecting, + before any reads or writes. + + The ``ssl_options`` argument may be either a dictionary + of options or an `ssl.SSLContext`. If a ``server_hostname`` + is given, it will be used for certificate verification + (as configured in the ``ssl_options``). + + This method returns a `.Future` whose result is the new + `SSLIOStream`. After this method has been called, + any other operation on the original stream is undefined. + + If a close callback is defined on this stream, it will be + transferred to the new stream. + + .. versionadded:: 4.0 + """ + if (self._read_callback or self._read_future or + self._write_callback or self._write_future or + self._connect_callback or self._connect_future or + self._pending_callbacks or self._closed or + self._read_buffer or self._write_buffer): + raise ValueError("IOStream is not idle; cannot convert to SSL") + if ssl_options is None: + ssl_options = {} + + socket = self.socket + self.io_loop.remove_handler(socket) + self.socket = None + socket = ssl_wrap_socket(socket, ssl_options, + server_hostname=server_hostname, + server_side=server_side, + do_handshake_on_connect=False) + orig_close_callback = self._close_callback + self._close_callback = None + + future = TracebackFuture() + ssl_stream = SSLIOStream(socket, ssl_options=ssl_options, + io_loop=self.io_loop) + # Wrap the original close callback so we can fail our Future as well. + # If we had an "unwrap" counterpart to this method we would need + # to restore the original callback after our Future resolves + # so that repeated wrap/unwrap calls don't build up layers. + def close_callback(): + if not future.done(): + future.set_exception(ssl_stream.error or StreamClosedError()) + if orig_close_callback is not None: + orig_close_callback() + ssl_stream.set_close_callback(close_callback) + ssl_stream._ssl_connect_callback = lambda: future.set_result(ssl_stream) + ssl_stream.max_buffer_size = self.max_buffer_size + ssl_stream.read_chunk_size = self.read_chunk_size + return future def _handle_connect(self): err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) @@ -741,14 +1121,19 @@ class IOStream(BaseIOStream): # an error state before the socket becomes writable, so # in that case a connection failure would be handled by the # error path in _handle_events instead of here. - gen_log.warning("Connect error on fd %d: %s", - self.socket.fileno(), errno.errorcode[err]) + if self._connect_future is None: + gen_log.warning("Connect error on fd %s: %s", + self.socket.fileno(), errno.errorcode[err]) self.close() return if self._connect_callback is not None: callback = self._connect_callback self._connect_callback = None self._run_callback(callback) + if self._connect_future is not None: + future = self._connect_future + self._connect_future = None + future.set_result(self) self._connecting = False def set_nodelay(self, value): @@ -761,7 +1146,7 @@ class IOStream(BaseIOStream): # Sometimes setsockopt will fail if the socket is closed # at the wrong time. This can happen with HTTPServer # resetting the value to false between requests. - if e.errno != errno.EINVAL: + if e.errno not in (errno.EINVAL, errno.ECONNRESET): raise @@ -789,6 +1174,17 @@ class SSLIOStream(IOStream): self._ssl_connect_callback = None self._server_hostname = None + # If the socket is already connected, attempt to start the handshake. + try: + self.socket.getpeername() + except socket.error: + pass + else: + # Indirectly start the handshake, which will run on the next + # IOLoop iteration and then the real IO state will be set in + # _handle_events. + self._add_io_state(self.io_loop.WRITE) + def reading(self): return self._handshake_reading or super(SSLIOStream, self).reading() @@ -816,13 +1212,19 @@ class SSLIOStream(IOStream): peer = self.socket.getpeername() except Exception: peer = '(not connected)' - gen_log.warning("SSL Error on %d %s: %s", + gen_log.warning("SSL Error on %s %s: %s", self.socket.fileno(), peer, err) return self.close(exc_info=True) raise except socket.error as err: - if err.args[0] in (errno.ECONNABORTED, errno.ECONNRESET): + # Some port scans (e.g. nmap in -sT mode) have been known + # to cause do_handshake to raise EBADF, so make that error + # quiet as well. + # https://groups.google.com/forum/?fromgroups#!topic/python-tornado/ApucKJat1_0 + if (err.args[0] in _ERRNO_CONNRESET or + err.args[0] == errno.EBADF): return self.close(exc_info=True) + raise except AttributeError: # On Linux, if the connection was reset before the call to # wrap_socket, do_handshake will fail with an @@ -882,19 +1284,33 @@ class SSLIOStream(IOStream): # has completed. self._ssl_connect_callback = stack_context.wrap(callback) self._server_hostname = server_hostname - super(SSLIOStream, self).connect(address, callback=None) + # Note: Since we don't pass our callback argument along to + # super.connect(), this will always return a Future. + # This is harmless, but a bit less efficient than it could be. + return super(SSLIOStream, self).connect(address, callback=None) def _handle_connect(self): + # Call the superclass method to check for errors. + super(SSLIOStream, self)._handle_connect() + if self.closed(): + return # When the connection is complete, wrap the socket for SSL # traffic. Note that we do this by overriding _handle_connect # instead of by passing a callback to super().connect because # user callbacks are enqueued asynchronously on the IOLoop, # but since _handle_events calls _handle_connect immediately # followed by _handle_write we need this to be synchronous. + # + # The IOLoop will get confused if we swap out self.socket while the + # fd is registered, so remove it now and re-register after + # wrap_socket(). + self.io_loop.remove_handler(self.socket) + old_state = self._state + self._state = None self.socket = ssl_wrap_socket(self.socket, self._ssl_options, server_hostname=self._server_hostname, do_handshake_on_connect=False) - super(SSLIOStream, self)._handle_connect() + self._add_io_state(old_state) def read_from_fd(self): if self._ssl_accepting: @@ -917,7 +1333,7 @@ class SSLIOStream(IOStream): else: raise except socket.error as e: - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + if e.args[0] in _ERRNO_WOULDBLOCK: return None else: raise @@ -953,9 +1369,9 @@ class PipeIOStream(BaseIOStream): try: chunk = os.read(self.fd, self.read_chunk_size) except (IOError, OSError) as e: - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + if errno_from_exception(e) in _ERRNO_WOULDBLOCK: return None - elif e.args[0] == errno.EBADF: + elif errno_from_exception(e) == errno.EBADF: # If the writing half of a pipe is closed, select will # report it as readable but reads will fail with EBADF. self.close(exc_info=True) diff --git a/vendor/tornado/locale.py b/vendor/tornado/locale.py index 310a5178..07c6d582 100644 --- a/vendor/tornado/locale.py +++ b/vendor/tornado/locale.py @@ -286,8 +286,6 @@ class Locale(object): This method is primarily intended for dates in the past. For dates in the future, we fall back to full format. """ - if self.code.startswith("ru"): - relative = False if isinstance(date, numbers.Real): date = datetime.datetime.utcfromtimestamp(date) now = datetime.datetime.utcnow() diff --git a/vendor/tornado/log.py b/vendor/tornado/log.py index fa11f379..374071d4 100644 --- a/vendor/tornado/log.py +++ b/vendor/tornado/log.py @@ -33,7 +33,6 @@ from __future__ import absolute_import, division, print_function, with_statement import logging import logging.handlers import sys -import time from tornado.escape import _unicode from tornado.util import unicode_type, basestring_type @@ -51,7 +50,7 @@ gen_log = logging.getLogger("tornado.general") def _stderr_supports_color(): color = False - if curses and sys.stderr.isatty(): + if curses and hasattr(sys.stderr, 'isatty') and sys.stderr.isatty(): try: curses.setupterm() if curses.tigetnum("colors") > 0: @@ -61,6 +60,13 @@ def _stderr_supports_color(): return color +def _safe_unicode(s): + try: + return _unicode(s) + except UnicodeDecodeError: + return repr(s) + + class LogFormatter(logging.Formatter): """Log formatter used in Tornado. @@ -74,10 +80,37 @@ class LogFormatter(logging.Formatter): `tornado.options.parse_command_line` (unless ``--logging=none`` is used). """ - def __init__(self, color=True, *args, **kwargs): - logging.Formatter.__init__(self, *args, **kwargs) - self._color = color and _stderr_supports_color() - if self._color: + DEFAULT_FORMAT = '%(color)s[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]%(end_color)s %(message)s' + DEFAULT_DATE_FORMAT = '%y%m%d %H:%M:%S' + DEFAULT_COLORS = { + logging.DEBUG: 4, # Blue + logging.INFO: 2, # Green + logging.WARNING: 3, # Yellow + logging.ERROR: 1, # Red + } + + def __init__(self, color=True, fmt=DEFAULT_FORMAT, + datefmt=DEFAULT_DATE_FORMAT, colors=DEFAULT_COLORS): + r""" + :arg bool color: Enables color support. + :arg string fmt: Log message format. + It will be applied to the attributes dict of log records. The + text between ``%(color)s`` and ``%(end_color)s`` will be colored + depending on the level if color support is on. + :arg dict colors: color mappings from logging level to terminal color + code + :arg string datefmt: Datetime format. + Used for formatting ``(asctime)`` placeholder in ``prefix_fmt``. + + .. versionchanged:: 3.2 + + Added ``fmt`` and ``datefmt`` arguments. + """ + logging.Formatter.__init__(self, datefmt=datefmt) + self._fmt = fmt + + self._colors = {} + if color and _stderr_supports_color(): # The curses module has some str/bytes confusion in # python3. Until version 3.2.3, most methods return # bytes, but only accept strings. In addition, we want to @@ -89,64 +122,56 @@ class LogFormatter(logging.Formatter): curses.tigetstr("setf") or "") if (3, 0) < sys.version_info < (3, 2, 3): fg_color = unicode_type(fg_color, "ascii") - self._colors = { - logging.DEBUG: unicode_type(curses.tparm(fg_color, 4), # Blue - "ascii"), - logging.INFO: unicode_type(curses.tparm(fg_color, 2), # Green - "ascii"), - logging.WARNING: unicode_type(curses.tparm(fg_color, 3), # Yellow - "ascii"), - logging.ERROR: unicode_type(curses.tparm(fg_color, 1), # Red - "ascii"), - } + + for levelno, code in colors.items(): + self._colors[levelno] = unicode_type(curses.tparm(fg_color, code), "ascii") self._normal = unicode_type(curses.tigetstr("sgr0"), "ascii") + else: + self._normal = '' def format(self, record): try: - record.message = record.getMessage() + message = record.getMessage() + assert isinstance(message, basestring_type) # guaranteed by logging + # Encoding notes: The logging module prefers to work with character + # strings, but only enforces that log messages are instances of + # basestring. In python 2, non-ascii bytestrings will make + # their way through the logging framework until they blow up with + # an unhelpful decoding error (with this formatter it happens + # when we attach the prefix, but there are other opportunities for + # exceptions further along in the framework). + # + # If a byte string makes it this far, convert it to unicode to + # ensure it will make it out to the logs. Use repr() as a fallback + # to ensure that all byte strings can be converted successfully, + # but don't do it by default so we don't add extra quotes to ascii + # bytestrings. This is a bit of a hacky place to do this, but + # it's worth it since the encoding errors that would otherwise + # result are so useless (and tornado is fond of using utf8-encoded + # byte strings whereever possible). + record.message = _safe_unicode(message) except Exception as e: record.message = "Bad message (%r): %r" % (e, record.__dict__) - assert isinstance(record.message, basestring_type) # guaranteed by logging - record.asctime = time.strftime( - "%y%m%d %H:%M:%S", self.converter(record.created)) - prefix = '[%(levelname)1.1s %(asctime)s %(module)s:%(lineno)d]' % \ - record.__dict__ - if self._color: - prefix = (self._colors.get(record.levelno, self._normal) + - prefix + self._normal) - # Encoding notes: The logging module prefers to work with character - # strings, but only enforces that log messages are instances of - # basestring. In python 2, non-ascii bytestrings will make - # their way through the logging framework until they blow up with - # an unhelpful decoding error (with this formatter it happens - # when we attach the prefix, but there are other opportunities for - # exceptions further along in the framework). - # - # If a byte string makes it this far, convert it to unicode to - # ensure it will make it out to the logs. Use repr() as a fallback - # to ensure that all byte strings can be converted successfully, - # but don't do it by default so we don't add extra quotes to ascii - # bytestrings. This is a bit of a hacky place to do this, but - # it's worth it since the encoding errors that would otherwise - # result are so useless (and tornado is fond of using utf8-encoded - # byte strings whereever possible). - def safe_unicode(s): - try: - return _unicode(s) - except UnicodeDecodeError: - return repr(s) + record.asctime = self.formatTime(record, self.datefmt) + + if record.levelno in self._colors: + record.color = self._colors[record.levelno] + record.end_color = self._normal + else: + record.color = record.end_color = '' + + formatted = self._fmt % record.__dict__ - formatted = prefix + " " + safe_unicode(record.message) if record.exc_info: if not record.exc_text: record.exc_text = self.formatException(record.exc_info) if record.exc_text: - # exc_text contains multiple lines. We need to safe_unicode + # exc_text contains multiple lines. We need to _safe_unicode # each line separately so that non-utf8 bytes don't cause # all the newlines to turn into '\n'. lines = [formatted.rstrip()] - lines.extend(safe_unicode(ln) for ln in record.exc_text.split('\n')) + lines.extend(_safe_unicode(ln) for ln in record.exc_text.split('\n')) formatted = '\n'.join(lines) return formatted.replace("\n", "\n ") @@ -154,12 +179,12 @@ class LogFormatter(logging.Formatter): def enable_pretty_logging(options=None, logger=None): """Turns on formatted logging output as configured. - This is called automaticaly by `tornado.options.parse_command_line` + This is called automatically by `tornado.options.parse_command_line` and `tornado.options.parse_config_file`. """ if options is None: from tornado.options import options - if options.logging == 'none': + if options.logging is None or options.logging.lower() == 'none': return if logger is None: logger = logging.getLogger() diff --git a/vendor/tornado/netutil.py b/vendor/tornado/netutil.py index 37037180..17e95804 100644 --- a/vendor/tornado/netutil.py +++ b/vendor/tornado/netutil.py @@ -20,18 +20,56 @@ from __future__ import absolute_import, division, print_function, with_statement import errno import os -import re +import sys import socket -import ssl import stat from tornado.concurrent import dummy_executor, run_on_executor from tornado.ioloop import IOLoop from tornado.platform.auto import set_close_exec -from tornado.util import Configurable +from tornado.util import u, Configurable, errno_from_exception +try: + import ssl +except ImportError: + # ssl is not available on Google App Engine + ssl = None -def bind_sockets(port, address=None, family=socket.AF_UNSPEC, backlog=128, flags=None): +try: + xrange # py2 +except NameError: + xrange = range # py3 + +if hasattr(ssl, 'match_hostname') and hasattr(ssl, 'CertificateError'): # python 3.2+ + ssl_match_hostname = ssl.match_hostname + SSLCertificateError = ssl.CertificateError +elif ssl is None: + ssl_match_hostname = SSLCertificateError = None +else: + import backports.ssl_match_hostname + ssl_match_hostname = backports.ssl_match_hostname.match_hostname + SSLCertificateError = backports.ssl_match_hostname.CertificateError + +# ThreadedResolver runs getaddrinfo on a thread. If the hostname is unicode, +# getaddrinfo attempts to import encodings.idna. If this is done at +# module-import time, the import lock is already held by the main thread, +# leading to deadlock. Avoid it by caching the idna encoder on the main +# thread now. +u('foo').encode('idna') + +# These errnos indicate that a non-blocking operation must be retried +# at a later time. On most platforms they're the same value, but on +# some they differ. +_ERRNO_WOULDBLOCK = (errno.EWOULDBLOCK, errno.EAGAIN) + +if hasattr(errno, "WSAEWOULDBLOCK"): + _ERRNO_WOULDBLOCK += (errno.WSAEWOULDBLOCK,) + +# Default backlog used when calling sock.listen() +_DEFAULT_BACKLOG = 128 + +def bind_sockets(port, address=None, family=socket.AF_UNSPEC, + backlog=_DEFAULT_BACKLOG, flags=None): """Creates listening sockets bound to the given port and address. Returns a list of socket objects (multiple sockets are returned if @@ -63,13 +101,23 @@ def bind_sockets(port, address=None, family=socket.AF_UNSPEC, backlog=128, flags family = socket.AF_INET if flags is None: flags = socket.AI_PASSIVE + bound_port = None for res in set(socket.getaddrinfo(address, port, family, socket.SOCK_STREAM, 0, flags)): af, socktype, proto, canonname, sockaddr = res + if (sys.platform == 'darwin' and address == 'localhost' and + af == socket.AF_INET6 and sockaddr[3] != 0): + # Mac OS X includes a link-local address fe80::1%lo0 in the + # getaddrinfo results for 'localhost'. However, the firewall + # doesn't understand that this is a local address and will + # prompt for access (often repeatedly, due to an apparent + # bug in its ability to remember granting access to an + # application). Skip these addresses. + continue try: sock = socket.socket(af, socktype, proto) except socket.error as e: - if e.args[0] == errno.EAFNOSUPPORT: + if errno_from_exception(e) == errno.EAFNOSUPPORT: continue raise set_close_exec(sock.fileno()) @@ -86,14 +134,22 @@ def bind_sockets(port, address=None, family=socket.AF_UNSPEC, backlog=128, flags # Python 2.x on windows doesn't have IPPROTO_IPV6. if hasattr(socket, "IPPROTO_IPV6"): sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_V6ONLY, 1) + + # automatic port allocation with port=None + # should bind on the same port on IPv4 and IPv6 + host, requested_port = sockaddr[:2] + if requested_port == 0 and bound_port is not None: + sockaddr = tuple([host, bound_port] + list(sockaddr[2:])) + sock.setblocking(0) sock.bind(sockaddr) + bound_port = sock.getsockname()[1] sock.listen(backlog) sockets.append(sock) return sockets if hasattr(socket, 'AF_UNIX'): - def bind_unix_socket(file, mode=0o600, backlog=128): + def bind_unix_socket(file, mode=0o600, backlog=_DEFAULT_BACKLOG): """Creates a listening unix socket. If a socket with the given name already exists, it will be deleted. @@ -110,7 +166,7 @@ if hasattr(socket, 'AF_UNIX'): try: st = os.stat(file) except OSError as err: - if err.errno != errno.ENOENT: + if errno_from_exception(err) != errno.ENOENT: raise else: if stat.S_ISSOCK(st.st_mode): @@ -131,27 +187,41 @@ def add_accept_handler(sock, callback, io_loop=None): address of the other end of the connection). Note that this signature is different from the ``callback(fd, events)`` signature used for `.IOLoop` handlers. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ if io_loop is None: io_loop = IOLoop.current() def accept_handler(fd, events): - while True: + # More connections may come in while we're handling callbacks; + # to prevent starvation of other tasks we must limit the number + # of connections we accept at a time. Ideally we would accept + # up to the number of connections that were waiting when we + # entered this method, but this information is not available + # (and rearranging this method to call accept() as many times + # as possible before running any callbacks would have adverse + # effects on load balancing in multiprocess configurations). + # Instead, we use the (default) listen backlog as a rough + # heuristic for the number of connections we can reasonably + # accept at once. + for i in xrange(_DEFAULT_BACKLOG): try: connection, address = sock.accept() except socket.error as e: - # EWOULDBLOCK and EAGAIN indicate we have accepted every + # _ERRNO_WOULDBLOCK indicate we have accepted every # connection that is available. - if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN): + if errno_from_exception(e) in _ERRNO_WOULDBLOCK: return # ECONNABORTED indicates that there was a connection # but it was closed while still in the accept queue. # (observed on FreeBSD). - if e.args[0] == errno.ECONNABORTED: + if errno_from_exception(e) == errno.ECONNABORTED: continue raise callback(connection, address) - io_loop.add_handler(sock.fileno(), accept_handler, IOLoop.READ) + io_loop.add_handler(sock, accept_handler, IOLoop.READ) def is_valid_ip(ip): @@ -159,6 +229,10 @@ def is_valid_ip(ip): Supports IPv4 and IPv6. """ + if not ip or '\x00' in ip: + # getaddrinfo resolves empty strings to localhost, and truncates + # on zero bytes. + return False try: res = socket.getaddrinfo(ip, 0, socket.AF_UNSPEC, socket.SOCK_STREAM, @@ -230,6 +304,9 @@ class ExecutorResolver(Resolver): The executor will be shut down when the resolver is closed unless ``close_resolver=False``; use this if you want to reuse the same executor elsewhere. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ def initialize(self, io_loop=None, executor=None, close_executor=True): self.io_loop = io_loop or IOLoop.current() @@ -363,6 +440,10 @@ def ssl_options_to_context(ssl_options): context.load_verify_locations(ssl_options['ca_certs']) if 'ciphers' in ssl_options: context.set_ciphers(ssl_options['ciphers']) + if hasattr(ssl, 'OP_NO_COMPRESSION'): + # Disable TLS compression to avoid CRIME and related attacks. + # This constant wasn't added until python 3.3. + context.options |= ssl.OP_NO_COMPRESSION return context @@ -387,73 +468,3 @@ def ssl_wrap_socket(socket, ssl_options, server_hostname=None, **kwargs): return context.wrap_socket(socket, **kwargs) else: return ssl.wrap_socket(socket, **dict(context, **kwargs)) - -if hasattr(ssl, 'match_hostname') and hasattr(ssl, 'CertificateError'): # python 3.2+ - ssl_match_hostname = ssl.match_hostname - SSLCertificateError = ssl.CertificateError -else: - # match_hostname was added to the standard library ssl module in python 3.2. - # The following code was backported for older releases and copied from - # https://bitbucket.org/brandon/backports.ssl_match_hostname - class SSLCertificateError(ValueError): - pass - - def _dnsname_to_pat(dn, max_wildcards=1): - pats = [] - for frag in dn.split(r'.'): - if frag.count('*') > max_wildcards: - # Issue #17980: avoid denials of service by refusing more - # than one wildcard per fragment. A survery of established - # policy among SSL implementations showed it to be a - # reasonable choice. - raise SSLCertificateError( - "too many wildcards in certificate DNS name: " + repr(dn)) - if frag == '*': - # When '*' is a fragment by itself, it matches a non-empty dotless - # fragment. - pats.append('[^.]+') - else: - # Otherwise, '*' matches any dotless fragment. - frag = re.escape(frag) - pats.append(frag.replace(r'\*', '[^.]*')) - return re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) - - def ssl_match_hostname(cert, hostname): - """Verify that *cert* (in decoded format as returned by - SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 rules - are mostly followed, but IP addresses are not accepted for *hostname*. - - CertificateError is raised on failure. On success, the function - returns nothing. - """ - if not cert: - raise ValueError("empty or no certificate") - dnsnames = [] - san = cert.get('subjectAltName', ()) - for key, value in san: - if key == 'DNS': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if not dnsnames: - # The subject is only checked when there is no dNSName entry - # in subjectAltName - for sub in cert.get('subject', ()): - for key, value in sub: - # XXX according to RFC 2818, the most specific Common Name - # must be used. - if key == 'commonName': - if _dnsname_to_pat(value).match(hostname): - return - dnsnames.append(value) - if len(dnsnames) > 1: - raise SSLCertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) - elif len(dnsnames) == 1: - raise SSLCertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) - else: - raise SSLCertificateError("no appropriate commonName or " - "subjectAltName fields were found") diff --git a/vendor/tornado/options.py b/vendor/tornado/options.py index 1105c0e9..c855407c 100644 --- a/vendor/tornado/options.py +++ b/vendor/tornado/options.py @@ -56,6 +56,18 @@ We support `datetimes `, `timedeltas the top-level functions in this module (`define`, `parse_command_line`, etc) simply call methods on it. You may create additional `OptionParser` instances to define isolated sets of options, such as for subcommands. + +.. note:: + + By default, several options are defined that will configure the + standard `logging` module when `parse_command_line` or `parse_config_file` + are called. If you want Tornado to leave the logging configuration + alone so you can manage it yourself, either pass ``--logging=none`` + on the command line or do the following to disable it in code:: + + from tornado.options import options, parse_command_line + options.logging = None + parse_command_line() """ from __future__ import absolute_import, division, print_function, with_statement @@ -67,7 +79,7 @@ import sys import os import textwrap -from tornado.escape import _unicode +from tornado.escape import _unicode, native_str from tornado.log import define_logging_options from tornado import stack_context from tornado.util import basestring_type, exec_in @@ -192,6 +204,13 @@ class OptionParser(object): (name, self._options[name].file_name)) frame = sys._getframe(0) options_file = frame.f_code.co_filename + + # Can be called directly, or through top level define() fn, in which + # case, step up above that frame to look for real caller. + if (frame.f_back.f_code.co_filename == options_file and + frame.f_back.f_code.co_name == 'define'): + frame = frame.f_back + file_name = frame.f_back.f_code.co_filename if file_name == options_file: file_name = "" @@ -259,10 +278,14 @@ class OptionParser(object): If ``final`` is ``False``, parse callbacks will not be run. This is useful for applications that wish to combine configurations from multiple sources. + + .. versionchanged:: 4.1 + Config files are now always interpreted as utf-8 instead of + the system default encoding. """ config = {} - with open(path) as f: - exec_in(f.read(), config, config) + with open(path, 'rb') as f: + exec_in(native_str(f.read()), config, config) for name in config: if name in self._options: self._options[name].set(config[name]) @@ -360,6 +383,8 @@ class _Mockable(object): class _Option(object): + UNSET = object() + def __init__(self, name, default=None, type=basestring_type, help=None, metavar=None, multiple=False, file_name=None, group_name=None, callback=None): @@ -374,10 +399,10 @@ class _Option(object): self.group_name = group_name self.callback = callback self.default = default - self._value = None + self._value = _Option.UNSET def value(self): - return self.default if self._value is None else self._value + return self.default if self._value is _Option.UNSET else self._value def parse(self, value): _parse = { diff --git a/vendor/tornado/platform/asyncio.py b/vendor/tornado/platform/asyncio.py new file mode 100644 index 00000000..bc685175 --- /dev/null +++ b/vendor/tornado/platform/asyncio.py @@ -0,0 +1,157 @@ +"""Bridges between the `asyncio` module and Tornado IOLoop. + +This is a work in progress and interfaces are subject to change. + +To test: +python3.4 -m tornado.test.runtests --ioloop=tornado.platform.asyncio.AsyncIOLoop +python3.4 -m tornado.test.runtests --ioloop=tornado.platform.asyncio.AsyncIOMainLoop +(the tests log a few warnings with AsyncIOMainLoop because they leave some +unfinished callbacks on the event loop that fail when it resumes) +""" + +from __future__ import absolute_import, division, print_function, with_statement +import functools + +import tornado.concurrent +from tornado.gen import convert_yielded +from tornado.ioloop import IOLoop +from tornado import stack_context + +try: + # Import the real asyncio module for py33+ first. Older versions of the + # trollius backport also use this name. + import asyncio +except ImportError as e: + # Asyncio itself isn't available; see if trollius is (backport to py26+). + try: + import trollius as asyncio + except ImportError: + # Re-raise the original asyncio error, not the trollius one. + raise e + +class BaseAsyncIOLoop(IOLoop): + def initialize(self, asyncio_loop, close_loop=False): + self.asyncio_loop = asyncio_loop + self.close_loop = close_loop + self.asyncio_loop.call_soon(self.make_current) + # Maps fd to (fileobj, handler function) pair (as in IOLoop.add_handler) + self.handlers = {} + # Set of fds listening for reads/writes + self.readers = set() + self.writers = set() + self.closing = False + + def close(self, all_fds=False): + self.closing = True + for fd in list(self.handlers): + fileobj, handler_func = self.handlers[fd] + self.remove_handler(fd) + if all_fds: + self.close_fd(fileobj) + if self.close_loop: + self.asyncio_loop.close() + + def add_handler(self, fd, handler, events): + fd, fileobj = self.split_fd(fd) + if fd in self.handlers: + raise ValueError("fd %s added twice" % fd) + self.handlers[fd] = (fileobj, stack_context.wrap(handler)) + if events & IOLoop.READ: + self.asyncio_loop.add_reader( + fd, self._handle_events, fd, IOLoop.READ) + self.readers.add(fd) + if events & IOLoop.WRITE: + self.asyncio_loop.add_writer( + fd, self._handle_events, fd, IOLoop.WRITE) + self.writers.add(fd) + + def update_handler(self, fd, events): + fd, fileobj = self.split_fd(fd) + if events & IOLoop.READ: + if fd not in self.readers: + self.asyncio_loop.add_reader( + fd, self._handle_events, fd, IOLoop.READ) + self.readers.add(fd) + else: + if fd in self.readers: + self.asyncio_loop.remove_reader(fd) + self.readers.remove(fd) + if events & IOLoop.WRITE: + if fd not in self.writers: + self.asyncio_loop.add_writer( + fd, self._handle_events, fd, IOLoop.WRITE) + self.writers.add(fd) + else: + if fd in self.writers: + self.asyncio_loop.remove_writer(fd) + self.writers.remove(fd) + + def remove_handler(self, fd): + fd, fileobj = self.split_fd(fd) + if fd not in self.handlers: + return + if fd in self.readers: + self.asyncio_loop.remove_reader(fd) + self.readers.remove(fd) + if fd in self.writers: + self.asyncio_loop.remove_writer(fd) + self.writers.remove(fd) + del self.handlers[fd] + + def _handle_events(self, fd, events): + fileobj, handler_func = self.handlers[fd] + handler_func(fileobj, events) + + def start(self): + self._setup_logging() + self.asyncio_loop.run_forever() + + def stop(self): + self.asyncio_loop.stop() + + def call_at(self, when, callback, *args, **kwargs): + # asyncio.call_at supports *args but not **kwargs, so bind them here. + # We do not synchronize self.time and asyncio_loop.time, so + # convert from absolute to relative. + return self.asyncio_loop.call_later( + max(0, when - self.time()), self._run_callback, + functools.partial(stack_context.wrap(callback), *args, **kwargs)) + + def remove_timeout(self, timeout): + timeout.cancel() + + def add_callback(self, callback, *args, **kwargs): + if self.closing: + raise RuntimeError("IOLoop is closing") + self.asyncio_loop.call_soon_threadsafe( + self._run_callback, + functools.partial(stack_context.wrap(callback), *args, **kwargs)) + + add_callback_from_signal = add_callback + + +class AsyncIOMainLoop(BaseAsyncIOLoop): + def initialize(self): + super(AsyncIOMainLoop, self).initialize(asyncio.get_event_loop(), + close_loop=False) + + +class AsyncIOLoop(BaseAsyncIOLoop): + def initialize(self): + super(AsyncIOLoop, self).initialize(asyncio.new_event_loop(), + close_loop=True) + +def to_tornado_future(asyncio_future): + """Convert an ``asyncio.Future`` to a `tornado.concurrent.Future`.""" + tf = tornado.concurrent.Future() + tornado.concurrent.chain_future(asyncio_future, tf) + return tf + +def to_asyncio_future(tornado_future): + """Convert a `tornado.concurrent.Future` to an ``asyncio.Future``.""" + af = asyncio.Future() + tornado.concurrent.chain_future(tornado_future, af) + return af + +if hasattr(convert_yielded, 'register'): + convert_yielded.register(asyncio.Future, to_tornado_future) diff --git a/vendor/tornado/platform/auto.py b/vendor/tornado/platform/auto.py index e55725b3..ddfe06b4 100644 --- a/vendor/tornado/platform/auto.py +++ b/vendor/tornado/platform/auto.py @@ -30,6 +30,10 @@ import os if os.name == 'nt': from tornado.platform.common import Waker from tornado.platform.windows import set_close_exec +elif 'APPENGINE_RUNTIME' in os.environ: + from tornado.platform.common import Waker + def set_close_exec(fd): + pass else: from tornado.platform.posix import set_close_exec, Waker diff --git a/vendor/tornado/platform/caresresolver.py b/vendor/tornado/platform/caresresolver.py index 7c16705d..5559614f 100644 --- a/vendor/tornado/platform/caresresolver.py +++ b/vendor/tornado/platform/caresresolver.py @@ -1,3 +1,4 @@ +from __future__ import absolute_import, division, print_function, with_statement import pycares import socket @@ -17,6 +18,9 @@ class CaresResolver(Resolver): so it is only recommended for use in ``AF_INET`` (i.e. IPv4). This is the default for ``tornado.simple_httpclient``, but other libraries may default to ``AF_UNSPEC``. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ def initialize(self, io_loop=None): self.io_loop = io_loop or IOLoop.current() diff --git a/vendor/tornado/platform/common.py b/vendor/tornado/platform/common.py index d9c4cf9f..b409a903 100644 --- a/vendor/tornado/platform/common.py +++ b/vendor/tornado/platform/common.py @@ -15,7 +15,8 @@ class Waker(interface.Waker): and Jython. """ def __init__(self): - # Based on Zope async.py: http://svn.zope.org/zc.ngi/trunk/src/zc/ngi/async.py + # Based on Zope select_trigger.py: + # https://github.com/zopefoundation/Zope/blob/master/src/ZServer/medusa/thread/select_trigger.py self.writer = socket.socket() # Disable buffering -- pulling the trigger sends 1 byte, diff --git a/vendor/tornado/platform/kqueue.py b/vendor/tornado/platform/kqueue.py index ceff0a43..f8f3e4a6 100644 --- a/vendor/tornado/platform/kqueue.py +++ b/vendor/tornado/platform/kqueue.py @@ -37,7 +37,7 @@ class _KQueue(object): def register(self, fd, events): if fd in self._active: - raise IOError("fd %d already registered" % fd) + raise IOError("fd %s already registered" % fd) self._control(fd, events, select.KQ_EV_ADD) self._active[fd] = events @@ -54,8 +54,7 @@ class _KQueue(object): if events & IOLoop.WRITE: kevents.append(select.kevent( fd, filter=select.KQ_FILTER_WRITE, flags=flags)) - if events & IOLoop.READ or not kevents: - # Always read when there is not a write + if events & IOLoop.READ: kevents.append(select.kevent( fd, filter=select.KQ_FILTER_READ, flags=flags)) # Even though control() takes a list, it seems to return EINVAL diff --git a/vendor/tornado/platform/select.py b/vendor/tornado/platform/select.py index 8bbb1f4f..1e126554 100644 --- a/vendor/tornado/platform/select.py +++ b/vendor/tornado/platform/select.py @@ -37,7 +37,7 @@ class _Select(object): def register(self, fd, events): if fd in self.read_fds or fd in self.write_fds or fd in self.error_fds: - raise IOError("fd %d already registered" % fd) + raise IOError("fd %s already registered" % fd) if events & IOLoop.READ: self.read_fds.add(fd) if events & IOLoop.WRITE: @@ -47,7 +47,7 @@ class _Select(object): # Closed connections are reported as errors by epoll and kqueue, # but as zero-byte reads by select, so when errors are requested # we need to listen for both read and error. - self.read_fds.add(fd) + #self.read_fds.add(fd) def modify(self, fd, events): self.unregister(fd) diff --git a/vendor/tornado/platform/twisted.py b/vendor/tornado/platform/twisted.py index c0ee5957..09b32836 100644 --- a/vendor/tornado/platform/twisted.py +++ b/vendor/tornado/platform/twisted.py @@ -68,9 +68,12 @@ from __future__ import absolute_import, division, print_function, with_statement import datetime import functools +import numbers import socket +import sys import twisted.internet.abstract +from twisted.internet.defer import Deferred from twisted.internet.posixbase import PosixReactorBase from twisted.internet.interfaces import \ IReactorFDSet, IDelayedCall, IReactorTime, IReadDescriptor, IWriteDescriptor @@ -83,6 +86,7 @@ import twisted.names.resolve from zope.interface import implementer +from tornado.concurrent import Future from tornado.escape import utf8 from tornado import gen import tornado.ioloop @@ -90,6 +94,7 @@ from tornado.log import app_log from tornado.netutil import Resolver from tornado.stack_context import NullContext, wrap from tornado.ioloop import IOLoop +from tornado.util import timedelta_to_seconds @implementer(IDelayedCall) @@ -139,12 +144,15 @@ class TornadoDelayedCall(object): class TornadoReactor(PosixReactorBase): """Twisted reactor built on the Tornado IOLoop. - Since it is intented to be used in applications where the top-level + Since it is intended to be used in applications where the top-level event loop is ``io_loop.start()`` rather than ``reactor.run()``, it is implemented a little differently than other Twisted reactors. We override `mainLoop` instead of `doIteration` and must implement timed call functionality on top of `IOLoop.add_timeout` rather than using the implementation in `PosixReactorBase`. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ def __init__(self, io_loop=None): if not io_loop: @@ -354,7 +362,11 @@ class _TestReactor(TornadoReactor): def install(io_loop=None): - """Install this package as the default Twisted reactor.""" + """Install this package as the default Twisted reactor. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. + """ if not io_loop: io_loop = tornado.ioloop.IOLoop.current() reactor = TornadoReactor(io_loop) @@ -365,8 +377,9 @@ def install(io_loop=None): @implementer(IReadDescriptor, IWriteDescriptor) class _FD(object): - def __init__(self, fd, handler): + def __init__(self, fd, fileobj, handler): self.fd = fd + self.fileobj = fileobj self.handler = handler self.reading = False self.writing = False @@ -377,15 +390,15 @@ class _FD(object): def doRead(self): if not self.lost: - self.handler(self.fd, tornado.ioloop.IOLoop.READ) + self.handler(self.fileobj, tornado.ioloop.IOLoop.READ) def doWrite(self): if not self.lost: - self.handler(self.fd, tornado.ioloop.IOLoop.WRITE) + self.handler(self.fileobj, tornado.ioloop.IOLoop.WRITE) def connectionLost(self, reason): if not self.lost: - self.handler(self.fd, tornado.ioloop.IOLoop.ERROR) + self.handler(self.fileobj, tornado.ioloop.IOLoop.ERROR) self.lost = True def logPrefix(self): @@ -412,14 +425,19 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): self.reactor.callWhenRunning(self.make_current) def close(self, all_fds=False): + fds = self.fds self.reactor.removeAll() for c in self.reactor.getDelayedCalls(): c.cancel() + if all_fds: + for fd in fds.values(): + self.close_fd(fd.fileobj) def add_handler(self, fd, handler, events): if fd in self.fds: - raise ValueError('fd %d added twice' % fd) - self.fds[fd] = _FD(fd, wrap(handler)) + raise ValueError('fd %s added twice' % fd) + fd, fileobj = self.split_fd(fd) + self.fds[fd] = _FD(fd, fileobj, wrap(handler)) if events & tornado.ioloop.IOLoop.READ: self.fds[fd].reading = True self.reactor.addReader(self.fds[fd]) @@ -428,6 +446,7 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): self.reactor.addWriter(self.fds[fd]) def update_handler(self, fd, events): + fd, fileobj = self.split_fd(fd) if events & tornado.ioloop.IOLoop.READ: if not self.fds[fd].reading: self.fds[fd].reading = True @@ -446,6 +465,7 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): self.reactor.removeWriter(self.fds[fd]) def remove_handler(self, fd): + fd, fileobj = self.split_fd(fd) if fd not in self.fds: return self.fds[fd].lost = True @@ -456,33 +476,34 @@ class TwistedIOLoop(tornado.ioloop.IOLoop): del self.fds[fd] def start(self): + self._setup_logging() self.reactor.run() def stop(self): self.reactor.crash() - def _run_callback(self, callback, *args, **kwargs): - try: - callback(*args, **kwargs) - except Exception: - self.handle_callback_exception(callback) - - def add_timeout(self, deadline, callback): - if isinstance(deadline, (int, long, float)): + def add_timeout(self, deadline, callback, *args, **kwargs): + # This method could be simplified (since tornado 4.0) by + # overriding call_at instead of add_timeout, but we leave it + # for now as a test of backwards-compatibility. + if isinstance(deadline, numbers.Real): delay = max(deadline - self.time(), 0) elif isinstance(deadline, datetime.timedelta): - delay = tornado.ioloop._Timeout.timedelta_to_seconds(deadline) + delay = timedelta_to_seconds(deadline) else: raise TypeError("Unsupported deadline %r") - return self.reactor.callLater(delay, self._run_callback, wrap(callback)) + return self.reactor.callLater( + delay, self._run_callback, + functools.partial(wrap(callback), *args, **kwargs)) def remove_timeout(self, timeout): if timeout.active(): timeout.cancel() def add_callback(self, callback, *args, **kwargs): - self.reactor.callFromThread(self._run_callback, - wrap(callback), *args, **kwargs) + self.reactor.callFromThread( + self._run_callback, + functools.partial(wrap(callback), *args, **kwargs)) def add_callback_from_signal(self, callback, *args, **kwargs): self.add_callback(callback, *args, **kwargs) @@ -501,6 +522,9 @@ class TwistedResolver(Resolver): ``socket.AF_UNSPEC``. Requires Twisted 12.1 or newer. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ def initialize(self, io_loop=None): self.io_loop = io_loop or IOLoop.current() @@ -527,8 +551,10 @@ class TwistedResolver(Resolver): resolved_family = socket.AF_INET6 else: deferred = self.resolver.getHostByName(utf8(host)) - resolved = yield gen.Task(deferred.addCallback) - if twisted.internet.abstract.isIPAddress(resolved): + resolved = yield gen.Task(deferred.addBoth) + if isinstance(resolved, failure.Failure): + resolved.raiseException() + elif twisted.internet.abstract.isIPAddress(resolved): resolved_family = socket.AF_INET elif twisted.internet.abstract.isIPv6Address(resolved): resolved_family = socket.AF_INET6 @@ -541,3 +567,17 @@ class TwistedResolver(Resolver): (resolved_family, (resolved, port)), ] raise gen.Return(result) + +if hasattr(gen.convert_yielded, 'register'): + @gen.convert_yielded.register(Deferred) + def _(d): + f = Future() + def errback(failure): + try: + failure.raiseException() + # Should never happen, but just in case + raise Exception("errback called without error") + except: + f.set_exc_info(sys.exc_info()) + d.addCallbacks(f.set_result, errback) + return f diff --git a/vendor/tornado/process.py b/vendor/tornado/process.py index 9bc193c0..3790ca0a 100644 --- a/vendor/tornado/process.py +++ b/vendor/tornado/process.py @@ -21,7 +21,6 @@ the server into multiple processes and managing subprocesses. from __future__ import absolute_import, division, print_function, with_statement import errno -import multiprocessing import os import signal import subprocess @@ -35,6 +34,13 @@ from tornado.iostream import PipeIOStream from tornado.log import gen_log from tornado.platform.auto import set_close_exec from tornado import stack_context +from tornado.util import errno_from_exception + +try: + import multiprocessing +except ImportError: + # Multiprocessing is not available on Google App Engine. + multiprocessing = None try: long # py2 @@ -44,6 +50,8 @@ except NameError: def cpu_count(): """Returns the number of processors on this machine.""" + if multiprocessing is None: + return 1 try: return multiprocessing.cpu_count() except NotImplementedError: @@ -92,7 +100,8 @@ def fork_processes(num_processes, max_restarts=100): between any server code. Note that multiple processes are not compatible with the autoreload - module (or the debug=True option to `tornado.web.Application`). + module (or the ``autoreload=True`` option to `tornado.web.Application` + which defaults to True when ``debug=True``). When using multiple processes, no IOLoops can be created or referenced until after the call to ``fork_processes``. @@ -135,7 +144,7 @@ def fork_processes(num_processes, max_restarts=100): try: pid, status = os.wait() except OSError as e: - if e.errno == errno.EINTR: + if errno_from_exception(e) == errno.EINTR: continue raise if pid not in children: @@ -182,6 +191,9 @@ class Subprocess(object): ``tornado.process.Subprocess.STREAM``, which will make the corresponding attribute of the resulting Subprocess a `.PipeIOStream`. * A new keyword argument ``io_loop`` may be used to pass in an IOLoop. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ STREAM = object() @@ -190,23 +202,34 @@ class Subprocess(object): def __init__(self, *args, **kwargs): self.io_loop = kwargs.pop('io_loop', None) or ioloop.IOLoop.current() + # All FDs we create should be closed on error; those in to_close + # should be closed in the parent process on success. + pipe_fds = [] to_close = [] if kwargs.get('stdin') is Subprocess.STREAM: in_r, in_w = _pipe_cloexec() kwargs['stdin'] = in_r + pipe_fds.extend((in_r, in_w)) to_close.append(in_r) self.stdin = PipeIOStream(in_w, io_loop=self.io_loop) if kwargs.get('stdout') is Subprocess.STREAM: out_r, out_w = _pipe_cloexec() kwargs['stdout'] = out_w + pipe_fds.extend((out_r, out_w)) to_close.append(out_w) self.stdout = PipeIOStream(out_r, io_loop=self.io_loop) if kwargs.get('stderr') is Subprocess.STREAM: err_r, err_w = _pipe_cloexec() kwargs['stderr'] = err_w + pipe_fds.extend((err_r, err_w)) to_close.append(err_w) self.stderr = PipeIOStream(err_r, io_loop=self.io_loop) - self.proc = subprocess.Popen(*args, **kwargs) + try: + self.proc = subprocess.Popen(*args, **kwargs) + except: + for fd in pipe_fds: + os.close(fd) + raise for fd in to_close: os.close(fd) for attr in ['stdin', 'stdout', 'stderr', 'pid']: @@ -220,7 +243,7 @@ class Subprocess(object): The callback takes one argument, the return code of the process. - This method uses a ``SIGCHILD`` handler, which is a global setting + This method uses a ``SIGCHLD`` handler, which is a global setting and may conflict if you have other libraries trying to handle the same signal. If you are using more than one ``IOLoop`` it may be necessary to call `Subprocess.initialize` first to designate @@ -237,12 +260,15 @@ class Subprocess(object): @classmethod def initialize(cls, io_loop=None): - """Initializes the ``SIGCHILD`` handler. + """Initializes the ``SIGCHLD`` handler. The signal handler is run on an `.IOLoop` to avoid locking issues. Note that the `.IOLoop` used for signal handling need not be the same one used by individual Subprocess objects (as long as the ``IOLoops`` are each running in separate threads). + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. """ if cls._initialized: return @@ -255,7 +281,7 @@ class Subprocess(object): @classmethod def uninitialize(cls): - """Removes the ``SIGCHILD`` handler.""" + """Removes the ``SIGCHLD`` handler.""" if not cls._initialized: return signal.signal(signal.SIGCHLD, cls._old_sigchld) @@ -271,7 +297,7 @@ class Subprocess(object): try: ret_pid, status = os.waitpid(pid, os.WNOHANG) except OSError as e: - if e.args[0] == errno.ECHILD: + if errno_from_exception(e) == errno.ECHILD: return if ret_pid == 0: return diff --git a/vendor/tornado/simple_httpclient.py b/vendor/tornado/simple_httpclient.py index d8dbb271..31d076e2 100644 --- a/vendor/tornado/simple_httpclient.py +++ b/vendor/tornado/simple_httpclient.py @@ -1,36 +1,49 @@ #!/usr/bin/env python from __future__ import absolute_import, division, print_function, with_statement -from tornado.escape import utf8, _unicode, native_str +from tornado.concurrent import is_future +from tornado.escape import utf8, _unicode from tornado.httpclient import HTTPResponse, HTTPError, AsyncHTTPClient, main, _RequestProxy -from tornado.httputil import HTTPHeaders -from tornado.iostream import IOStream, SSLIOStream +from tornado import httputil +from tornado.http1connection import HTTP1Connection, HTTP1ConnectionParameters +from tornado.iostream import StreamClosedError from tornado.netutil import Resolver, OverrideResolver from tornado.log import gen_log from tornado import stack_context -from tornado.util import GzipDecompressor +from tornado.tcpclient import TCPClient import base64 import collections import copy import functools -import os.path import re import socket -import ssl import sys +from io import BytesIO -try: - from io import BytesIO # python 3 -except ImportError: - from cStringIO import StringIO as BytesIO # python 2 try: import urlparse # py2 except ImportError: import urllib.parse as urlparse # py3 -_DEFAULT_CA_CERTS = os.path.dirname(__file__) + '/ca-certificates.crt' +try: + import ssl +except ImportError: + # ssl is not available on Google App Engine. + ssl = None + +try: + import certifi +except ImportError: + certifi = None + + +def _default_ca_certs(): + if certifi is None: + raise Exception("The 'certifi' package is required to use https " + "in simple_httpclient") + return certifi.where() class SimpleAsyncHTTPClient(AsyncHTTPClient): @@ -47,7 +60,7 @@ class SimpleAsyncHTTPClient(AsyncHTTPClient): """ def initialize(self, io_loop, max_clients=10, hostname_mapping=None, max_buffer_size=104857600, - resolver=None, defaults=None): + resolver=None, defaults=None, max_header_size=None): """Creates a AsyncHTTPClient. Only a single AsyncHTTPClient instance exists per IOLoop @@ -72,7 +85,11 @@ class SimpleAsyncHTTPClient(AsyncHTTPClient): self.max_clients = max_clients self.queue = collections.deque() self.active = {} + self.waiting = {} self.max_buffer_size = max_buffer_size + self.max_header_size = max_header_size + # TCPClient could create a Resolver for us, but we have to do it + # ourselves to support hostname_mapping. if resolver: self.resolver = resolver self.own_resolver = False @@ -82,14 +99,25 @@ class SimpleAsyncHTTPClient(AsyncHTTPClient): if hostname_mapping is not None: self.resolver = OverrideResolver(resolver=self.resolver, mapping=hostname_mapping) + self.tcp_client = TCPClient(resolver=self.resolver, io_loop=io_loop) def close(self): super(SimpleAsyncHTTPClient, self).close() if self.own_resolver: self.resolver.close() + self.tcp_client.close() def fetch_impl(self, request, callback): - self.queue.append((request, callback)) + key = object() + self.queue.append((key, request, callback)) + if not len(self.active) < self.max_clients: + timeout_handle = self.io_loop.add_timeout( + self.io_loop.time() + min(request.connect_timeout, + request.request_timeout), + functools.partial(self._on_timeout, key)) + else: + timeout_handle = None + self.waiting[key] = (request, callback, timeout_handle) self._process_queue() if self.queue: gen_log.debug("max_clients limit reached, request queued. " @@ -99,26 +127,46 @@ class SimpleAsyncHTTPClient(AsyncHTTPClient): def _process_queue(self): with stack_context.NullContext(): while self.queue and len(self.active) < self.max_clients: - request, callback = self.queue.popleft() - key = object() + key, request, callback = self.queue.popleft() + if key not in self.waiting: + continue + self._remove_timeout(key) self.active[key] = (request, callback) release_callback = functools.partial(self._release_fetch, key) self._handle_request(request, release_callback, callback) def _handle_request(self, request, release_callback, final_callback): _HTTPConnection(self.io_loop, self, request, release_callback, - final_callback, self.max_buffer_size, self.resolver) + final_callback, self.max_buffer_size, self.tcp_client, + self.max_header_size) def _release_fetch(self, key): del self.active[key] self._process_queue() + def _remove_timeout(self, key): + if key in self.waiting: + request, callback, timeout_handle = self.waiting[key] + if timeout_handle is not None: + self.io_loop.remove_timeout(timeout_handle) + del self.waiting[key] -class _HTTPConnection(object): + def _on_timeout(self, key): + request, callback, timeout_handle = self.waiting[key] + self.queue.remove((key, request, callback)) + timeout_response = HTTPResponse( + request, 599, error=HTTPError(599, "Timeout"), + request_time=self.io_loop.time() - request.start_time) + self.io_loop.add_callback(callback, timeout_response) + del self.waiting[key] + + +class _HTTPConnection(httputil.HTTPMessageDelegate): _SUPPORTED_METHODS = set(["GET", "HEAD", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"]) def __init__(self, io_loop, client, request, release_callback, - final_callback, max_buffer_size, resolver): + final_callback, max_buffer_size, tcp_client, + max_header_size): self.start_time = io_loop.time() self.io_loop = io_loop self.client = client @@ -126,13 +174,15 @@ class _HTTPConnection(object): self.release_callback = release_callback self.final_callback = final_callback self.max_buffer_size = max_buffer_size - self.resolver = resolver + self.tcp_client = tcp_client + self.max_header_size = max_header_size self.code = None self.headers = None - self.chunks = None + self.chunks = [] self._decompressor = None # Timeout handle returned by IOLoop.add_timeout self._timeout = None + self._sockaddr = None with stack_context.ExceptionStackContext(self._handle_exception): self.parsed = urlparse.urlsplit(_unicode(self.request.url)) if self.parsed.scheme not in ("http", "https"): @@ -143,51 +193,40 @@ class _HTTPConnection(object): netloc = self.parsed.netloc if "@" in netloc: userpass, _, netloc = netloc.rpartition("@") - match = re.match(r'^(.+):(\d+)$', netloc) - if match: - host = match.group(1) - port = int(match.group(2)) - else: - host = netloc + host, port = httputil.split_host_and_port(netloc) + if port is None: port = 443 if self.parsed.scheme == "https" else 80 if re.match(r'^\[.*\]$', host): # raw ipv6 addresses in urls are enclosed in brackets host = host[1:-1] self.parsed_hostname = host # save final host for _on_connect - if request.allow_ipv6: - af = socket.AF_UNSPEC - else: - # We only try the first IP we get from getaddrinfo, - # so restrict to ipv4 by default. + if request.allow_ipv6 is False: af = socket.AF_INET + else: + af = socket.AF_UNSPEC - self.resolver.resolve(host, port, af, callback=self._on_resolve) + ssl_options = self._get_ssl_options(self.parsed.scheme) - def _on_resolve(self, addrinfo): - self.stream = self._create_stream(addrinfo) - timeout = min(self.request.connect_timeout, self.request.request_timeout) - if timeout: - self._timeout = self.io_loop.add_timeout( - self.start_time + timeout, - stack_context.wrap(self._on_timeout)) - self.stream.set_close_callback(self._on_close) - # ipv6 addresses are broken (in self.parsed.hostname) until - # 2.7, here is correctly parsed value calculated in __init__ - sockaddr = addrinfo[0][1] - self.stream.connect(sockaddr, self._on_connect, - server_hostname=self.parsed_hostname) + timeout = min(self.request.connect_timeout, self.request.request_timeout) + if timeout: + self._timeout = self.io_loop.add_timeout( + self.start_time + timeout, + stack_context.wrap(self._on_timeout)) + self.tcp_client.connect(host, port, af=af, + ssl_options=ssl_options, + max_buffer_size=self.max_buffer_size, + callback=self._on_connect) - def _create_stream(self, addrinfo): - af = addrinfo[0][0] - if self.parsed.scheme == "https": + def _get_ssl_options(self, scheme): + if scheme == "https": ssl_options = {} if self.request.validate_cert: ssl_options["cert_reqs"] = ssl.CERT_REQUIRED if self.request.ca_certs is not None: ssl_options["ca_certs"] = self.request.ca_certs else: - ssl_options["ca_certs"] = _DEFAULT_CA_CERTS + ssl_options["ca_certs"] = _default_ca_certs() if self.request.client_key is not None: ssl_options["keyfile"] = self.request.client_key if self.request.client_cert is not None: @@ -199,27 +238,22 @@ class _HTTPConnection(object): # the SSL_OP_NO_SSLv2, but that wasn't exposed to python # until 3.2. Python 2.7 adds the ciphers argument, which # can also be used to disable SSLv2. As a last resort - # on python 2.6, we set ssl_version to SSLv3. This is + # on python 2.6, we set ssl_version to TLSv1. This is # more narrow than we'd like since it also breaks - # compatibility with servers configured for TLSv1 only, - # but nearly all servers support SSLv3: + # compatibility with servers configured for SSLv3 only, + # but nearly all servers support both SSLv3 and TLSv1: # http://blog.ivanristic.com/2011/09/ssl-survey-protocol-support.html if sys.version_info >= (2, 7): - ssl_options["ciphers"] = "DEFAULT:!SSLv2" + # In addition to disabling SSLv2, we also exclude certain + # classes of insecure ciphers. + ssl_options["ciphers"] = "DEFAULT:!SSLv2:!EXPORT:!DES" else: # This is really only necessary for pre-1.0 versions # of openssl, but python 2.6 doesn't expose version # information. - ssl_options["ssl_version"] = ssl.PROTOCOL_SSLv3 - - return SSLIOStream(socket.socket(af), - io_loop=self.io_loop, - ssl_options=ssl_options, - max_buffer_size=self.max_buffer_size) - else: - return IOStream(socket.socket(af), - io_loop=self.io_loop, - max_buffer_size=self.max_buffer_size) + ssl_options["ssl_version"] = ssl.PROTOCOL_TLSv1 + return ssl_options + return None def _on_timeout(self): self._timeout = None @@ -231,8 +265,16 @@ class _HTTPConnection(object): self.io_loop.remove_timeout(self._timeout) self._timeout = None - def _on_connect(self): + def _on_connect(self, stream): + if self.final_callback is None: + # final_callback is cleared if we've hit our timeout. + stream.close() + return + self.stream = stream + self.stream.set_close_callback(self.on_connection_close) self._remove_timeout() + if self.final_callback is None: + return if self.request.request_timeout: self._timeout = self.io_loop.add_timeout( self.start_time + self.request.request_timeout, @@ -268,33 +310,72 @@ class _HTTPConnection(object): if self.request.user_agent: self.request.headers["User-Agent"] = self.request.user_agent if not self.request.allow_nonstandard_methods: - if self.request.method in ("POST", "PATCH", "PUT"): - assert self.request.body is not None - else: - assert self.request.body is None + # Some HTTP methods nearly always have bodies while others + # almost never do. Fail in this case unless the user has + # opted out of sanity checks with allow_nonstandard_methods. + body_expected = self.request.method in ("POST", "PATCH", "PUT") + body_present = (self.request.body is not None or + self.request.body_producer is not None) + if ((body_expected and not body_present) or + (body_present and not body_expected)): + raise ValueError( + 'Body must %sbe None for method %s (unelss ' + 'allow_nonstandard_methods is true)' % + ('not ' if body_expected else '', self.request.method)) + if self.request.expect_100_continue: + self.request.headers["Expect"] = "100-continue" if self.request.body is not None: + # When body_producer is used the caller is responsible for + # setting Content-Length (or else chunked encoding will be used). self.request.headers["Content-Length"] = str(len( self.request.body)) if (self.request.method == "POST" and "Content-Type" not in self.request.headers): self.request.headers["Content-Type"] = "application/x-www-form-urlencoded" - if self.request.use_gzip: + if self.request.decompress_response: self.request.headers["Accept-Encoding"] = "gzip" req_path = ((self.parsed.path or '/') + - (('?' + self.parsed.query) if self.parsed.query else '')) - request_lines = [utf8("%s %s HTTP/1.1" % (self.request.method, - req_path))] - for k, v in self.request.headers.get_all(): - line = utf8(k) + b": " + utf8(v) - if b'\n' in line: - raise ValueError('Newline in header: ' + repr(line)) - request_lines.append(line) - request_str = b"\r\n".join(request_lines) + b"\r\n\r\n" - if self.request.body is not None: - request_str += self.request.body + (('?' + self.parsed.query) if self.parsed.query else '')) self.stream.set_nodelay(True) - self.stream.write(request_str) - self.stream.read_until_regex(b"\r?\n\r?\n", self._on_headers) + self.connection = HTTP1Connection( + self.stream, True, + HTTP1ConnectionParameters( + no_keep_alive=True, + max_header_size=self.max_header_size, + decompress=self.request.decompress_response), + self._sockaddr) + start_line = httputil.RequestStartLine(self.request.method, + req_path, '') + self.connection.write_headers(start_line, self.request.headers) + if self.request.expect_100_continue: + self._read_response() + else: + self._write_body(True) + + def _write_body(self, start_read): + if self.request.body is not None: + self.connection.write(self.request.body) + self.connection.finish() + elif self.request.body_producer is not None: + fut = self.request.body_producer(self.connection.write) + if is_future(fut): + def on_body_written(fut): + fut.result() + self.connection.finish() + if start_read: + self._read_response() + self.io_loop.add_future(fut, on_body_written) + return + self.connection.finish() + if start_read: + self._read_response() + + def _read_response(self): + # Ensure that any exception raised in read_response ends up in our + # stack context. + self.io_loop.add_future( + self.connection.read_response(self), + lambda f: f.result()) def _release(self): if self.release_callback is not None: @@ -312,92 +393,52 @@ class _HTTPConnection(object): def _handle_exception(self, typ, value, tb): if self.final_callback: self._remove_timeout() + if isinstance(value, StreamClosedError): + value = HTTPError(599, "Stream closed") self._run_callback(HTTPResponse(self.request, 599, error=value, request_time=self.io_loop.time() - self.start_time, )) if hasattr(self, "stream"): + # TODO: this may cause a StreamClosedError to be raised + # by the connection's Future. Should we cancel the + # connection more gracefully? self.stream.close() return True else: # If our callback has already been called, we are probably # catching an exception that is not caused by us but rather # some child of our callback. Rather than drop it on the floor, - # pass it along. - return False + # pass it along, unless it's just the stream being closed. + return isinstance(value, StreamClosedError) - def _on_close(self): + def on_connection_close(self): if self.final_callback is not None: message = "Connection closed" if self.stream.error: - message = str(self.stream.error) - raise HTTPError(599, message) + raise self.stream.error + try: + raise HTTPError(599, message) + except HTTPError: + self._handle_exception(*sys.exc_info()) - def _handle_1xx(self, code): - self.stream.read_until_regex(b"\r?\n\r?\n", self._on_headers) - - def _on_headers(self, data): - data = native_str(data.decode("latin1")) - first_line, _, header_data = data.partition("\n") - match = re.match("HTTP/1.[01] ([0-9]+) ([^\r]*)", first_line) - assert match - code = int(match.group(1)) - self.headers = HTTPHeaders.parse(header_data) - if 100 <= code < 200: - self._handle_1xx(code) + def headers_received(self, first_line, headers): + if self.request.expect_100_continue and first_line.code == 100: + self._write_body(False) return - else: - self.code = code - self.reason = match.group(2) - - if "Content-Length" in self.headers: - if "," in self.headers["Content-Length"]: - # Proxies sometimes cause Content-Length headers to get - # duplicated. If all the values are identical then we can - # use them but if they differ it's an error. - pieces = re.split(r',\s*', self.headers["Content-Length"]) - if any(i != pieces[0] for i in pieces): - raise ValueError("Multiple unequal Content-Lengths: %r" % - self.headers["Content-Length"]) - self.headers["Content-Length"] = pieces[0] - content_length = int(self.headers["Content-Length"]) - else: - content_length = None + self.headers = headers + self.code = first_line.code + self.reason = first_line.reason if self.request.header_callback is not None: - # re-attach the newline we split on earlier - self.request.header_callback(first_line + _) + # Reassemble the start line. + self.request.header_callback('%s %s %s\r\n' % first_line) for k, v in self.headers.get_all(): self.request.header_callback("%s: %s\r\n" % (k, v)) self.request.header_callback('\r\n') - if self.request.method == "HEAD" or self.code == 304: - # HEAD requests and 304 responses never have content, even - # though they may have content-length headers - self._on_body(b"") - return - if 100 <= self.code < 200 or self.code == 204: - # These response codes never have bodies - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 - if ("Transfer-Encoding" in self.headers or - content_length not in (None, 0)): - raise ValueError("Response with code %d should not have body" % - self.code) - self._on_body(b"") - return - - if (self.request.use_gzip and - self.headers.get("Content-Encoding") == "gzip"): - self._decompressor = GzipDecompressor() - if self.headers.get("Transfer-Encoding") == "chunked": - self.chunks = [] - self.stream.read_until(b"\r\n", self._on_chunk_length) - elif content_length is not None: - self.stream.read_bytes(content_length, self._on_body) - else: - self.stream.read_until_close(self._on_body) - - def _on_body(self, data): + def finish(self): + data = b''.join(self.chunks) self._remove_timeout() original_request = getattr(self.request, "original_request", self.request) @@ -433,19 +474,12 @@ class _HTTPConnection(object): self.client.fetch(new_request, final_callback) self._on_end_request() return - if self._decompressor: - data = (self._decompressor.decompress(data) + - self._decompressor.flush()) if self.request.streaming_callback: - if self.chunks is None: - # if chunks is not None, we already called streaming_callback - # in _on_chunk_data - self.request.streaming_callback(data) buffer = BytesIO() else: buffer = BytesIO(data) # TODO: don't require one big string? response = HTTPResponse(original_request, - self.code, reason=self.reason, + self.code, reason=getattr(self, 'reason', None), headers=self.headers, request_time=self.io_loop.time() - self.start_time, buffer=buffer, @@ -456,40 +490,11 @@ class _HTTPConnection(object): def _on_end_request(self): self.stream.close() - def _on_chunk_length(self, data): - # TODO: "chunk extensions" http://tools.ietf.org/html/rfc2616#section-3.6.1 - length = int(data.strip(), 16) - if length == 0: - if self._decompressor is not None: - tail = self._decompressor.flush() - if tail: - # I believe the tail will always be empty (i.e. - # decompress will return all it can). The purpose - # of the flush call is to detect errors such - # as truncated input. But in case it ever returns - # anything, treat it as an extra chunk - if self.request.streaming_callback is not None: - self.request.streaming_callback(tail) - else: - self.chunks.append(tail) - # all the data has been decompressed, so we don't need to - # decompress again in _on_body - self._decompressor = None - self._on_body(b''.join(self.chunks)) - else: - self.stream.read_bytes(length + 2, # chunk ends with \r\n - self._on_chunk_data) - - def _on_chunk_data(self, data): - assert data[-2:] == b"\r\n" - chunk = data[:-2] - if self._decompressor: - chunk = self._decompressor.decompress(chunk) + def data_received(self, chunk): if self.request.streaming_callback is not None: self.request.streaming_callback(chunk) else: self.chunks.append(chunk) - self.stream.read_until(b"\r\n", self._on_chunk_length) if __name__ == "__main__": diff --git a/vendor/tornado/speedups.c b/vendor/tornado/speedups.c new file mode 100644 index 00000000..174a6129 --- /dev/null +++ b/vendor/tornado/speedups.c @@ -0,0 +1,52 @@ +#define PY_SSIZE_T_CLEAN +#include + +static PyObject* websocket_mask(PyObject* self, PyObject* args) { + const char* mask; + Py_ssize_t mask_len; + const char* data; + Py_ssize_t data_len; + Py_ssize_t i; + PyObject* result; + char* buf; + + if (!PyArg_ParseTuple(args, "s#s#", &mask, &mask_len, &data, &data_len)) { + return NULL; + } + + result = PyBytes_FromStringAndSize(NULL, data_len); + if (!result) { + return NULL; + } + buf = PyBytes_AsString(result); + for (i = 0; i < data_len; i++) { + buf[i] = data[i] ^ mask[i % 4]; + } + + return result; +} + +static PyMethodDef methods[] = { + {"websocket_mask", websocket_mask, METH_VARARGS, ""}, + {NULL, NULL, 0, NULL} +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef speedupsmodule = { + PyModuleDef_HEAD_INIT, + "speedups", + NULL, + -1, + methods +}; + +PyMODINIT_FUNC +PyInit_speedups() { + return PyModule_Create(&speedupsmodule); +} +#else // Python 2.x +PyMODINIT_FUNC +initspeedups() { + Py_InitModule("tornado.speedups", methods); +} +#endif diff --git a/vendor/tornado/stack_context.py b/vendor/tornado/stack_context.py index b1e82b0e..2c0d9ee7 100644 --- a/vendor/tornado/stack_context.py +++ b/vendor/tornado/stack_context.py @@ -41,13 +41,13 @@ Example usage:: sys.exit(1) with StackContext(die_on_error): - # Any exception thrown here *or in callback and its desendents* + # Any exception thrown here *or in callback and its descendants* # will cause the process to exit instead of spinning endlessly # in the ioloop. http_client.fetch(url, callback) ioloop.start() -Most applications shouln't have to work with `StackContext` directly. +Most applications shouldn't have to work with `StackContext` directly. Here are a few rules of thumb for when it's necessary: * If you're writing an asynchronous library that doesn't rely on a @@ -266,6 +266,18 @@ def wrap(fn): # TODO: Any other better way to store contexts and update them in wrapped function? cap_contexts = [_state.contexts] + if not cap_contexts[0][0] and not cap_contexts[0][1]: + # Fast path when there are no active contexts. + def null_wrapper(*args, **kwargs): + try: + current_state = _state.contexts + _state.contexts = cap_contexts[0] + return fn(*args, **kwargs) + finally: + _state.contexts = current_state + null_wrapper._wrapped = True + return null_wrapper + def wrapped(*args, **kwargs): ret = None try: diff --git a/vendor/tornado/tcpclient.py b/vendor/tornado/tcpclient.py new file mode 100644 index 00000000..f594d91b --- /dev/null +++ b/vendor/tornado/tcpclient.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python +# +# Copyright 2014 Facebook +# +# 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. + +"""A non-blocking TCP connection factory. +""" +from __future__ import absolute_import, division, print_function, with_statement + +import functools +import socket + +from tornado.concurrent import Future +from tornado.ioloop import IOLoop +from tornado.iostream import IOStream +from tornado import gen +from tornado.netutil import Resolver + +_INITIAL_CONNECT_TIMEOUT = 0.3 + + +class _Connector(object): + """A stateless implementation of the "Happy Eyeballs" algorithm. + + "Happy Eyeballs" is documented in RFC6555 as the recommended practice + for when both IPv4 and IPv6 addresses are available. + + In this implementation, we partition the addresses by family, and + make the first connection attempt to whichever address was + returned first by ``getaddrinfo``. If that connection fails or + times out, we begin a connection in parallel to the first address + of the other family. If there are additional failures we retry + with other addresses, keeping one connection attempt per family + in flight at a time. + + http://tools.ietf.org/html/rfc6555 + + """ + def __init__(self, addrinfo, io_loop, connect): + self.io_loop = io_loop + self.connect = connect + + self.future = Future() + self.timeout = None + self.last_error = None + self.remaining = len(addrinfo) + self.primary_addrs, self.secondary_addrs = self.split(addrinfo) + + @staticmethod + def split(addrinfo): + """Partition the ``addrinfo`` list by address family. + + Returns two lists. The first list contains the first entry from + ``addrinfo`` and all others with the same family, and the + second list contains all other addresses (normally one list will + be AF_INET and the other AF_INET6, although non-standard resolvers + may return additional families). + """ + primary = [] + secondary = [] + primary_af = addrinfo[0][0] + for af, addr in addrinfo: + if af == primary_af: + primary.append((af, addr)) + else: + secondary.append((af, addr)) + return primary, secondary + + def start(self, timeout=_INITIAL_CONNECT_TIMEOUT): + self.try_connect(iter(self.primary_addrs)) + self.set_timout(timeout) + return self.future + + def try_connect(self, addrs): + try: + af, addr = next(addrs) + except StopIteration: + # We've reached the end of our queue, but the other queue + # might still be working. Send a final error on the future + # only when both queues are finished. + if self.remaining == 0 and not self.future.done(): + self.future.set_exception(self.last_error or + IOError("connection failed")) + return + future = self.connect(af, addr) + future.add_done_callback(functools.partial(self.on_connect_done, + addrs, af, addr)) + + def on_connect_done(self, addrs, af, addr, future): + self.remaining -= 1 + try: + stream = future.result() + except Exception as e: + if self.future.done(): + return + # Error: try again (but remember what happened so we have an + # error to raise in the end) + self.last_error = e + self.try_connect(addrs) + if self.timeout is not None: + # If the first attempt failed, don't wait for the + # timeout to try an address from the secondary queue. + self.io_loop.remove_timeout(self.timeout) + self.on_timeout() + return + self.clear_timeout() + if self.future.done(): + # This is a late arrival; just drop it. + stream.close() + else: + self.future.set_result((af, addr, stream)) + + def set_timout(self, timeout): + self.timeout = self.io_loop.add_timeout(self.io_loop.time() + timeout, + self.on_timeout) + + def on_timeout(self): + self.timeout = None + self.try_connect(iter(self.secondary_addrs)) + + def clear_timeout(self): + if self.timeout is not None: + self.io_loop.remove_timeout(self.timeout) + + +class TCPClient(object): + """A non-blocking TCP connection factory. + + .. versionchanged:: 4.1 + The ``io_loop`` argument is deprecated. + """ + def __init__(self, resolver=None, io_loop=None): + self.io_loop = io_loop or IOLoop.current() + if resolver is not None: + self.resolver = resolver + self._own_resolver = False + else: + self.resolver = Resolver(io_loop=io_loop) + self._own_resolver = True + + def close(self): + if self._own_resolver: + self.resolver.close() + + @gen.coroutine + def connect(self, host, port, af=socket.AF_UNSPEC, ssl_options=None, + max_buffer_size=None): + """Connect to the given host and port. + + Asynchronously returns an `.IOStream` (or `.SSLIOStream` if + ``ssl_options`` is not None). + """ + addrinfo = yield self.resolver.resolve(host, port, af) + connector = _Connector( + addrinfo, self.io_loop, + functools.partial(self._create_stream, max_buffer_size)) + af, addr, stream = yield connector.start() + # TODO: For better performance we could cache the (af, addr) + # information here and re-use it on subsequent connections to + # the same host. (http://tools.ietf.org/html/rfc6555#section-4.2) + if ssl_options is not None: + stream = yield stream.start_tls(False, ssl_options=ssl_options, + server_hostname=host) + raise gen.Return(stream) + + def _create_stream(self, max_buffer_size, af, addr): + # Always connect in plaintext; we'll convert to ssl if necessary + # after one connection has completed. + stream = IOStream(socket.socket(af), + io_loop=self.io_loop, + max_buffer_size=max_buffer_size) + return stream.connect(addr) diff --git a/vendor/tornado/tcpserver.py b/vendor/tornado/tcpserver.py index 8473a21a..a02b36ff 100644 --- a/vendor/tornado/tcpserver.py +++ b/vendor/tornado/tcpserver.py @@ -20,13 +20,19 @@ from __future__ import absolute_import, division, print_function, with_statement import errno import os import socket -import ssl from tornado.log import app_log from tornado.ioloop import IOLoop from tornado.iostream import IOStream, SSLIOStream from tornado.netutil import bind_sockets, add_accept_handler, ssl_wrap_socket from tornado import process +from tornado.util import errno_from_exception + +try: + import ssl +except ImportError: + # ssl is not available on Google App Engine. + ssl = None class TCPServer(object): @@ -81,13 +87,15 @@ class TCPServer(object): .. versionadded:: 3.1 The ``max_buffer_size`` argument. """ - def __init__(self, io_loop=None, ssl_options=None, max_buffer_size=None): + def __init__(self, io_loop=None, ssl_options=None, max_buffer_size=None, + read_chunk_size=None): self.io_loop = io_loop self.ssl_options = ssl_options self._sockets = {} # fd -> socket object self._pending_sockets = [] self._started = False self.max_buffer_size = max_buffer_size + self.read_chunk_size = read_chunk_size # Verify the SSL options. Otherwise we don't get errors until clients # connect. This doesn't verify that the keys are legitimate, but @@ -180,7 +188,8 @@ class TCPServer(object): between any server code. Note that multiple processes are not compatible with the autoreload - module (or the ``debug=True`` option to `tornado.web.Application`). + module (or the ``autoreload=True`` option to `tornado.web.Application` + which defaults to True when ``debug=True``). When using multiple processes, no IOLoops can be created or referenced until after the call to ``TCPServer.start(n)``. """ @@ -229,16 +238,20 @@ class TCPServer(object): # catch another error later on (AttributeError in # SSLIOStream._do_ssl_handshake). # To test this behavior, try nmap with the -sT flag. - # https://github.com/facebook/tornado/pull/750 - if err.args[0] in (errno.ECONNABORTED, errno.EINVAL): + # https://github.com/tornadoweb/tornado/pull/750 + if errno_from_exception(err) in (errno.ECONNABORTED, errno.EINVAL): return connection.close() else: raise try: if self.ssl_options is not None: - stream = SSLIOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size) + stream = SSLIOStream(connection, io_loop=self.io_loop, + max_buffer_size=self.max_buffer_size, + read_chunk_size=self.read_chunk_size) else: - stream = IOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size) + stream = IOStream(connection, io_loop=self.io_loop, + max_buffer_size=self.max_buffer_size, + read_chunk_size=self.read_chunk_size) self.handle_stream(stream, address) except Exception: app_log.error("Error in connection callback", exc_info=True) diff --git a/vendor/tornado/template.py b/vendor/tornado/template.py index 341e07c6..3882ed02 100644 --- a/vendor/tornado/template.py +++ b/vendor/tornado/template.py @@ -21,7 +21,7 @@ Basic usage looks like:: t = template.Template("{{ myvalue }}") print t.generate(myvalue="XXX") -Loader is a class that loads templates from a root directory and caches +`Loader` is a class that loads templates from a root directory and caches the compiled templates:: loader = template.Loader("/home/btaylor") @@ -56,16 +56,17 @@ interesting. Syntax for the templates:: {% end %} Unlike most other template systems, we do not put any restrictions on the -expressions you can include in your statements. if and for blocks get -translated exactly into Python, you can do complex expressions like:: +expressions you can include in your statements. ``if`` and ``for`` blocks get +translated exactly into Python, so you can do complex expressions like:: {% for student in [p for p in people if p.student and p.age > 23] %}

  • {{ escape(student.name) }}
  • {% end %} Translating directly to Python means you can apply functions to expressions -easily, like the escape() function in the examples above. You can pass -functions in to your template just like any other variable:: +easily, like the ``escape()`` function in the examples above. You can pass +functions in to your template just like any other variable +(In a `.RequestHandler`, override `.RequestHandler.get_template_namespace`):: ### Python code def add(x, y): @@ -75,8 +76,8 @@ functions in to your template just like any other variable:: ### The template {{ add(1, 2) }} -We provide the functions escape(), url_escape(), json_encode(), and squeeze() -to all templates by default. +We provide the functions `escape() <.xhtml_escape>`, `.url_escape()`, +`.json_encode()`, and `.squeeze()` to all templates by default. Typical applications do not create `Template` or `Loader` instances by hand, but instead use the `~.RequestHandler.render` and @@ -169,13 +170,17 @@ with ``{# ... #}``. {% module Template("foo.html", arg=42) %} + ``UIModules`` are a feature of the `tornado.web.RequestHandler` + class (and specifically its ``render`` method) and will not work + when the template system is used on its own in other contexts. + ``{% raw *expr* %}`` Outputs the result of the given expression without autoescaping. ``{% set *x* = *y* %}`` Sets a local variable. -``{% try %}...{% except %}...{% finally %}...{% else %}...{% end %}`` +``{% try %}...{% except %}...{% else %}...{% finally %}...{% end %}`` Same as the python ``try`` statement. ``{% while *condition* %}... {% end %}`` @@ -194,7 +199,7 @@ import threading from tornado import escape from tornado.log import app_log -from tornado.util import bytes_type, ObjectDict, exec_in, unicode_type +from tornado.util import ObjectDict, exec_in, unicode_type try: from cStringIO import StringIO # py2 @@ -256,7 +261,7 @@ class Template(object): "linkify": escape.linkify, "datetime": datetime, "_tt_utf8": escape.utf8, # for internal use - "_tt_string_types": (unicode_type, bytes_type), + "_tt_string_types": (unicode_type, bytes), # __name__ and __loader__ allow the traceback mechanism to find # the generated source code. "__name__": self.name.replace('.', '_'), @@ -362,10 +367,9 @@ class Loader(BaseLoader): def _create_template(self, name): path = os.path.join(self.root, name) - f = open(path, "rb") - template = Template(f.read(), name=name, loader=self) - f.close() - return template + with open(path, "rb") as f: + template = Template(f.read(), name=name, loader=self) + return template class DictLoader(BaseLoader): @@ -780,7 +784,7 @@ def _parse(reader, template, in_block=None, in_loop=None): if allowed_parents is not None: if not in_block: raise ParseError("%s outside %s block" % - (operator, allowed_parents)) + (operator, allowed_parents)) if in_block not in allowed_parents: raise ParseError("%s block cannot be attached to %s block" % (operator, in_block)) body.chunks.append(_IntermediateControlBlock(contents, line)) diff --git a/vendor/tornado/test/README b/vendor/tornado/test/README deleted file mode 100644 index 2d6195d8..00000000 --- a/vendor/tornado/test/README +++ /dev/null @@ -1,4 +0,0 @@ -Test coverage is almost non-existent, but it's a start. Be sure to -set PYTHONPATH apprioriately (generally to the root directory of your -tornado checkout) when running tests to make sure you're getting the -version of the tornado package that you expect. \ No newline at end of file diff --git a/vendor/tornado/test/auth_test.py b/vendor/tornado/test/auth_test.py deleted file mode 100644 index 1d6cb839..00000000 --- a/vendor/tornado/test/auth_test.py +++ /dev/null @@ -1,424 +0,0 @@ -# These tests do not currently do much to verify the correct implementation -# of the openid/oauth protocols, they just exercise the major code paths -# and ensure that it doesn't blow up (e.g. with unicode/bytes issues in -# python 3) - - -from __future__ import absolute_import, division, print_function, with_statement -from tornado.auth import OpenIdMixin, OAuthMixin, OAuth2Mixin, TwitterMixin, GoogleMixin, AuthError -from tornado.concurrent import Future -from tornado.escape import json_decode -from tornado import gen -from tornado.log import gen_log -from tornado.testing import AsyncHTTPTestCase, ExpectLog -from tornado.util import u -from tornado.web import RequestHandler, Application, asynchronous, HTTPError - - -class OpenIdClientLoginHandler(RequestHandler, OpenIdMixin): - def initialize(self, test): - self._OPENID_ENDPOINT = test.get_url('/openid/server/authenticate') - - @asynchronous - def get(self): - if self.get_argument('openid.mode', None): - self.get_authenticated_user( - self.on_user, http_client=self.settings['http_client']) - return - res = self.authenticate_redirect() - assert isinstance(res, Future) - assert res.done() - - def on_user(self, user): - if user is None: - raise Exception("user is None") - self.finish(user) - - -class OpenIdServerAuthenticateHandler(RequestHandler): - def post(self): - if self.get_argument('openid.mode') != 'check_authentication': - raise Exception("incorrect openid.mode %r") - self.write('is_valid:true') - - -class OAuth1ClientLoginHandler(RequestHandler, OAuthMixin): - def initialize(self, test, version): - self._OAUTH_VERSION = version - self._OAUTH_REQUEST_TOKEN_URL = test.get_url('/oauth1/server/request_token') - self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth1/server/authorize') - self._OAUTH_ACCESS_TOKEN_URL = test.get_url('/oauth1/server/access_token') - - def _oauth_consumer_token(self): - return dict(key='asdf', secret='qwer') - - @asynchronous - def get(self): - if self.get_argument('oauth_token', None): - self.get_authenticated_user( - self.on_user, http_client=self.settings['http_client']) - return - res = self.authorize_redirect(http_client=self.settings['http_client']) - assert isinstance(res, Future) - - def on_user(self, user): - if user is None: - raise Exception("user is None") - self.finish(user) - - def _oauth_get_user(self, access_token, callback): - if access_token != dict(key='uiop', secret='5678'): - raise Exception("incorrect access token %r" % access_token) - callback(dict(email='foo@example.com')) - - -class OAuth1ClientRequestParametersHandler(RequestHandler, OAuthMixin): - def initialize(self, version): - self._OAUTH_VERSION = version - - def _oauth_consumer_token(self): - return dict(key='asdf', secret='qwer') - - def get(self): - params = self._oauth_request_parameters( - 'http://www.example.com/api/asdf', - dict(key='uiop', secret='5678'), - parameters=dict(foo='bar')) - self.write(params) - - -class OAuth1ServerRequestTokenHandler(RequestHandler): - def get(self): - self.write('oauth_token=zxcv&oauth_token_secret=1234') - - -class OAuth1ServerAccessTokenHandler(RequestHandler): - def get(self): - self.write('oauth_token=uiop&oauth_token_secret=5678') - - -class OAuth2ClientLoginHandler(RequestHandler, OAuth2Mixin): - def initialize(self, test): - self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth2/server/authorize') - - def get(self): - res = self.authorize_redirect() - assert isinstance(res, Future) - assert res.done() - - -class TwitterClientHandler(RequestHandler, TwitterMixin): - def initialize(self, test): - self._OAUTH_REQUEST_TOKEN_URL = test.get_url('/oauth1/server/request_token') - self._OAUTH_ACCESS_TOKEN_URL = test.get_url('/twitter/server/access_token') - self._OAUTH_AUTHORIZE_URL = test.get_url('/oauth1/server/authorize') - self._TWITTER_BASE_URL = test.get_url('/twitter/api') - - def get_auth_http_client(self): - return self.settings['http_client'] - - -class TwitterClientLoginHandler(TwitterClientHandler): - @asynchronous - def get(self): - if self.get_argument("oauth_token", None): - self.get_authenticated_user(self.on_user) - return - self.authorize_redirect() - - def on_user(self, user): - if user is None: - raise Exception("user is None") - self.finish(user) - - -class TwitterClientLoginGenEngineHandler(TwitterClientHandler): - @asynchronous - @gen.engine - def get(self): - if self.get_argument("oauth_token", None): - user = yield self.get_authenticated_user() - self.finish(user) - else: - # Old style: with @gen.engine we can ignore the Future from - # authorize_redirect. - self.authorize_redirect() - - -class TwitterClientLoginGenCoroutineHandler(TwitterClientHandler): - @gen.coroutine - def get(self): - if self.get_argument("oauth_token", None): - user = yield self.get_authenticated_user() - self.finish(user) - else: - # New style: with @gen.coroutine the result must be yielded - # or else the request will be auto-finished too soon. - yield self.authorize_redirect() - - -class TwitterClientShowUserHandler(TwitterClientHandler): - @asynchronous - @gen.engine - def get(self): - # TODO: would be nice to go through the login flow instead of - # cheating with a hard-coded access token. - response = yield gen.Task(self.twitter_request, - '/users/show/%s' % self.get_argument('name'), - access_token=dict(key='hjkl', secret='vbnm')) - if response is None: - self.set_status(500) - self.finish('error from twitter request') - else: - self.finish(response) - - -class TwitterClientShowUserFutureHandler(TwitterClientHandler): - @asynchronous - @gen.engine - def get(self): - try: - response = yield self.twitter_request( - '/users/show/%s' % self.get_argument('name'), - access_token=dict(key='hjkl', secret='vbnm')) - except AuthError as e: - self.set_status(500) - self.finish(str(e)) - return - assert response is not None - self.finish(response) - - -class TwitterServerAccessTokenHandler(RequestHandler): - def get(self): - self.write('oauth_token=hjkl&oauth_token_secret=vbnm&screen_name=foo') - - -class TwitterServerShowUserHandler(RequestHandler): - def get(self, screen_name): - if screen_name == 'error': - raise HTTPError(500) - assert 'oauth_nonce' in self.request.arguments - assert 'oauth_timestamp' in self.request.arguments - assert 'oauth_signature' in self.request.arguments - assert self.get_argument('oauth_consumer_key') == 'test_twitter_consumer_key' - assert self.get_argument('oauth_signature_method') == 'HMAC-SHA1' - assert self.get_argument('oauth_version') == '1.0' - assert self.get_argument('oauth_token') == 'hjkl' - self.write(dict(screen_name=screen_name, name=screen_name.capitalize())) - - -class TwitterServerVerifyCredentialsHandler(RequestHandler): - def get(self): - assert 'oauth_nonce' in self.request.arguments - assert 'oauth_timestamp' in self.request.arguments - assert 'oauth_signature' in self.request.arguments - assert self.get_argument('oauth_consumer_key') == 'test_twitter_consumer_key' - assert self.get_argument('oauth_signature_method') == 'HMAC-SHA1' - assert self.get_argument('oauth_version') == '1.0' - assert self.get_argument('oauth_token') == 'hjkl' - self.write(dict(screen_name='foo', name='Foo')) - - -class GoogleOpenIdClientLoginHandler(RequestHandler, GoogleMixin): - def initialize(self, test): - self._OPENID_ENDPOINT = test.get_url('/openid/server/authenticate') - - @asynchronous - def get(self): - if self.get_argument("openid.mode", None): - self.get_authenticated_user(self.on_user) - return - res = self.authenticate_redirect() - assert isinstance(res, Future) - assert res.done() - - def on_user(self, user): - if user is None: - raise Exception("user is None") - self.finish(user) - - def get_auth_http_client(self): - return self.settings['http_client'] - - -class AuthTest(AsyncHTTPTestCase): - def get_app(self): - return Application( - [ - # test endpoints - ('/openid/client/login', OpenIdClientLoginHandler, dict(test=self)), - ('/oauth10/client/login', OAuth1ClientLoginHandler, - dict(test=self, version='1.0')), - ('/oauth10/client/request_params', - OAuth1ClientRequestParametersHandler, - dict(version='1.0')), - ('/oauth10a/client/login', OAuth1ClientLoginHandler, - dict(test=self, version='1.0a')), - ('/oauth10a/client/request_params', - OAuth1ClientRequestParametersHandler, - dict(version='1.0a')), - ('/oauth2/client/login', OAuth2ClientLoginHandler, dict(test=self)), - - ('/twitter/client/login', TwitterClientLoginHandler, dict(test=self)), - ('/twitter/client/login_gen_engine', TwitterClientLoginGenEngineHandler, dict(test=self)), - ('/twitter/client/login_gen_coroutine', TwitterClientLoginGenCoroutineHandler, dict(test=self)), - ('/twitter/client/show_user', TwitterClientShowUserHandler, dict(test=self)), - ('/twitter/client/show_user_future', TwitterClientShowUserFutureHandler, dict(test=self)), - ('/google/client/openid_login', GoogleOpenIdClientLoginHandler, dict(test=self)), - - # simulated servers - ('/openid/server/authenticate', OpenIdServerAuthenticateHandler), - ('/oauth1/server/request_token', OAuth1ServerRequestTokenHandler), - ('/oauth1/server/access_token', OAuth1ServerAccessTokenHandler), - - ('/twitter/server/access_token', TwitterServerAccessTokenHandler), - (r'/twitter/api/users/show/(.*)\.json', TwitterServerShowUserHandler), - (r'/twitter/api/account/verify_credentials\.json', TwitterServerVerifyCredentialsHandler), - ], - http_client=self.http_client, - twitter_consumer_key='test_twitter_consumer_key', - twitter_consumer_secret='test_twitter_consumer_secret') - - def test_openid_redirect(self): - response = self.fetch('/openid/client/login', follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue( - '/openid/server/authenticate?' in response.headers['Location']) - - def test_openid_get_user(self): - response = self.fetch('/openid/client/login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.com') - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed["email"], "foo@example.com") - - def test_oauth10_redirect(self): - response = self.fetch('/oauth10/client/login', follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue(response.headers['Location'].endswith( - '/oauth1/server/authorize?oauth_token=zxcv')) - # the cookie is base64('zxcv')|base64('1234') - self.assertTrue( - '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'], - response.headers['Set-Cookie']) - - def test_oauth10_get_user(self): - response = self.fetch( - '/oauth10/client/login?oauth_token=zxcv', - headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='}) - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed['email'], 'foo@example.com') - self.assertEqual(parsed['access_token'], dict(key='uiop', secret='5678')) - - def test_oauth10_request_parameters(self): - response = self.fetch('/oauth10/client/request_params') - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed['oauth_consumer_key'], 'asdf') - self.assertEqual(parsed['oauth_token'], 'uiop') - self.assertTrue('oauth_nonce' in parsed) - self.assertTrue('oauth_signature' in parsed) - - def test_oauth10a_redirect(self): - response = self.fetch('/oauth10a/client/login', follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue(response.headers['Location'].endswith( - '/oauth1/server/authorize?oauth_token=zxcv')) - # the cookie is base64('zxcv')|base64('1234') - self.assertTrue( - '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'], - response.headers['Set-Cookie']) - - def test_oauth10a_get_user(self): - response = self.fetch( - '/oauth10a/client/login?oauth_token=zxcv', - headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='}) - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed['email'], 'foo@example.com') - self.assertEqual(parsed['access_token'], dict(key='uiop', secret='5678')) - - def test_oauth10a_request_parameters(self): - response = self.fetch('/oauth10a/client/request_params') - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed['oauth_consumer_key'], 'asdf') - self.assertEqual(parsed['oauth_token'], 'uiop') - self.assertTrue('oauth_nonce' in parsed) - self.assertTrue('oauth_signature' in parsed) - - def test_oauth2_redirect(self): - response = self.fetch('/oauth2/client/login', follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue('/oauth2/server/authorize?' in response.headers['Location']) - - def base_twitter_redirect(self, url): - # Same as test_oauth10a_redirect - response = self.fetch(url, follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue(response.headers['Location'].endswith( - '/oauth1/server/authorize?oauth_token=zxcv')) - # the cookie is base64('zxcv')|base64('1234') - self.assertTrue( - '_oauth_request_token="enhjdg==|MTIzNA=="' in response.headers['Set-Cookie'], - response.headers['Set-Cookie']) - - def test_twitter_redirect(self): - self.base_twitter_redirect('/twitter/client/login') - - def test_twitter_redirect_gen_engine(self): - self.base_twitter_redirect('/twitter/client/login_gen_engine') - - def test_twitter_redirect_gen_coroutine(self): - self.base_twitter_redirect('/twitter/client/login_gen_coroutine') - - def test_twitter_get_user(self): - response = self.fetch( - '/twitter/client/login?oauth_token=zxcv', - headers={'Cookie': '_oauth_request_token=enhjdg==|MTIzNA=='}) - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed, - {u('access_token'): {u('key'): u('hjkl'), - u('screen_name'): u('foo'), - u('secret'): u('vbnm')}, - u('name'): u('Foo'), - u('screen_name'): u('foo'), - u('username'): u('foo')}) - - def test_twitter_show_user(self): - response = self.fetch('/twitter/client/show_user?name=somebody') - response.rethrow() - self.assertEqual(json_decode(response.body), - {'name': 'Somebody', 'screen_name': 'somebody'}) - - def test_twitter_show_user_error(self): - with ExpectLog(gen_log, 'Error response HTTP 500'): - response = self.fetch('/twitter/client/show_user?name=error') - self.assertEqual(response.code, 500) - self.assertEqual(response.body, b'error from twitter request') - - def test_twitter_show_user_future(self): - response = self.fetch('/twitter/client/show_user_future?name=somebody') - response.rethrow() - self.assertEqual(json_decode(response.body), - {'name': 'Somebody', 'screen_name': 'somebody'}) - - def test_twitter_show_user_future_error(self): - response = self.fetch('/twitter/client/show_user_future?name=error') - self.assertEqual(response.code, 500) - self.assertIn(b'Error response HTTP 500', response.body) - - def test_google_redirect(self): - # same as test_openid_redirect - response = self.fetch('/google/client/openid_login', follow_redirects=False) - self.assertEqual(response.code, 302) - self.assertTrue( - '/openid/server/authenticate?' in response.headers['Location']) - - def test_google_get_user(self): - response = self.fetch('/google/client/openid_login?openid.mode=blah&openid.ns.ax=http://openid.net/srv/ax/1.0&openid.ax.type.email=http://axschema.org/contact/email&openid.ax.value.email=foo@example.com', follow_redirects=False) - response.rethrow() - parsed = json_decode(response.body) - self.assertEqual(parsed["email"], "foo@example.com") diff --git a/vendor/tornado/test/concurrent_test.py b/vendor/tornado/test/concurrent_test.py deleted file mode 100644 index 854f1160..00000000 --- a/vendor/tornado/test/concurrent_test.py +++ /dev/null @@ -1,330 +0,0 @@ -#!/usr/bin/env python -# -# Copyright 2012 Facebook -# -# 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. -from __future__ import absolute_import, division, print_function, with_statement - -import logging -import re -import socket -import sys -import traceback - -from tornado.concurrent import Future, return_future, ReturnValueIgnoredError -from tornado.escape import utf8, to_unicode -from tornado import gen -from tornado.iostream import IOStream -from tornado import stack_context -from tornado.tcpserver import TCPServer -from tornado.testing import AsyncTestCase, LogTrapTestCase, bind_unused_port, gen_test - - -class ReturnFutureTest(AsyncTestCase): - @return_future - def sync_future(self, callback): - callback(42) - - @return_future - def async_future(self, callback): - self.io_loop.add_callback(callback, 42) - - @return_future - def immediate_failure(self, callback): - 1 / 0 - - @return_future - def delayed_failure(self, callback): - self.io_loop.add_callback(lambda: 1 / 0) - - @return_future - def return_value(self, callback): - # Note that the result of both running the callback and returning - # a value (or raising an exception) is unspecified; with current - # implementations the last event prior to callback resolution wins. - return 42 - - @return_future - def no_result_future(self, callback): - callback() - - def test_immediate_failure(self): - with self.assertRaises(ZeroDivisionError): - # The caller sees the error just like a normal function. - self.immediate_failure(callback=self.stop) - # The callback is not run because the function failed synchronously. - self.io_loop.add_timeout(self.io_loop.time() + 0.05, self.stop) - result = self.wait() - self.assertIs(result, None) - - def test_return_value(self): - with self.assertRaises(ReturnValueIgnoredError): - self.return_value(callback=self.stop) - - def test_callback_kw(self): - future = self.sync_future(callback=self.stop) - result = self.wait() - self.assertEqual(result, 42) - self.assertEqual(future.result(), 42) - - def test_callback_positional(self): - # When the callback is passed in positionally, future_wrap shouldn't - # add another callback in the kwargs. - future = self.sync_future(self.stop) - result = self.wait() - self.assertEqual(result, 42) - self.assertEqual(future.result(), 42) - - def test_no_callback(self): - future = self.sync_future() - self.assertEqual(future.result(), 42) - - def test_none_callback_kw(self): - # explicitly pass None as callback - future = self.sync_future(callback=None) - self.assertEqual(future.result(), 42) - - def test_none_callback_pos(self): - future = self.sync_future(None) - self.assertEqual(future.result(), 42) - - def test_async_future(self): - future = self.async_future() - self.assertFalse(future.done()) - self.io_loop.add_future(future, self.stop) - future2 = self.wait() - self.assertIs(future, future2) - self.assertEqual(future.result(), 42) - - @gen_test - def test_async_future_gen(self): - result = yield self.async_future() - self.assertEqual(result, 42) - - def test_delayed_failure(self): - future = self.delayed_failure() - self.io_loop.add_future(future, self.stop) - future2 = self.wait() - self.assertIs(future, future2) - with self.assertRaises(ZeroDivisionError): - future.result() - - def test_kw_only_callback(self): - @return_future - def f(**kwargs): - kwargs['callback'](42) - future = f() - self.assertEqual(future.result(), 42) - - def test_error_in_callback(self): - self.sync_future(callback=lambda future: 1 / 0) - # The exception gets caught by our StackContext and will be re-raised - # when we wait. - self.assertRaises(ZeroDivisionError, self.wait) - - def test_no_result_future(self): - future = self.no_result_future(self.stop) - result = self.wait() - self.assertIs(result, None) - # result of this future is undefined, but not an error - future.result() - - def test_no_result_future_callback(self): - future = self.no_result_future(callback=lambda: self.stop()) - result = self.wait() - self.assertIs(result, None) - future.result() - - @gen_test - def test_future_traceback(self): - @return_future - @gen.engine - def f(callback): - yield gen.Task(self.io_loop.add_callback) - try: - 1 / 0 - except ZeroDivisionError: - self.expected_frame = traceback.extract_tb( - sys.exc_info()[2], limit=1)[0] - raise - try: - yield f() - self.fail("didn't get expected exception") - except ZeroDivisionError: - tb = traceback.extract_tb(sys.exc_info()[2]) - self.assertIn(self.expected_frame, tb) - -# The following series of classes demonstrate and test various styles -# of use, with and without generators and futures. - - -class CapServer(TCPServer): - def handle_stream(self, stream, address): - logging.info("handle_stream") - self.stream = stream - self.stream.read_until(b"\n", self.handle_read) - - def handle_read(self, data): - logging.info("handle_read") - data = to_unicode(data) - if data == data.upper(): - self.stream.write(b"error\talready capitalized\n") - else: - # data already has \n - self.stream.write(utf8("ok\t%s" % data.upper())) - self.stream.close() - - -class CapError(Exception): - pass - - -class BaseCapClient(object): - def __init__(self, port, io_loop): - self.port = port - self.io_loop = io_loop - - def process_response(self, data): - status, message = re.match('(.*)\t(.*)\n', to_unicode(data)).groups() - if status == 'ok': - return message - else: - raise CapError(message) - - -class ManualCapClient(BaseCapClient): - def capitalize(self, request_data, callback=None): - logging.info("capitalize") - self.request_data = request_data - self.stream = IOStream(socket.socket(), io_loop=self.io_loop) - self.stream.connect(('127.0.0.1', self.port), - callback=self.handle_connect) - self.future = Future() - if callback is not None: - self.future.add_done_callback( - stack_context.wrap(lambda future: callback(future.result()))) - return self.future - - def handle_connect(self): - logging.info("handle_connect") - self.stream.write(utf8(self.request_data + "\n")) - self.stream.read_until(b'\n', callback=self.handle_read) - - def handle_read(self, data): - logging.info("handle_read") - self.stream.close() - try: - self.future.set_result(self.process_response(data)) - except CapError as e: - self.future.set_exception(e) - - -class DecoratorCapClient(BaseCapClient): - @return_future - def capitalize(self, request_data, callback): - logging.info("capitalize") - self.request_data = request_data - self.stream = IOStream(socket.socket(), io_loop=self.io_loop) - self.stream.connect(('127.0.0.1', self.port), - callback=self.handle_connect) - self.callback = callback - - def handle_connect(self): - logging.info("handle_connect") - self.stream.write(utf8(self.request_data + "\n")) - self.stream.read_until(b'\n', callback=self.handle_read) - - def handle_read(self, data): - logging.info("handle_read") - self.stream.close() - self.callback(self.process_response(data)) - - -class GeneratorCapClient(BaseCapClient): - @return_future - @gen.engine - def capitalize(self, request_data, callback): - logging.info('capitalize') - stream = IOStream(socket.socket(), io_loop=self.io_loop) - logging.info('connecting') - yield gen.Task(stream.connect, ('127.0.0.1', self.port)) - stream.write(utf8(request_data + '\n')) - logging.info('reading') - data = yield gen.Task(stream.read_until, b'\n') - logging.info('returning') - stream.close() - callback(self.process_response(data)) - - -class ClientTestMixin(object): - def setUp(self): - super(ClientTestMixin, self).setUp() - self.server = CapServer(io_loop=self.io_loop) - sock, port = bind_unused_port() - self.server.add_sockets([sock]) - self.client = self.client_class(io_loop=self.io_loop, port=port) - - def tearDown(self): - self.server.stop() - super(ClientTestMixin, self).tearDown() - - def test_callback(self): - self.client.capitalize("hello", callback=self.stop) - result = self.wait() - self.assertEqual(result, "HELLO") - - def test_callback_error(self): - self.client.capitalize("HELLO", callback=self.stop) - self.assertRaisesRegexp(CapError, "already capitalized", self.wait) - - def test_future(self): - future = self.client.capitalize("hello") - self.io_loop.add_future(future, self.stop) - self.wait() - self.assertEqual(future.result(), "HELLO") - - def test_future_error(self): - future = self.client.capitalize("HELLO") - self.io_loop.add_future(future, self.stop) - self.wait() - self.assertRaisesRegexp(CapError, "already capitalized", future.result) - - def test_generator(self): - @gen.engine - def f(): - result = yield self.client.capitalize("hello") - self.assertEqual(result, "HELLO") - self.stop() - f() - self.wait() - - def test_generator_error(self): - @gen.engine - def f(): - with self.assertRaisesRegexp(CapError, "already capitalized"): - yield self.client.capitalize("HELLO") - self.stop() - f() - self.wait() - - -class ManualClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase): - client_class = ManualCapClient - - -class DecoratorClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase): - client_class = DecoratorCapClient - - -class GeneratorClientTest(ClientTestMixin, AsyncTestCase, LogTrapTestCase): - client_class = GeneratorCapClient diff --git a/vendor/tornado/test/csv_translations/fr_FR.csv b/vendor/tornado/test/csv_translations/fr_FR.csv deleted file mode 100644 index 6321b6e7..00000000 --- a/vendor/tornado/test/csv_translations/fr_FR.csv +++ /dev/null @@ -1 +0,0 @@ -"school","école" diff --git a/vendor/tornado/test/curl_httpclient_test.py b/vendor/tornado/test/curl_httpclient_test.py deleted file mode 100644 index e9ba8a76..00000000 --- a/vendor/tornado/test/curl_httpclient_test.py +++ /dev/null @@ -1,99 +0,0 @@ -from __future__ import absolute_import, division, print_function, with_statement - -from hashlib import md5 - -from tornado.httpclient import HTTPRequest -from tornado.stack_context import ExceptionStackContext -from tornado.testing import AsyncHTTPTestCase -from tornado.test import httpclient_test -from tornado.test.util import unittest -from tornado.web import Application, RequestHandler - -try: - import pycurl -except ImportError: - pycurl = None - -if pycurl is not None: - from tornado.curl_httpclient import CurlAsyncHTTPClient - - -@unittest.skipIf(pycurl is None, "pycurl module not present") -class CurlHTTPClientCommonTestCase(httpclient_test.HTTPClientCommonTestCase): - def get_http_client(self): - client = CurlAsyncHTTPClient(io_loop=self.io_loop) - # make sure AsyncHTTPClient magic doesn't give us the wrong class - self.assertTrue(isinstance(client, CurlAsyncHTTPClient)) - return client - - -class DigestAuthHandler(RequestHandler): - def get(self): - realm = 'test' - opaque = 'asdf' - # Real implementations would use a random nonce. - nonce = "1234" - username = 'foo' - password = 'bar' - - auth_header = self.request.headers.get('Authorization', None) - if auth_header is not None: - auth_mode, params = auth_header.split(' ', 1) - assert auth_mode == 'Digest' - param_dict = {} - for pair in params.split(','): - k, v = pair.strip().split('=', 1) - if v[0] == '"' and v[-1] == '"': - v = v[1:-1] - param_dict[k] = v - assert param_dict['realm'] == realm - assert param_dict['opaque'] == opaque - assert param_dict['nonce'] == nonce - assert param_dict['username'] == username - assert param_dict['uri'] == self.request.path - h1 = md5('%s:%s:%s' % (username, realm, password)).hexdigest() - h2 = md5('%s:%s' % (self.request.method, - self.request.path)).hexdigest() - digest = md5('%s:%s:%s' % (h1, nonce, h2)).hexdigest() - if digest == param_dict['response']: - self.write('ok') - else: - self.write('fail') - else: - self.set_status(401) - self.set_header('WWW-Authenticate', - 'Digest realm="%s", nonce="%s", opaque="%s"' % - (realm, nonce, opaque)) - - -@unittest.skipIf(pycurl is None, "pycurl module not present") -class CurlHTTPClientTestCase(AsyncHTTPTestCase): - def setUp(self): - super(CurlHTTPClientTestCase, self).setUp() - self.http_client = CurlAsyncHTTPClient(self.io_loop) - - def get_app(self): - return Application([ - ('/digest', DigestAuthHandler), - ]) - - def test_prepare_curl_callback_stack_context(self): - exc_info = [] - - def error_handler(typ, value, tb): - exc_info.append((typ, value, tb)) - self.stop() - return True - - with ExceptionStackContext(error_handler): - request = HTTPRequest(self.get_url('/'), - prepare_curl_callback=lambda curl: 1 / 0) - self.http_client.fetch(request, callback=self.stop) - self.wait() - self.assertEqual(1, len(exc_info)) - self.assertIs(exc_info[0][0], ZeroDivisionError) - - def test_digest_auth(self): - response = self.fetch('/digest', auth_mode='digest', - auth_username='foo', auth_password='bar') - self.assertEqual(response.body, b'ok') diff --git a/vendor/tornado/test/escape_test.py b/vendor/tornado/test/escape_test.py deleted file mode 100644 index 0370d77d..00000000 --- a/vendor/tornado/test/escape_test.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env python - - -from __future__ import absolute_import, division, print_function, with_statement -import tornado.escape - -from tornado.escape import utf8, xhtml_escape, xhtml_unescape, url_escape, url_unescape, to_unicode, json_decode, json_encode -from tornado.util import u, unicode_type, bytes_type -from tornado.test.util import unittest - -linkify_tests = [ - # (input, linkify_kwargs, expected_output) - - ("hello http://world.com/!", {}, - u('hello http://world.com/!')), - - ("hello http://world.com/with?param=true&stuff=yes", {}, - u('hello http://world.com/with?param=true&stuff=yes')), - - # an opened paren followed by many chars killed Gruber's regex - ("http://url.com/w(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", {}, - u('http://url.com/w(aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')), - - # as did too many dots at the end - ("http://url.com/withmany.......................................", {}, - u('http://url.com/withmany.......................................')), - - ("http://url.com/withmany((((((((((((((((((((((((((((((((((a)", {}, - u('http://url.com/withmany((((((((((((((((((((((((((((((((((a)')), - - # some examples from http://daringfireball.net/2009/11/liberal_regex_for_matching_urls - # plus a fex extras (such as multiple parentheses). - ("http://foo.com/blah_blah", {}, - u('http://foo.com/blah_blah')), - - ("http://foo.com/blah_blah/", {}, - u('http://foo.com/blah_blah/')), - - ("(Something like http://foo.com/blah_blah)", {}, - u('(Something like http://foo.com/blah_blah)')), - - ("http://foo.com/blah_blah_(wikipedia)", {}, - u('http://foo.com/blah_blah_(wikipedia)')), - - ("http://foo.com/blah_(blah)_(wikipedia)_blah", {}, - u('http://foo.com/blah_(blah)_(wikipedia)_blah')), - - ("(Something like http://foo.com/blah_blah_(wikipedia))", {}, - u('(Something like http://foo.com/blah_blah_(wikipedia))')), - - ("http://foo.com/blah_blah.", {}, - u('http://foo.com/blah_blah.')), - - ("http://foo.com/blah_blah/.", {}, - u('http://foo.com/blah_blah/.')), - - ("", {}, - u('<http://foo.com/blah_blah>')), - - ("", {}, - u('<http://foo.com/blah_blah/>')), - - ("http://foo.com/blah_blah,", {}, - u('http://foo.com/blah_blah,')), - - ("http://www.example.com/wpstyle/?p=364.", {}, - u('http://www.example.com/wpstyle/?p=364.')), - - ("rdar://1234", - {"permitted_protocols": ["http", "rdar"]}, - u('rdar://1234')), - - ("rdar:/1234", - {"permitted_protocols": ["rdar"]}, - u('rdar:/1234')), - - ("http://userid:password@example.com:8080", {}, - u('http://userid:password@example.com:8080')), - - ("http://userid@example.com", {}, - u('http://userid@example.com')), - - ("http://userid@example.com:8080", {}, - u('http://userid@example.com:8080')), - - ("http://userid:password@example.com", {}, - u('http://userid:password@example.com')), - - ("message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e", - {"permitted_protocols": ["http", "message"]}, - u('message://%3c330e7f8409726r6a4ba78dkf1fd71420c1bf6ff@mail.gmail.com%3e')), - - (u("http://\u27a1.ws/\u4a39"), {}, - u('http://\u27a1.ws/\u4a39')), - - ("http://example.com", {}, - u('<tag>http://example.com</tag>')), - - ("Just a www.example.com link.", {}, - u('Just a www.example.com link.')), - - ("Just a www.example.com link.", - {"require_protocol": True}, - u('Just a www.example.com link.')), - - ("A http://reallylong.com/link/that/exceedsthelenglimit.html", - {"require_protocol": True, "shorten": True}, - u('A http://reallylong.com/link...')), - - ("A http://reallylongdomainnamethatwillbetoolong.com/hi!", - {"shorten": True}, - u('A http://reallylongdomainnametha...!')), - - ("A file:///passwords.txt and http://web.com link", {}, - u('A file:///passwords.txt and http://web.com link')), - - ("A file:///passwords.txt and http://web.com link", - {"permitted_protocols": ["file"]}, - u('A file:///passwords.txt and http://web.com link')), - - ("www.external-link.com", - {"extra_params": 'rel="nofollow" class="external"'}, - u('www.external-link.com')), - - ("www.external-link.com and www.internal-link.com/blogs extra", - {"extra_params": lambda href: 'class="internal"' if href.startswith("http://www.internal-link.com") else 'rel="nofollow" class="external"'}, - u('www.external-link.com and www.internal-link.com/blogs extra')), - - ("www.external-link.com", - {"extra_params": lambda href: ' rel="nofollow" class="external" '}, - u('www.external-link.com')), -] - - -class EscapeTestCase(unittest.TestCase): - def test_linkify(self): - for text, kwargs, html in linkify_tests: - linked = tornado.escape.linkify(text, **kwargs) - self.assertEqual(linked, html) - - def test_xhtml_escape(self): - tests = [ - ("", "<foo>"), - (u(""), u("<foo>")), - (b"", b"<foo>"), - - ("<>&\"", "<>&""), - ("&", "&amp;"), - - (u("<\u00e9>"), u("<\u00e9>")), - (b"<\xc3\xa9>", b"<\xc3\xa9>"), - ] - for unescaped, escaped in tests: - self.assertEqual(utf8(xhtml_escape(unescaped)), utf8(escaped)) - self.assertEqual(utf8(unescaped), utf8(xhtml_unescape(escaped))) - - def test_url_escape_unicode(self): - tests = [ - # byte strings are passed through as-is - (u('\u00e9').encode('utf8'), '%C3%A9'), - (u('\u00e9').encode('latin1'), '%E9'), - - # unicode strings become utf8 - (u('\u00e9'), '%C3%A9'), - ] - for unescaped, escaped in tests: - self.assertEqual(url_escape(unescaped), escaped) - - def test_url_unescape_unicode(self): - tests = [ - ('%C3%A9', u('\u00e9'), 'utf8'), - ('%C3%A9', u('\u00c3\u00a9'), 'latin1'), - ('%C3%A9', utf8(u('\u00e9')), None), - ] - for escaped, unescaped, encoding in tests: - # input strings to url_unescape should only contain ascii - # characters, but make sure the function accepts both byte - # and unicode strings. - self.assertEqual(url_unescape(to_unicode(escaped), encoding), unescaped) - self.assertEqual(url_unescape(utf8(escaped), encoding), unescaped) - - def test_url_escape_quote_plus(self): - unescaped = '+ #%' - plus_escaped = '%2B+%23%25' - escaped = '%2B%20%23%25' - self.assertEqual(url_escape(unescaped), plus_escaped) - self.assertEqual(url_escape(unescaped, plus=False), escaped) - self.assertEqual(url_unescape(plus_escaped), unescaped) - self.assertEqual(url_unescape(escaped, plus=False), unescaped) - self.assertEqual(url_unescape(plus_escaped, encoding=None), - utf8(unescaped)) - self.assertEqual(url_unescape(escaped, encoding=None, plus=False), - utf8(unescaped)) - - def test_escape_return_types(self): - # On python2 the escape methods should generally return the same - # type as their argument - self.assertEqual(type(xhtml_escape("foo")), str) - self.assertEqual(type(xhtml_escape(u("foo"))), unicode_type) - - def test_json_decode(self): - # json_decode accepts both bytes and unicode, but strings it returns - # are always unicode. - self.assertEqual(json_decode(b'"foo"'), u("foo")) - self.assertEqual(json_decode(u('"foo"')), u("foo")) - - # Non-ascii bytes are interpreted as utf8 - self.assertEqual(json_decode(utf8(u('"\u00e9"'))), u("\u00e9")) - - def test_json_encode(self): - # json deals with strings, not bytes. On python 2 byte strings will - # convert automatically if they are utf8; on python 3 byte strings - # are not allowed. - self.assertEqual(json_decode(json_encode(u("\u00e9"))), u("\u00e9")) - if bytes_type is str: - self.assertEqual(json_decode(json_encode(utf8(u("\u00e9")))), u("\u00e9")) - self.assertRaises(UnicodeDecodeError, json_encode, b"\xe9") diff --git a/vendor/tornado/test/gen_test.py b/vendor/tornado/test/gen_test.py deleted file mode 100644 index 52de8da5..00000000 --- a/vendor/tornado/test/gen_test.py +++ /dev/null @@ -1,913 +0,0 @@ -from __future__ import absolute_import, division, print_function, with_statement - -import contextlib -import functools -import sys -import textwrap -import time -import platform -import weakref - -from tornado.concurrent import return_future -from tornado.escape import url_escape -from tornado.httpclient import AsyncHTTPClient -from tornado.ioloop import IOLoop -from tornado.log import app_log -from tornado import stack_context -from tornado.testing import AsyncHTTPTestCase, AsyncTestCase, ExpectLog, gen_test -from tornado.test.util import unittest, skipOnTravis -from tornado.web import Application, RequestHandler, asynchronous, HTTPError - -from tornado import gen - - -skipBefore33 = unittest.skipIf(sys.version_info < (3, 3), 'PEP 380 not available') -skipNotCPython = unittest.skipIf(platform.python_implementation() != 'CPython', - 'Not CPython implementation') - - -class GenEngineTest(AsyncTestCase): - def setUp(self): - super(GenEngineTest, self).setUp() - self.named_contexts = [] - - def named_context(self, name): - @contextlib.contextmanager - def context(): - self.named_contexts.append(name) - try: - yield - finally: - self.assertEqual(self.named_contexts.pop(), name) - return context - - def run_gen(self, f): - f() - return self.wait() - - def delay_callback(self, iterations, callback, arg): - """Runs callback(arg) after a number of IOLoop iterations.""" - if iterations == 0: - callback(arg) - else: - self.io_loop.add_callback(functools.partial( - self.delay_callback, iterations - 1, callback, arg)) - - @return_future - def async_future(self, result, callback): - self.io_loop.add_callback(callback, result) - - def test_no_yield(self): - @gen.engine - def f(): - self.stop() - self.run_gen(f) - - def test_inline_cb(self): - @gen.engine - def f(): - (yield gen.Callback("k1"))() - res = yield gen.Wait("k1") - self.assertTrue(res is None) - self.stop() - self.run_gen(f) - - def test_ioloop_cb(self): - @gen.engine - def f(): - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.stop() - self.run_gen(f) - - def test_exception_phase1(self): - @gen.engine - def f(): - 1 / 0 - self.assertRaises(ZeroDivisionError, self.run_gen, f) - - def test_exception_phase2(self): - @gen.engine - def f(): - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - 1 / 0 - self.assertRaises(ZeroDivisionError, self.run_gen, f) - - def test_exception_in_task_phase1(self): - def fail_task(callback): - 1 / 0 - - @gen.engine - def f(): - try: - yield gen.Task(fail_task) - raise Exception("did not get expected exception") - except ZeroDivisionError: - self.stop() - self.run_gen(f) - - def test_exception_in_task_phase2(self): - # This is the case that requires the use of stack_context in gen.engine - def fail_task(callback): - self.io_loop.add_callback(lambda: 1 / 0) - - @gen.engine - def f(): - try: - yield gen.Task(fail_task) - raise Exception("did not get expected exception") - except ZeroDivisionError: - self.stop() - self.run_gen(f) - - def test_with_arg(self): - @gen.engine - def f(): - (yield gen.Callback("k1"))(42) - res = yield gen.Wait("k1") - self.assertEqual(42, res) - self.stop() - self.run_gen(f) - - def test_with_arg_tuple(self): - @gen.engine - def f(): - (yield gen.Callback((1, 2)))((3, 4)) - res = yield gen.Wait((1, 2)) - self.assertEqual((3, 4), res) - self.stop() - self.run_gen(f) - - def test_key_reuse(self): - @gen.engine - def f(): - yield gen.Callback("k1") - yield gen.Callback("k1") - self.stop() - self.assertRaises(gen.KeyReuseError, self.run_gen, f) - - def test_key_reuse_tuple(self): - @gen.engine - def f(): - yield gen.Callback((1, 2)) - yield gen.Callback((1, 2)) - self.stop() - self.assertRaises(gen.KeyReuseError, self.run_gen, f) - - def test_key_mismatch(self): - @gen.engine - def f(): - yield gen.Callback("k1") - yield gen.Wait("k2") - self.stop() - self.assertRaises(gen.UnknownKeyError, self.run_gen, f) - - def test_key_mismatch_tuple(self): - @gen.engine - def f(): - yield gen.Callback((1, 2)) - yield gen.Wait((2, 3)) - self.stop() - self.assertRaises(gen.UnknownKeyError, self.run_gen, f) - - def test_leaked_callback(self): - @gen.engine - def f(): - yield gen.Callback("k1") - self.stop() - self.assertRaises(gen.LeakedCallbackError, self.run_gen, f) - - def test_leaked_callback_tuple(self): - @gen.engine - def f(): - yield gen.Callback((1, 2)) - self.stop() - self.assertRaises(gen.LeakedCallbackError, self.run_gen, f) - - def test_parallel_callback(self): - @gen.engine - def f(): - for k in range(3): - self.io_loop.add_callback((yield gen.Callback(k))) - yield gen.Wait(1) - self.io_loop.add_callback((yield gen.Callback(3))) - yield gen.Wait(0) - yield gen.Wait(3) - yield gen.Wait(2) - self.stop() - self.run_gen(f) - - def test_bogus_yield(self): - @gen.engine - def f(): - yield 42 - self.assertRaises(gen.BadYieldError, self.run_gen, f) - - def test_bogus_yield_tuple(self): - @gen.engine - def f(): - yield (1, 2) - self.assertRaises(gen.BadYieldError, self.run_gen, f) - - def test_reuse(self): - @gen.engine - def f(): - self.io_loop.add_callback((yield gen.Callback(0))) - yield gen.Wait(0) - self.stop() - self.run_gen(f) - self.run_gen(f) - - def test_task(self): - @gen.engine - def f(): - yield gen.Task(self.io_loop.add_callback) - self.stop() - self.run_gen(f) - - def test_wait_all(self): - @gen.engine - def f(): - (yield gen.Callback("k1"))("v1") - (yield gen.Callback("k2"))("v2") - results = yield gen.WaitAll(["k1", "k2"]) - self.assertEqual(results, ["v1", "v2"]) - self.stop() - self.run_gen(f) - - def test_exception_in_yield(self): - @gen.engine - def f(): - try: - yield gen.Wait("k1") - raise Exception("did not get expected exception") - except gen.UnknownKeyError: - pass - self.stop() - self.run_gen(f) - - def test_resume_after_exception_in_yield(self): - @gen.engine - def f(): - try: - yield gen.Wait("k1") - raise Exception("did not get expected exception") - except gen.UnknownKeyError: - pass - (yield gen.Callback("k2"))("v2") - self.assertEqual((yield gen.Wait("k2")), "v2") - self.stop() - self.run_gen(f) - - def test_orphaned_callback(self): - @gen.engine - def f(): - self.orphaned_callback = yield gen.Callback(1) - try: - self.run_gen(f) - raise Exception("did not get expected exception") - except gen.LeakedCallbackError: - pass - self.orphaned_callback() - - def test_multi(self): - @gen.engine - def f(): - (yield gen.Callback("k1"))("v1") - (yield gen.Callback("k2"))("v2") - results = yield [gen.Wait("k1"), gen.Wait("k2")] - self.assertEqual(results, ["v1", "v2"]) - self.stop() - self.run_gen(f) - - def test_multi_delayed(self): - @gen.engine - def f(): - # callbacks run at different times - responses = yield [ - gen.Task(self.delay_callback, 3, arg="v1"), - gen.Task(self.delay_callback, 1, arg="v2"), - ] - self.assertEqual(responses, ["v1", "v2"]) - self.stop() - self.run_gen(f) - - @skipOnTravis - @gen_test - def test_multi_performance(self): - # Yielding a list used to have quadratic performance; make - # sure a large list stays reasonable. On my laptop a list of - # 2000 used to take 1.8s, now it takes 0.12. - start = time.time() - yield [gen.Task(self.io_loop.add_callback) for i in range(2000)] - end = time.time() - self.assertLess(end - start, 1.0) - - @gen_test - def test_future(self): - result = yield self.async_future(1) - self.assertEqual(result, 1) - - @gen_test - def test_multi_future(self): - results = yield [self.async_future(1), self.async_future(2)] - self.assertEqual(results, [1, 2]) - - def test_arguments(self): - @gen.engine - def f(): - (yield gen.Callback("noargs"))() - self.assertEqual((yield gen.Wait("noargs")), None) - (yield gen.Callback("1arg"))(42) - self.assertEqual((yield gen.Wait("1arg")), 42) - - (yield gen.Callback("kwargs"))(value=42) - result = yield gen.Wait("kwargs") - self.assertTrue(isinstance(result, gen.Arguments)) - self.assertEqual(((), dict(value=42)), result) - self.assertEqual(dict(value=42), result.kwargs) - - (yield gen.Callback("2args"))(42, 43) - result = yield gen.Wait("2args") - self.assertTrue(isinstance(result, gen.Arguments)) - self.assertEqual(((42, 43), {}), result) - self.assertEqual((42, 43), result.args) - - def task_func(callback): - callback(None, error="foo") - result = yield gen.Task(task_func) - self.assertTrue(isinstance(result, gen.Arguments)) - self.assertEqual(((None,), dict(error="foo")), result) - - self.stop() - self.run_gen(f) - - def test_stack_context_leak(self): - # regression test: repeated invocations of a gen-based - # function should not result in accumulated stack_contexts - def _stack_depth(): - head = stack_context._state.contexts[1] - length = 0 - - while head is not None: - length += 1 - head = head.old_contexts[1] - - return length - - @gen.engine - def inner(callback): - yield gen.Task(self.io_loop.add_callback) - callback() - - @gen.engine - def outer(): - for i in range(10): - yield gen.Task(inner) - - stack_increase = _stack_depth() - initial_stack_depth - self.assertTrue(stack_increase <= 2) - self.stop() - initial_stack_depth = _stack_depth() - self.run_gen(outer) - - def test_stack_context_leak_exception(self): - # same as previous, but with a function that exits with an exception - @gen.engine - def inner(callback): - yield gen.Task(self.io_loop.add_callback) - 1 / 0 - - @gen.engine - def outer(): - for i in range(10): - try: - yield gen.Task(inner) - except ZeroDivisionError: - pass - stack_increase = len(stack_context._state.contexts) - initial_stack_depth - self.assertTrue(stack_increase <= 2) - self.stop() - initial_stack_depth = len(stack_context._state.contexts) - self.run_gen(outer) - - def function_with_stack_context(self, callback): - # Technically this function should stack_context.wrap its callback - # upon entry. However, it is very common for this step to be - # omitted. - def step2(): - self.assertEqual(self.named_contexts, ['a']) - self.io_loop.add_callback(callback) - - with stack_context.StackContext(self.named_context('a')): - self.io_loop.add_callback(step2) - - @gen_test - def test_wait_transfer_stack_context(self): - # Wait should not pick up contexts from where callback was invoked, - # even if that function improperly fails to wrap its callback. - cb = yield gen.Callback('k1') - self.function_with_stack_context(cb) - self.assertEqual(self.named_contexts, []) - yield gen.Wait('k1') - self.assertEqual(self.named_contexts, []) - - @gen_test - def test_task_transfer_stack_context(self): - yield gen.Task(self.function_with_stack_context) - self.assertEqual(self.named_contexts, []) - - def test_raise_after_stop(self): - # This pattern will be used in the following tests so make sure - # the exception propagates as expected. - @gen.engine - def f(): - self.stop() - 1 / 0 - - with self.assertRaises(ZeroDivisionError): - self.run_gen(f) - - def test_sync_raise_return(self): - # gen.Return is allowed in @gen.engine, but it may not be used - # to return a value. - @gen.engine - def f(): - self.stop(42) - raise gen.Return() - - result = self.run_gen(f) - self.assertEqual(result, 42) - - def test_async_raise_return(self): - @gen.engine - def f(): - yield gen.Task(self.io_loop.add_callback) - self.stop(42) - raise gen.Return() - - result = self.run_gen(f) - self.assertEqual(result, 42) - - def test_sync_raise_return_value(self): - @gen.engine - def f(): - raise gen.Return(42) - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - def test_sync_raise_return_value_tuple(self): - @gen.engine - def f(): - raise gen.Return((1, 2)) - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - def test_async_raise_return_value(self): - @gen.engine - def f(): - yield gen.Task(self.io_loop.add_callback) - raise gen.Return(42) - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - def test_async_raise_return_value_tuple(self): - @gen.engine - def f(): - yield gen.Task(self.io_loop.add_callback) - raise gen.Return((1, 2)) - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - def test_return_value(self): - # It is an error to apply @gen.engine to a function that returns - # a value. - @gen.engine - def f(): - return 42 - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - def test_return_value_tuple(self): - # It is an error to apply @gen.engine to a function that returns - # a value. - @gen.engine - def f(): - return (1, 2) - - with self.assertRaises(gen.ReturnValueIgnoredError): - self.run_gen(f) - - @skipNotCPython - def test_task_refcounting(self): - # On CPython, tasks and their arguments should be released immediately - # without waiting for garbage collection. - @gen.engine - def f(): - class Foo(object): - pass - arg = Foo() - self.arg_ref = weakref.ref(arg) - task = gen.Task(self.io_loop.add_callback, arg=arg) - self.task_ref = weakref.ref(task) - yield task - self.stop() - - self.run_gen(f) - self.assertIs(self.arg_ref(), None) - self.assertIs(self.task_ref(), None) - - -class GenCoroutineTest(AsyncTestCase): - def setUp(self): - # Stray StopIteration exceptions can lead to tests exiting prematurely, - # so we need explicit checks here to make sure the tests run all - # the way through. - self.finished = False - super(GenCoroutineTest, self).setUp() - - def tearDown(self): - super(GenCoroutineTest, self).tearDown() - assert self.finished - - @gen_test - def test_sync_gen_return(self): - @gen.coroutine - def f(): - raise gen.Return(42) - result = yield f() - self.assertEqual(result, 42) - self.finished = True - - @gen_test - def test_async_gen_return(self): - @gen.coroutine - def f(): - yield gen.Task(self.io_loop.add_callback) - raise gen.Return(42) - result = yield f() - self.assertEqual(result, 42) - self.finished = True - - @gen_test - def test_sync_return(self): - @gen.coroutine - def f(): - return 42 - result = yield f() - self.assertEqual(result, 42) - self.finished = True - - @skipBefore33 - @gen_test - def test_async_return(self): - # It is a compile-time error to return a value in a generator - # before Python 3.3, so we must test this with exec. - # Flatten the real global and local namespace into our fake globals: - # it's all global from the perspective of f(). - global_namespace = dict(globals(), **locals()) - local_namespace = {} - exec(textwrap.dedent(""" - @gen.coroutine - def f(): - yield gen.Task(self.io_loop.add_callback) - return 42 - """), global_namespace, local_namespace) - result = yield local_namespace['f']() - self.assertEqual(result, 42) - self.finished = True - - @skipBefore33 - @gen_test - def test_async_early_return(self): - # A yield statement exists but is not executed, which means - # this function "returns" via an exception. This exception - # doesn't happen before the exception handling is set up. - global_namespace = dict(globals(), **locals()) - local_namespace = {} - exec(textwrap.dedent(""" - @gen.coroutine - def f(): - if True: - return 42 - yield gen.Task(self.io_loop.add_callback) - """), global_namespace, local_namespace) - result = yield local_namespace['f']() - self.assertEqual(result, 42) - self.finished = True - - @gen_test - def test_sync_return_no_value(self): - @gen.coroutine - def f(): - return - result = yield f() - self.assertEqual(result, None) - self.finished = True - - @gen_test - def test_async_return_no_value(self): - # Without a return value we don't need python 3.3. - @gen.coroutine - def f(): - yield gen.Task(self.io_loop.add_callback) - return - result = yield f() - self.assertEqual(result, None) - self.finished = True - - @gen_test - def test_sync_raise(self): - @gen.coroutine - def f(): - 1 / 0 - # The exception is raised when the future is yielded - # (or equivalently when its result method is called), - # not when the function itself is called). - future = f() - with self.assertRaises(ZeroDivisionError): - yield future - self.finished = True - - @gen_test - def test_async_raise(self): - @gen.coroutine - def f(): - yield gen.Task(self.io_loop.add_callback) - 1 / 0 - future = f() - with self.assertRaises(ZeroDivisionError): - yield future - self.finished = True - - @gen_test - def test_pass_callback(self): - @gen.coroutine - def f(): - raise gen.Return(42) - result = yield gen.Task(f) - self.assertEqual(result, 42) - self.finished = True - - @gen_test - def test_replace_yieldpoint_exception(self): - # Test exception handling: a coroutine can catch one exception - # raised by a yield point and raise a different one. - @gen.coroutine - def f1(): - 1 / 0 - - @gen.coroutine - def f2(): - try: - yield f1() - except ZeroDivisionError: - raise KeyError() - - future = f2() - with self.assertRaises(KeyError): - yield future - self.finished = True - - @gen_test - def test_swallow_yieldpoint_exception(self): - # Test exception handling: a coroutine can catch an exception - # raised by a yield point and not raise a different one. - @gen.coroutine - def f1(): - 1 / 0 - - @gen.coroutine - def f2(): - try: - yield f1() - except ZeroDivisionError: - raise gen.Return(42) - - result = yield f2() - self.assertEqual(result, 42) - self.finished = True - - @gen_test - def test_replace_context_exception(self): - # Test exception handling: exceptions thrown into the stack context - # can be caught and replaced. - @gen.coroutine - def f2(): - self.io_loop.add_callback(lambda: 1 / 0) - try: - yield gen.Task(self.io_loop.add_timeout, - self.io_loop.time() + 10) - except ZeroDivisionError: - raise KeyError() - - future = f2() - with self.assertRaises(KeyError): - yield future - self.finished = True - - @gen_test - def test_swallow_context_exception(self): - # Test exception handling: exceptions thrown into the stack context - # can be caught and ignored. - @gen.coroutine - def f2(): - self.io_loop.add_callback(lambda: 1 / 0) - try: - yield gen.Task(self.io_loop.add_timeout, - self.io_loop.time() + 10) - except ZeroDivisionError: - raise gen.Return(42) - - result = yield f2() - self.assertEqual(result, 42) - self.finished = True - - -class GenSequenceHandler(RequestHandler): - @asynchronous - @gen.engine - def get(self): - self.io_loop = self.request.connection.stream.io_loop - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.write("1") - self.io_loop.add_callback((yield gen.Callback("k2"))) - yield gen.Wait("k2") - self.write("2") - # reuse an old key - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.finish("3") - - -class GenCoroutineSequenceHandler(RequestHandler): - @gen.coroutine - def get(self): - self.io_loop = self.request.connection.stream.io_loop - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.write("1") - self.io_loop.add_callback((yield gen.Callback("k2"))) - yield gen.Wait("k2") - self.write("2") - # reuse an old key - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.finish("3") - - -class GenCoroutineUnfinishedSequenceHandler(RequestHandler): - @asynchronous - @gen.coroutine - def get(self): - self.io_loop = self.request.connection.stream.io_loop - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - self.write("1") - self.io_loop.add_callback((yield gen.Callback("k2"))) - yield gen.Wait("k2") - self.write("2") - # reuse an old key - self.io_loop.add_callback((yield gen.Callback("k1"))) - yield gen.Wait("k1") - # just write, don't finish - self.write("3") - - -class GenTaskHandler(RequestHandler): - @asynchronous - @gen.engine - def get(self): - io_loop = self.request.connection.stream.io_loop - client = AsyncHTTPClient(io_loop=io_loop) - response = yield gen.Task(client.fetch, self.get_argument('url')) - response.rethrow() - self.finish(b"got response: " + response.body) - - -class GenExceptionHandler(RequestHandler): - @asynchronous - @gen.engine - def get(self): - # This test depends on the order of the two decorators. - io_loop = self.request.connection.stream.io_loop - yield gen.Task(io_loop.add_callback) - raise Exception("oops") - - -class GenCoroutineExceptionHandler(RequestHandler): - @asynchronous - @gen.coroutine - def get(self): - # This test depends on the order of the two decorators. - io_loop = self.request.connection.stream.io_loop - yield gen.Task(io_loop.add_callback) - raise Exception("oops") - - -class GenYieldExceptionHandler(RequestHandler): - @asynchronous - @gen.engine - def get(self): - io_loop = self.request.connection.stream.io_loop - # Test the interaction of the two stack_contexts. - - def fail_task(callback): - io_loop.add_callback(lambda: 1 / 0) - try: - yield gen.Task(fail_task) - raise Exception("did not get expected exception") - except ZeroDivisionError: - self.finish('ok') - - -class UndecoratedCoroutinesHandler(RequestHandler): - @gen.coroutine - def prepare(self): - self.chunks = [] - yield gen.Task(IOLoop.current().add_callback) - self.chunks.append('1') - - @gen.coroutine - def get(self): - self.chunks.append('2') - yield gen.Task(IOLoop.current().add_callback) - self.chunks.append('3') - yield gen.Task(IOLoop.current().add_callback) - self.write(''.join(self.chunks)) - - -class AsyncPrepareErrorHandler(RequestHandler): - @gen.coroutine - def prepare(self): - yield gen.Task(IOLoop.current().add_callback) - raise HTTPError(403) - - def get(self): - self.finish('ok') - - -class GenWebTest(AsyncHTTPTestCase): - def get_app(self): - return Application([ - ('/sequence', GenSequenceHandler), - ('/coroutine_sequence', GenCoroutineSequenceHandler), - ('/coroutine_unfinished_sequence', - GenCoroutineUnfinishedSequenceHandler), - ('/task', GenTaskHandler), - ('/exception', GenExceptionHandler), - ('/coroutine_exception', GenCoroutineExceptionHandler), - ('/yield_exception', GenYieldExceptionHandler), - ('/undecorated_coroutine', UndecoratedCoroutinesHandler), - ('/async_prepare_error', AsyncPrepareErrorHandler), - ]) - - def test_sequence_handler(self): - response = self.fetch('/sequence') - self.assertEqual(response.body, b"123") - - def test_coroutine_sequence_handler(self): - response = self.fetch('/coroutine_sequence') - self.assertEqual(response.body, b"123") - - def test_coroutine_unfinished_sequence_handler(self): - response = self.fetch('/coroutine_unfinished_sequence') - self.assertEqual(response.body, b"123") - - def test_task_handler(self): - response = self.fetch('/task?url=%s' % url_escape(self.get_url('/sequence'))) - self.assertEqual(response.body, b"got response: 123") - - def test_exception_handler(self): - # Make sure we get an error and not a timeout - with ExpectLog(app_log, "Uncaught exception GET /exception"): - response = self.fetch('/exception') - self.assertEqual(500, response.code) - - def test_coroutine_exception_handler(self): - # Make sure we get an error and not a timeout - with ExpectLog(app_log, "Uncaught exception GET /coroutine_exception"): - response = self.fetch('/coroutine_exception') - self.assertEqual(500, response.code) - - def test_yield_exception_handler(self): - response = self.fetch('/yield_exception') - self.assertEqual(response.body, b'ok') - - def test_undecorated_coroutines(self): - response = self.fetch('/undecorated_coroutine') - self.assertEqual(response.body, b'123') - - def test_async_prepare_error_handler(self): - response = self.fetch('/async_prepare_error') - self.assertEqual(response.code, 403) - -if __name__ == '__main__': - unittest.main() diff --git a/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo b/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo deleted file mode 100644 index 089f6c7a..00000000 Binary files a/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.mo and /dev/null differ diff --git a/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po b/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po deleted file mode 100644 index 732ee6da..00000000 --- a/vendor/tornado/test/gettext_translations/fr_FR/LC_MESSAGES/tornado_test.po +++ /dev/null @@ -1,22 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-06-14 01:10-0700\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: extract_me.py:1 -msgid "school" -msgstr "école" diff --git a/vendor/tornado/test/httpclient_test.py b/vendor/tornado/test/httpclient_test.py deleted file mode 100644 index d34d8a82..00000000 --- a/vendor/tornado/test/httpclient_test.py +++ /dev/null @@ -1,471 +0,0 @@ -#!/usr/bin/env python - -from __future__ import absolute_import, division, print_function, with_statement - -import base64 -import binascii -from contextlib import closing -import functools -import sys -import threading - -from tornado.escape import utf8 -from tornado.httpclient import HTTPRequest, HTTPResponse, _RequestProxy, HTTPError, HTTPClient -from tornado.httpserver import HTTPServer -from tornado.ioloop import IOLoop -from tornado.iostream import IOStream -from tornado.log import gen_log -from tornado import netutil -from tornado.stack_context import ExceptionStackContext, NullContext -from tornado.testing import AsyncHTTPTestCase, bind_unused_port, gen_test, ExpectLog -from tornado.test.util import unittest -from tornado.util import u, bytes_type -from tornado.web import Application, RequestHandler, url - -try: - from io import BytesIO # python 3 -except ImportError: - from cStringIO import StringIO as BytesIO - - -class HelloWorldHandler(RequestHandler): - def get(self): - name = self.get_argument("name", "world") - self.set_header("Content-Type", "text/plain") - self.finish("Hello %s!" % name) - - -class PostHandler(RequestHandler): - def post(self): - self.finish("Post arg1: %s, arg2: %s" % ( - self.get_argument("arg1"), self.get_argument("arg2"))) - - -class ChunkHandler(RequestHandler): - def get(self): - self.write("asdf") - self.flush() - self.write("qwer") - - -class AuthHandler(RequestHandler): - def get(self): - self.finish(self.request.headers["Authorization"]) - - -class CountdownHandler(RequestHandler): - def get(self, count): - count = int(count) - if count > 0: - self.redirect(self.reverse_url("countdown", count - 1)) - else: - self.write("Zero") - - -class EchoPostHandler(RequestHandler): - def post(self): - self.write(self.request.body) - - -class UserAgentHandler(RequestHandler): - def get(self): - self.write(self.request.headers.get('User-Agent', 'User agent not set')) - - -class ContentLength304Handler(RequestHandler): - def get(self): - self.set_status(304) - self.set_header('Content-Length', 42) - - def _clear_headers_for_304(self): - # Tornado strips content-length from 304 responses, but here we - # want to simulate servers that include the headers anyway. - pass - - -class AllMethodsHandler(RequestHandler): - SUPPORTED_METHODS = RequestHandler.SUPPORTED_METHODS + ('OTHER',) - - def method(self): - self.write(self.request.method) - - get = post = put = delete = options = patch = other = method - -# These tests end up getting run redundantly: once here with the default -# HTTPClient implementation, and then again in each implementation's own -# test suite. - - -class HTTPClientCommonTestCase(AsyncHTTPTestCase): - def get_app(self): - return Application([ - url("/hello", HelloWorldHandler), - url("/post", PostHandler), - url("/chunk", ChunkHandler), - url("/auth", AuthHandler), - url("/countdown/([0-9]+)", CountdownHandler, name="countdown"), - url("/echopost", EchoPostHandler), - url("/user_agent", UserAgentHandler), - url("/304_with_content_length", ContentLength304Handler), - url("/all_methods", AllMethodsHandler), - ], gzip=True) - - def test_hello_world(self): - response = self.fetch("/hello") - self.assertEqual(response.code, 200) - self.assertEqual(response.headers["Content-Type"], "text/plain") - self.assertEqual(response.body, b"Hello world!") - self.assertEqual(int(response.request_time), 0) - - response = self.fetch("/hello?name=Ben") - self.assertEqual(response.body, b"Hello Ben!") - - def test_streaming_callback(self): - # streaming_callback is also tested in test_chunked - chunks = [] - response = self.fetch("/hello", - streaming_callback=chunks.append) - # with streaming_callback, data goes to the callback and not response.body - self.assertEqual(chunks, [b"Hello world!"]) - self.assertFalse(response.body) - - def test_post(self): - response = self.fetch("/post", method="POST", - body="arg1=foo&arg2=bar") - self.assertEqual(response.code, 200) - self.assertEqual(response.body, b"Post arg1: foo, arg2: bar") - - def test_chunked(self): - response = self.fetch("/chunk") - self.assertEqual(response.body, b"asdfqwer") - - chunks = [] - response = self.fetch("/chunk", - streaming_callback=chunks.append) - self.assertEqual(chunks, [b"asdf", b"qwer"]) - self.assertFalse(response.body) - - def test_chunked_close(self): - # test case in which chunks spread read-callback processing - # over several ioloop iterations, but the connection is already closed. - sock, port = bind_unused_port() - with closing(sock): - def write_response(stream, request_data): - stream.write(b"""\ -HTTP/1.1 200 OK -Transfer-Encoding: chunked - -1 -1 -1 -2 -0 - -""".replace(b"\n", b"\r\n"), callback=stream.close) - - def accept_callback(conn, address): - # fake an HTTP server using chunked encoding where the final chunks - # and connection close all happen at once - stream = IOStream(conn, io_loop=self.io_loop) - stream.read_until(b"\r\n\r\n", - functools.partial(write_response, stream)) - netutil.add_accept_handler(sock, accept_callback, self.io_loop) - self.http_client.fetch("http://127.0.0.1:%d/" % port, self.stop) - resp = self.wait() - resp.rethrow() - self.assertEqual(resp.body, b"12") - self.io_loop.remove_handler(sock.fileno()) - - def test_streaming_stack_context(self): - chunks = [] - exc_info = [] - - def error_handler(typ, value, tb): - exc_info.append((typ, value, tb)) - return True - - def streaming_cb(chunk): - chunks.append(chunk) - if chunk == b'qwer': - 1 / 0 - - with ExceptionStackContext(error_handler): - self.fetch('/chunk', streaming_callback=streaming_cb) - - self.assertEqual(chunks, [b'asdf', b'qwer']) - self.assertEqual(1, len(exc_info)) - self.assertIs(exc_info[0][0], ZeroDivisionError) - - def test_basic_auth(self): - self.assertEqual(self.fetch("/auth", auth_username="Aladdin", - auth_password="open sesame").body, - b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==") - - def test_basic_auth_explicit_mode(self): - self.assertEqual(self.fetch("/auth", auth_username="Aladdin", - auth_password="open sesame", - auth_mode="basic").body, - b"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==") - - def test_unsupported_auth_mode(self): - # curl and simple clients handle errors a bit differently; the - # important thing is that they don't fall back to basic auth - # on an unknown mode. - with ExpectLog(gen_log, "uncaught exception", required=False): - with self.assertRaises((ValueError, HTTPError)): - response = self.fetch("/auth", auth_username="Aladdin", - auth_password="open sesame", - auth_mode="asdf") - response.rethrow() - - def test_follow_redirect(self): - response = self.fetch("/countdown/2", follow_redirects=False) - self.assertEqual(302, response.code) - self.assertTrue(response.headers["Location"].endswith("/countdown/1")) - - response = self.fetch("/countdown/2") - self.assertEqual(200, response.code) - self.assertTrue(response.effective_url.endswith("/countdown/0")) - self.assertEqual(b"Zero", response.body) - - def test_credentials_in_url(self): - url = self.get_url("/auth").replace("http://", "http://me:secret@") - self.http_client.fetch(url, self.stop) - response = self.wait() - self.assertEqual(b"Basic " + base64.b64encode(b"me:secret"), - response.body) - - def test_body_encoding(self): - unicode_body = u("\xe9") - byte_body = binascii.a2b_hex(b"e9") - - # unicode string in body gets converted to utf8 - response = self.fetch("/echopost", method="POST", body=unicode_body, - headers={"Content-Type": "application/blah"}) - self.assertEqual(response.headers["Content-Length"], "2") - self.assertEqual(response.body, utf8(unicode_body)) - - # byte strings pass through directly - response = self.fetch("/echopost", method="POST", - body=byte_body, - headers={"Content-Type": "application/blah"}) - self.assertEqual(response.headers["Content-Length"], "1") - self.assertEqual(response.body, byte_body) - - # Mixing unicode in headers and byte string bodies shouldn't - # break anything - response = self.fetch("/echopost", method="POST", body=byte_body, - headers={"Content-Type": "application/blah"}, - user_agent=u("foo")) - self.assertEqual(response.headers["Content-Length"], "1") - self.assertEqual(response.body, byte_body) - - def test_types(self): - response = self.fetch("/hello") - self.assertEqual(type(response.body), bytes_type) - self.assertEqual(type(response.headers["Content-Type"]), str) - self.assertEqual(type(response.code), int) - self.assertEqual(type(response.effective_url), str) - - def test_header_callback(self): - first_line = [] - headers = {} - chunks = [] - - def header_callback(header_line): - if header_line.startswith('HTTP/'): - first_line.append(header_line) - elif header_line != '\r\n': - k, v = header_line.split(':', 1) - headers[k] = v.strip() - - def streaming_callback(chunk): - # All header callbacks are run before any streaming callbacks, - # so the header data is available to process the data as it - # comes in. - self.assertEqual(headers['Content-Type'], 'text/html; charset=UTF-8') - chunks.append(chunk) - - self.fetch('/chunk', header_callback=header_callback, - streaming_callback=streaming_callback) - self.assertEqual(len(first_line), 1) - self.assertRegexpMatches(first_line[0], 'HTTP/1.[01] 200 OK\r\n') - self.assertEqual(chunks, [b'asdf', b'qwer']) - - def test_header_callback_stack_context(self): - exc_info = [] - - def error_handler(typ, value, tb): - exc_info.append((typ, value, tb)) - return True - - def header_callback(header_line): - if header_line.startswith('Content-Type:'): - 1 / 0 - - with ExceptionStackContext(error_handler): - self.fetch('/chunk', header_callback=header_callback) - self.assertEqual(len(exc_info), 1) - self.assertIs(exc_info[0][0], ZeroDivisionError) - - def test_configure_defaults(self): - defaults = dict(user_agent='TestDefaultUserAgent') - # Construct a new instance of the configured client class - client = self.http_client.__class__(self.io_loop, force_instance=True, - defaults=defaults) - client.fetch(self.get_url('/user_agent'), callback=self.stop) - response = self.wait() - self.assertEqual(response.body, b'TestDefaultUserAgent') - client.close() - - def test_304_with_content_length(self): - # According to the spec 304 responses SHOULD NOT include - # Content-Length or other entity headers, but some servers do it - # anyway. - # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5 - response = self.fetch('/304_with_content_length') - self.assertEqual(response.code, 304) - self.assertEqual(response.headers['Content-Length'], '42') - - def test_final_callback_stack_context(self): - # The final callback should be run outside of the httpclient's - # stack_context. We want to ensure that there is not stack_context - # between the user's callback and the IOLoop, so monkey-patch - # IOLoop.handle_callback_exception and disable the test harness's - # context with a NullContext. - # Note that this does not apply to secondary callbacks (header - # and streaming_callback), as errors there must be seen as errors - # by the http client so it can clean up the connection. - exc_info = [] - - def handle_callback_exception(callback): - exc_info.append(sys.exc_info()) - self.stop() - self.io_loop.handle_callback_exception = handle_callback_exception - with NullContext(): - self.http_client.fetch(self.get_url('/hello'), - lambda response: 1 / 0) - self.wait() - self.assertEqual(exc_info[0][0], ZeroDivisionError) - - @gen_test - def test_future_interface(self): - response = yield self.http_client.fetch(self.get_url('/hello')) - self.assertEqual(response.body, b'Hello world!') - - @gen_test - def test_future_http_error(self): - try: - yield self.http_client.fetch(self.get_url('/notfound')) - except HTTPError as e: - self.assertEqual(e.code, 404) - self.assertEqual(e.response.code, 404) - - @gen_test - def test_reuse_request_from_response(self): - # The response.request attribute should be an HTTPRequest, not - # a _RequestProxy. - # This test uses self.http_client.fetch because self.fetch calls - # self.get_url on the input unconditionally. - url = self.get_url('/hello') - response = yield self.http_client.fetch(url) - self.assertEqual(response.request.url, url) - self.assertTrue(isinstance(response.request, HTTPRequest)) - response2 = yield self.http_client.fetch(response.request) - self.assertEqual(response2.body, b'Hello world!') - - def test_all_methods(self): - for method in ['GET', 'DELETE', 'OPTIONS']: - response = self.fetch('/all_methods', method=method) - self.assertEqual(response.body, utf8(method)) - for method in ['POST', 'PUT', 'PATCH']: - response = self.fetch('/all_methods', method=method, body=b'') - self.assertEqual(response.body, utf8(method)) - response = self.fetch('/all_methods', method='HEAD') - self.assertEqual(response.body, b'') - response = self.fetch('/all_methods', method='OTHER', - allow_nonstandard_methods=True) - self.assertEqual(response.body, b'OTHER') - - -class RequestProxyTest(unittest.TestCase): - def test_request_set(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/', - user_agent='foo'), - dict()) - self.assertEqual(proxy.user_agent, 'foo') - - def test_default_set(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/'), - dict(network_interface='foo')) - self.assertEqual(proxy.network_interface, 'foo') - - def test_both_set(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/', - proxy_host='foo'), - dict(proxy_host='bar')) - self.assertEqual(proxy.proxy_host, 'foo') - - def test_neither_set(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/'), - dict()) - self.assertIs(proxy.auth_username, None) - - def test_bad_attribute(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/'), - dict()) - with self.assertRaises(AttributeError): - proxy.foo - - def test_defaults_none(self): - proxy = _RequestProxy(HTTPRequest('http://example.com/'), None) - self.assertIs(proxy.auth_username, None) - - -class HTTPResponseTestCase(unittest.TestCase): - def test_str(self): - response = HTTPResponse(HTTPRequest('http://example.com'), - 200, headers={}, buffer=BytesIO()) - s = str(response) - self.assertTrue(s.startswith('HTTPResponse(')) - self.assertIn('code=200', s) - - -class SyncHTTPClientTest(unittest.TestCase): - def setUp(self): - if IOLoop.configured_class().__name__ == 'TwistedIOLoop': - # TwistedIOLoop only supports the global reactor, so we can't have - # separate IOLoops for client and server threads. - raise unittest.SkipTest( - 'Sync HTTPClient not compatible with TwistedIOLoop') - self.server_ioloop = IOLoop() - - sock, self.port = bind_unused_port() - app = Application([('/', HelloWorldHandler)]) - server = HTTPServer(app, io_loop=self.server_ioloop) - server.add_socket(sock) - - self.server_thread = threading.Thread(target=self.server_ioloop.start) - self.server_thread.start() - - self.http_client = HTTPClient() - - def tearDown(self): - self.server_ioloop.add_callback(self.server_ioloop.stop) - self.server_thread.join() - self.http_client.close() - self.server_ioloop.close(all_fds=True) - - def get_url(self, path): - return 'http://localhost:%d%s' % (self.port, path) - - def test_sync_client(self): - response = self.http_client.fetch(self.get_url('/')) - self.assertEqual(b'Hello world!', response.body) - - def test_sync_client_error(self): - # Synchronous HTTPClient raises errors directly; no need for - # response.rethrow() - with self.assertRaises(HTTPError) as assertion: - self.http_client.fetch(self.get_url('/notfound')) - self.assertEqual(assertion.exception.code, 404) diff --git a/vendor/tornado/test/httpserver_test.py b/vendor/tornado/test/httpserver_test.py deleted file mode 100644 index d9038540..00000000 --- a/vendor/tornado/test/httpserver_test.py +++ /dev/null @@ -1,661 +0,0 @@ -#!/usr/bin/env python - - -from __future__ import absolute_import, division, print_function, with_statement -from tornado import httpclient, simple_httpclient, netutil -from tornado.escape import json_decode, utf8, _unicode, recursive_unicode, native_str -from tornado.httpserver import HTTPServer -from tornado.httputil import HTTPHeaders -from tornado.iostream import IOStream -from tornado.log import gen_log -from tornado.netutil import ssl_options_to_context, Resolver -from tornado.simple_httpclient import SimpleAsyncHTTPClient -from tornado.testing import AsyncHTTPTestCase, AsyncHTTPSTestCase, AsyncTestCase, ExpectLog -from tornado.test.util import unittest -from tornado.util import u, bytes_type -from tornado.web import Application, RequestHandler, asynchronous -from contextlib import closing -import datetime -import os -import shutil -import socket -import ssl -import sys -import tempfile - - -class HandlerBaseTestCase(AsyncHTTPTestCase): - def get_app(self): - return Application([('/', self.__class__.Handler)]) - - def fetch_json(self, *args, **kwargs): - response = self.fetch(*args, **kwargs) - response.rethrow() - return json_decode(response.body) - - -class HelloWorldRequestHandler(RequestHandler): - def initialize(self, protocol="http"): - self.expected_protocol = protocol - - def get(self): - if self.request.protocol != self.expected_protocol: - raise Exception("unexpected protocol") - self.finish("Hello world") - - def post(self): - self.finish("Got %d bytes in POST" % len(self.request.body)) - - -# In pre-1.0 versions of openssl, SSLv23 clients always send SSLv2 -# ClientHello messages, which are rejected by SSLv3 and TLSv1 -# servers. Note that while the OPENSSL_VERSION_INFO was formally -# introduced in python3.2, it was present but undocumented in -# python 2.7 -skipIfOldSSL = unittest.skipIf( - getattr(ssl, 'OPENSSL_VERSION_INFO', (0, 0)) < (1, 0), - "old version of ssl module and/or openssl") - - -class BaseSSLTest(AsyncHTTPSTestCase): - def get_app(self): - return Application([('/', HelloWorldRequestHandler, - dict(protocol="https"))]) - - -class SSLTestMixin(object): - def get_ssl_options(self): - return dict(ssl_version=self.get_ssl_version(), - **AsyncHTTPSTestCase.get_ssl_options()) - - def get_ssl_version(self): - raise NotImplementedError() - - def test_ssl(self): - response = self.fetch('/') - self.assertEqual(response.body, b"Hello world") - - def test_large_post(self): - response = self.fetch('/', - method='POST', - body='A' * 5000) - self.assertEqual(response.body, b"Got 5000 bytes in POST") - - def test_non_ssl_request(self): - # Make sure the server closes the connection when it gets a non-ssl - # connection, rather than waiting for a timeout or otherwise - # misbehaving. - with ExpectLog(gen_log, '(SSL Error|uncaught exception)'): - self.http_client.fetch(self.get_url("/").replace('https:', 'http:'), - self.stop, - request_timeout=3600, - connect_timeout=3600) - response = self.wait() - self.assertEqual(response.code, 599) - -# Python's SSL implementation differs significantly between versions. -# For example, SSLv3 and TLSv1 throw an exception if you try to read -# from the socket before the handshake is complete, but the default -# of SSLv23 allows it. - - -class SSLv23Test(BaseSSLTest, SSLTestMixin): - def get_ssl_version(self): - return ssl.PROTOCOL_SSLv23 - - -@skipIfOldSSL -class SSLv3Test(BaseSSLTest, SSLTestMixin): - def get_ssl_version(self): - return ssl.PROTOCOL_SSLv3 - - -@skipIfOldSSL -class TLSv1Test(BaseSSLTest, SSLTestMixin): - def get_ssl_version(self): - return ssl.PROTOCOL_TLSv1 - - -@unittest.skipIf(not hasattr(ssl, 'SSLContext'), 'ssl.SSLContext not present') -class SSLContextTest(BaseSSLTest, SSLTestMixin): - def get_ssl_options(self): - context = ssl_options_to_context( - AsyncHTTPSTestCase.get_ssl_options(self)) - assert isinstance(context, ssl.SSLContext) - return context - - -class BadSSLOptionsTest(unittest.TestCase): - def test_missing_arguments(self): - application = Application() - self.assertRaises(KeyError, HTTPServer, application, ssl_options={ - "keyfile": "/__missing__.crt", - }) - - def test_missing_key(self): - """A missing SSL key should cause an immediate exception.""" - - application = Application() - module_dir = os.path.dirname(__file__) - existing_certificate = os.path.join(module_dir, 'test.crt') - - self.assertRaises(ValueError, HTTPServer, application, ssl_options={ - "certfile": "/__mising__.crt", - }) - self.assertRaises(ValueError, HTTPServer, application, ssl_options={ - "certfile": existing_certificate, - "keyfile": "/__missing__.key" - }) - - # This actually works because both files exist - HTTPServer(application, ssl_options={ - "certfile": existing_certificate, - "keyfile": existing_certificate - }) - - -class MultipartTestHandler(RequestHandler): - def post(self): - self.finish({"header": self.request.headers["X-Header-Encoding-Test"], - "argument": self.get_argument("argument"), - "filename": self.request.files["files"][0].filename, - "filebody": _unicode(self.request.files["files"][0]["body"]), - }) - - -class RawRequestHTTPConnection(simple_httpclient._HTTPConnection): - def set_request(self, request): - self.__next_request = request - - def _on_connect(self): - self.stream.write(self.__next_request) - self.__next_request = None - self.stream.read_until(b"\r\n\r\n", self._on_headers) - -# This test is also called from wsgi_test - - -class HTTPConnectionTest(AsyncHTTPTestCase): - def get_handlers(self): - return [("/multipart", MultipartTestHandler), - ("/hello", HelloWorldRequestHandler)] - - def get_app(self): - return Application(self.get_handlers()) - - def raw_fetch(self, headers, body): - with closing(Resolver(io_loop=self.io_loop)) as resolver: - with closing(SimpleAsyncHTTPClient(self.io_loop, - resolver=resolver)) as client: - conn = RawRequestHTTPConnection( - self.io_loop, client, - httpclient._RequestProxy( - httpclient.HTTPRequest(self.get_url("/")), - dict(httpclient.HTTPRequest._DEFAULTS)), - None, self.stop, - 1024 * 1024, resolver) - conn.set_request( - b"\r\n".join(headers + - [utf8("Content-Length: %d\r\n" % len(body))]) + - b"\r\n" + body) - response = self.wait() - response.rethrow() - return response - - def test_multipart_form(self): - # Encodings here are tricky: Headers are latin1, bodies can be - # anything (we use utf8 by default). - response = self.raw_fetch([ - b"POST /multipart HTTP/1.0", - b"Content-Type: multipart/form-data; boundary=1234567890", - b"X-Header-encoding-test: \xe9", - ], - b"\r\n".join([ - b"Content-Disposition: form-data; name=argument", - b"", - u("\u00e1").encode("utf-8"), - b"--1234567890", - u('Content-Disposition: form-data; name="files"; filename="\u00f3"').encode("utf8"), - b"", - u("\u00fa").encode("utf-8"), - b"--1234567890--", - b"", - ])) - data = json_decode(response.body) - self.assertEqual(u("\u00e9"), data["header"]) - self.assertEqual(u("\u00e1"), data["argument"]) - self.assertEqual(u("\u00f3"), data["filename"]) - self.assertEqual(u("\u00fa"), data["filebody"]) - - def test_100_continue(self): - # Run through a 100-continue interaction by hand: - # When given Expect: 100-continue, we get a 100 response after the - # headers, and then the real response after the body. - stream = IOStream(socket.socket(), io_loop=self.io_loop) - stream.connect(("localhost", self.get_http_port()), callback=self.stop) - self.wait() - stream.write(b"\r\n".join([b"POST /hello HTTP/1.1", - b"Content-Length: 1024", - b"Expect: 100-continue", - b"Connection: close", - b"\r\n"]), callback=self.stop) - self.wait() - stream.read_until(b"\r\n\r\n", self.stop) - data = self.wait() - self.assertTrue(data.startswith(b"HTTP/1.1 100 "), data) - stream.write(b"a" * 1024) - stream.read_until(b"\r\n", self.stop) - first_line = self.wait() - self.assertTrue(first_line.startswith(b"HTTP/1.1 200"), first_line) - stream.read_until(b"\r\n\r\n", self.stop) - header_data = self.wait() - headers = HTTPHeaders.parse(native_str(header_data.decode('latin1'))) - stream.read_bytes(int(headers["Content-Length"]), self.stop) - body = self.wait() - self.assertEqual(body, b"Got 1024 bytes in POST") - stream.close() - - -class EchoHandler(RequestHandler): - def get(self): - self.write(recursive_unicode(self.request.arguments)) - - def post(self): - self.write(recursive_unicode(self.request.arguments)) - - -class TypeCheckHandler(RequestHandler): - def prepare(self): - self.errors = {} - fields = [ - ('method', str), - ('uri', str), - ('version', str), - ('remote_ip', str), - ('protocol', str), - ('host', str), - ('path', str), - ('query', str), - ] - for field, expected_type in fields: - self.check_type(field, getattr(self.request, field), expected_type) - - self.check_type('header_key', list(self.request.headers.keys())[0], str) - self.check_type('header_value', list(self.request.headers.values())[0], str) - - self.check_type('cookie_key', list(self.request.cookies.keys())[0], str) - self.check_type('cookie_value', list(self.request.cookies.values())[0].value, str) - # secure cookies - - self.check_type('arg_key', list(self.request.arguments.keys())[0], str) - self.check_type('arg_value', list(self.request.arguments.values())[0][0], bytes_type) - - def post(self): - self.check_type('body', self.request.body, bytes_type) - self.write(self.errors) - - def get(self): - self.write(self.errors) - - def check_type(self, name, obj, expected_type): - actual_type = type(obj) - if expected_type != actual_type: - self.errors[name] = "expected %s, got %s" % (expected_type, - actual_type) - - -class HTTPServerTest(AsyncHTTPTestCase): - def get_app(self): - return Application([("/echo", EchoHandler), - ("/typecheck", TypeCheckHandler), - ("//doubleslash", EchoHandler), - ]) - - def test_query_string_encoding(self): - response = self.fetch("/echo?foo=%C3%A9") - data = json_decode(response.body) - self.assertEqual(data, {u("foo"): [u("\u00e9")]}) - - def test_empty_query_string(self): - response = self.fetch("/echo?foo=&foo=") - data = json_decode(response.body) - self.assertEqual(data, {u("foo"): [u(""), u("")]}) - - def test_empty_post_parameters(self): - response = self.fetch("/echo", method="POST", body="foo=&bar=") - data = json_decode(response.body) - self.assertEqual(data, {u("foo"): [u("")], u("bar"): [u("")]}) - - def test_types(self): - headers = {"Cookie": "foo=bar"} - response = self.fetch("/typecheck?foo=bar", headers=headers) - data = json_decode(response.body) - self.assertEqual(data, {}) - - response = self.fetch("/typecheck", method="POST", body="foo=bar", headers=headers) - data = json_decode(response.body) - self.assertEqual(data, {}) - - def test_double_slash(self): - # urlparse.urlsplit (which tornado.httpserver used to use - # incorrectly) would parse paths beginning with "//" as - # protocol-relative urls. - response = self.fetch("//doubleslash") - self.assertEqual(200, response.code) - self.assertEqual(json_decode(response.body), {}) - - -class HTTPServerRawTest(AsyncHTTPTestCase): - def get_app(self): - return Application([ - ('/echo', EchoHandler), - ]) - - def setUp(self): - super(HTTPServerRawTest, self).setUp() - self.stream = IOStream(socket.socket()) - self.stream.connect(('localhost', self.get_http_port()), self.stop) - self.wait() - - def tearDown(self): - self.stream.close() - super(HTTPServerRawTest, self).tearDown() - - def test_empty_request(self): - self.stream.close() - self.io_loop.add_timeout(datetime.timedelta(seconds=0.001), self.stop) - self.wait() - - def test_malformed_first_line(self): - with ExpectLog(gen_log, '.*Malformed HTTP request line'): - self.stream.write(b'asdf\r\n\r\n') - # TODO: need an async version of ExpectLog so we don't need - # hard-coded timeouts here. - self.io_loop.add_timeout(datetime.timedelta(seconds=0.01), - self.stop) - self.wait() - - def test_malformed_headers(self): - with ExpectLog(gen_log, '.*Malformed HTTP headers'): - self.stream.write(b'GET / HTTP/1.0\r\nasdf\r\n\r\n') - self.io_loop.add_timeout(datetime.timedelta(seconds=0.01), - self.stop) - self.wait() - - -class XHeaderTest(HandlerBaseTestCase): - class Handler(RequestHandler): - def get(self): - self.write(dict(remote_ip=self.request.remote_ip, - remote_protocol=self.request.protocol)) - - def get_httpserver_options(self): - return dict(xheaders=True) - - def test_ip_headers(self): - self.assertEqual(self.fetch_json("/")["remote_ip"], "127.0.0.1") - - valid_ipv4 = {"X-Real-IP": "4.4.4.4"} - self.assertEqual( - self.fetch_json("/", headers=valid_ipv4)["remote_ip"], - "4.4.4.4") - - valid_ipv4_list = {"X-Forwarded-For": "127.0.0.1, 4.4.4.4"} - self.assertEqual( - self.fetch_json("/", headers=valid_ipv4_list)["remote_ip"], - "4.4.4.4") - - valid_ipv6 = {"X-Real-IP": "2620:0:1cfe:face:b00c::3"} - self.assertEqual( - self.fetch_json("/", headers=valid_ipv6)["remote_ip"], - "2620:0:1cfe:face:b00c::3") - - valid_ipv6_list = {"X-Forwarded-For": "::1, 2620:0:1cfe:face:b00c::3"} - self.assertEqual( - self.fetch_json("/", headers=valid_ipv6_list)["remote_ip"], - "2620:0:1cfe:face:b00c::3") - - invalid_chars = {"X-Real-IP": "4.4.4.4 - - - + + + + + @@ -64,6 +69,21 @@ FOOTER = u'''\ friendly Werkzeug powered traceback interpreter.
    + +
    +
    +

    Console Locked

    +

    + The console is locked and needs to be unlocked by entering the PIN. + You can find the PIN printed out on the standard output of your + shell that runs the server. +

    +

    PIN: + + +

    +
    +
    ''' @@ -124,12 +144,10 @@ FRAME_HTML = u'''\

    File "%(filename)s", line %(lineno)s, in %(function_name)s

    -
    %(current_line)s
    +
    %(lines)s
    ''' -SOURCE_TABLE_HTML = u'%s
    ' - SOURCE_LINE_HTML = u'''\ %(lineno)s @@ -138,13 +156,14 @@ SOURCE_LINE_HTML = u'''\ ''' -def render_console_html(secret): +def render_console_html(secret, evalex_trusted=True): return CONSOLE_HTML % { 'evalex': 'true', + 'evalex_trusted': evalex_trusted and 'true' or 'false', 'console': 'true', 'title': 'Console', 'secret': secret, - 'traceback_id': -1 + 'traceback_id': -1 } @@ -269,7 +288,7 @@ class Traceback(object): logfile = sys.stderr tb = self.plaintext.rstrip() + u'\n' if PY2: - tb.encode('utf-8', 'replace') + tb = tb.encode('utf-8', 'replace') logfile.write(tb) def paste(self): @@ -327,17 +346,19 @@ class Traceback(object): 'description': description_wrapper % escape(self.exception) } - def render_full(self, evalex=False, secret=None): + def render_full(self, evalex=False, secret=None, + evalex_trusted=True): """Render the Full HTML page with the traceback info.""" exc = escape(self.exception) return PAGE_HTML % { 'evalex': evalex and 'true' or 'false', + 'evalex_trusted': evalex_trusted and 'true' or 'false', 'console': 'false', 'title': exc, 'exception': exc, 'exception_type': escape(self.exception_type), 'summary': self.render_summary(include_title=False), - 'plaintext': self.plaintext, + 'plaintext': escape(self.plaintext), 'plaintext_cs': re.sub('-{2,}', '-', self.plaintext), 'traceback_id': self.id, 'secret': secret @@ -363,6 +384,7 @@ class Traceback(object): class Frame(object): + """A single frame in a traceback.""" def __init__(self, exc_type, exc_value, tb): @@ -377,7 +399,7 @@ class Frame(object): # if it's a file on the file system resolve the real filename. if os.path.isfile(fn): fn = os.path.realpath(fn) - self.filename = fn + self.filename = to_unicode(fn, get_filesystem_encoding()) self.module = self.globals.get('__name__') self.loader = self.globals.get('__loader__') self.code = tb.tb_frame.f_code @@ -399,9 +421,29 @@ class Frame(object): 'filename': escape(self.filename), 'lineno': self.lineno, 'function_name': escape(self.function_name), - 'current_line': escape(self.current_line.strip()) + 'lines': self.render_line_context(), } + def render_line_context(self): + before, current, after = self.get_context_lines() + rv = [] + + def render_line(line, cls): + line = line.expandtabs().rstrip() + stripped_line = line.strip() + prefix = len(line) - len(stripped_line) + rv.append( + '
    %s%s
    ' % ( + cls, ' ' * prefix, escape(stripped_line) or ' ')) + + for line in before: + render_line(line, 'before') + render_line(current, 'current') + for line in after: + render_line(line, 'after') + + return '\n'.join(rv) + def get_annotated_lines(self): """Helper function that returns lines with extra information.""" lines = [Line(idx + 1, x) for idx, x in enumerate(self.sourcelines)] @@ -429,15 +471,10 @@ class Frame(object): return lines - def render_source(self): - """Render the sourcecode.""" - return SOURCE_TABLE_HTML % u'\n'.join(line.render() for line in - self.get_annotated_lines()) - def eval(self, code, mode='single'): """Evaluate code in the context of the frame.""" if isinstance(code, string_types): - if PY2 and isinstance(code, unicode): + if PY2 and isinstance(code, unicode): # noqa code = UTF8_COOKIE + code.encode('utf-8') code = compile(code, '', mode) return eval(code, self.globals, self.locals) @@ -460,7 +497,8 @@ class Frame(object): if source is None: try: - f = open(self.filename) + f = open(to_native(self.filename, get_filesystem_encoding()), + mode='rb') except IOError: return [] try: @@ -479,7 +517,7 @@ class Frame(object): source = source[3:] else: for idx, match in enumerate(_line_re.finditer(source)): - match = _line_re.search(match.group()) + match = _coding_re.search(match.group()) if match is not None: charset = match.group(1) break @@ -487,6 +525,7 @@ class Frame(object): break # on broken cookies we fall back to utf-8 too + charset = to_native(charset) try: codecs.lookup(charset) except LookupError: @@ -494,6 +533,15 @@ class Frame(object): return source.decode(charset, 'replace').splitlines() + def get_context_lines(self, context=5): + before = self.sourcelines[self.lineno - context - 1:self.lineno - 1] + past = self.sourcelines[self.lineno:self.lineno + context] + return ( + before, + self.current_line, + past, + ) + @property def current_line(self): try: diff --git a/vendor/werkzeug/exceptions.py b/vendor/werkzeug/exceptions.py index 72f2d325..392e6759 100644 --- a/vendor/werkzeug/exceptions.py +++ b/vendor/werkzeug/exceptions.py @@ -54,7 +54,7 @@ return e - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import sys @@ -66,13 +66,14 @@ werkzeug.exceptions = sys.modules[__name__] from werkzeug._internal import _get_environ from werkzeug._compat import iteritems, integer_types, text_type, \ - implements_to_string + implements_to_string from werkzeug.wrappers import Response @implements_to_string class HTTPException(Exception): + """ Baseclass for all HTTP exceptions. This exception can be called as WSGI application to render a default error page or you can catch the subclasses @@ -94,6 +95,7 @@ class HTTPException(Exception): also is a subclass of `BadRequest`. """ class newcls(cls, exception): + def __init__(self, arg=None, *args, **kwargs): cls.__init__(self, *args, **kwargs) exception.__init__(self, arg) @@ -161,6 +163,7 @@ class HTTPException(Exception): class BadRequest(HTTPException): + """*400* `Bad Request` Raise if the browser sends something to the application the application @@ -174,6 +177,7 @@ class BadRequest(HTTPException): class ClientDisconnected(BadRequest): + """Internal exception that is raised if Werkzeug detects a disconnected client. Since the client is already gone at that point attempting to send the error message to the client might not work and might ultimately @@ -181,7 +185,7 @@ class ClientDisconnected(BadRequest): it is silenced by default as far as Werkzeug is concerned. Since disconnections cannot be reliably detected and are unspecified - by WSGI to a large extend this might or might not be raised if a client + by WSGI to a large extent this might or might not be raised if a client is gone. .. versionadded:: 0.8 @@ -189,6 +193,7 @@ class ClientDisconnected(BadRequest): class SecurityError(BadRequest): + """Raised if something triggers a security error. This is otherwise exactly like a bad request error. @@ -196,7 +201,16 @@ class SecurityError(BadRequest): """ +class BadHost(BadRequest): + + """Raised if the submitted host is badly formatted. + + .. versionadded:: 0.11.2 + """ + + class Unauthorized(HTTPException): + """*401* `Unauthorized` Raise if the user is not authorized. Also used if you want to use HTTP @@ -212,6 +226,7 @@ class Unauthorized(HTTPException): class Forbidden(HTTPException): + """*403* `Forbidden` Raise if the user doesn't have the permission for the requested resource @@ -225,6 +240,7 @@ class Forbidden(HTTPException): class NotFound(HTTPException): + """*404* `Not Found` Raise if a resource does not exist and never existed. @@ -238,6 +254,7 @@ class NotFound(HTTPException): class MethodNotAllowed(HTTPException): + """*405* `Method Not Allowed` Raise if the server used a method the resource does not handle. For @@ -264,6 +281,7 @@ class MethodNotAllowed(HTTPException): class NotAcceptable(HTTPException): + """*406* `Not Acceptable` Raise if the server can't return any content conforming to the @@ -280,6 +298,7 @@ class NotAcceptable(HTTPException): class RequestTimeout(HTTPException): + """*408* `Request Timeout` Raise to signalize a timeout. @@ -292,6 +311,7 @@ class RequestTimeout(HTTPException): class Conflict(HTTPException): + """*409* `Conflict` Raise to signal that a request cannot be completed because it conflicts @@ -307,19 +327,21 @@ class Conflict(HTTPException): class Gone(HTTPException): + """*410* `Gone` Raise if a resource existed previously and went away without new location. """ code = 410 description = ( - 'The requested URL is no longer available on this server and ' - 'there is no forwarding address.

    If you followed a link ' - 'from a foreign page, please contact the author of this page.' + 'The requested URL is no longer available on this server and there ' + 'is no forwarding address. If you followed a link from a foreign ' + 'page, please contact the author of this page.' ) class LengthRequired(HTTPException): + """*411* `Length Required` Raise if the browser submitted data but no ``Content-Length`` header which @@ -333,6 +355,7 @@ class LengthRequired(HTTPException): class PreconditionFailed(HTTPException): + """*412* `Precondition Failed` Status code used in combination with ``If-Match``, ``If-None-Match``, or @@ -346,6 +369,7 @@ class PreconditionFailed(HTTPException): class RequestEntityTooLarge(HTTPException): + """*413* `Request Entity Too Large` The status code one should return if the data submitted exceeded a given @@ -358,6 +382,7 @@ class RequestEntityTooLarge(HTTPException): class RequestURITooLarge(HTTPException): + """*414* `Request URI Too Large` Like *413* but for too long URLs. @@ -370,6 +395,7 @@ class RequestURITooLarge(HTTPException): class UnsupportedMediaType(HTTPException): + """*415* `Unsupported Media Type` The status code returned if the server is unable to handle the media type @@ -383,6 +409,7 @@ class UnsupportedMediaType(HTTPException): class RequestedRangeNotSatisfiable(HTTPException): + """*416* `Requested Range Not Satisfiable` The client asked for a part of the file that lies beyond the end @@ -397,6 +424,7 @@ class RequestedRangeNotSatisfiable(HTTPException): class ExpectationFailed(HTTPException): + """*417* `Expectation Failed` The server cannot meet the requirements of the Expect request-header. @@ -410,6 +438,7 @@ class ExpectationFailed(HTTPException): class ImATeapot(HTTPException): + """*418* `I'm a teapot` The server should return this if it is a teapot and someone attempted @@ -424,6 +453,7 @@ class ImATeapot(HTTPException): class UnprocessableEntity(HTTPException): + """*422* `Unprocessable Entity` Used if the request is well formed, but the instructions are otherwise @@ -437,6 +467,7 @@ class UnprocessableEntity(HTTPException): class PreconditionRequired(HTTPException): + """*428* `Precondition Required` The server requires this request to be conditional, typically to prevent @@ -455,6 +486,7 @@ class PreconditionRequired(HTTPException): class TooManyRequests(HTTPException): + """*429* `Too Many Requests` The server is limiting the rate at which this user receives responses, and @@ -470,6 +502,7 @@ class TooManyRequests(HTTPException): class RequestHeaderFieldsTooLarge(HTTPException): + """*431* `Request Header Fields Too Large` The server refuses to process the request because the header fields are too @@ -483,6 +516,7 @@ class RequestHeaderFieldsTooLarge(HTTPException): class InternalServerError(HTTPException): + """*500* `Internal Server Error` Raise if an internal server error occurred. This is a good fallback if an @@ -497,6 +531,7 @@ class InternalServerError(HTTPException): class NotImplemented(HTTPException): + """*501* `Not Implemented` Raise if the application does not support the action requested by the @@ -510,6 +545,7 @@ class NotImplemented(HTTPException): class BadGateway(HTTPException): + """*502* `Bad Gateway` If you do proxying in your application you should return this status code @@ -524,6 +560,7 @@ class BadGateway(HTTPException): class ServiceUnavailable(HTTPException): + """*503* `Service Unavailable` Status code you should return if a service is temporarily unavailable. @@ -536,22 +573,55 @@ class ServiceUnavailable(HTTPException): ) +class GatewayTimeout(HTTPException): + + """*504* `Gateway Timeout` + + Status code you should return if a connection to an upstream server + times out. + """ + code = 504 + description = ( + 'The connection to an upstream server timed out.' + ) + + +class HTTPVersionNotSupported(HTTPException): + + """*505* `HTTP Version Not Supported` + + The server does not support the HTTP protocol version used in the request. + """ + code = 505 + description = ( + 'The server does not support the HTTP protocol version used in the ' + 'request.' + ) + + default_exceptions = {} __all__ = ['HTTPException'] + def _find_exceptions(): for name, obj in iteritems(globals()): try: - if getattr(obj, 'code', None) is not None: - default_exceptions[obj.code] = obj - __all__.append(obj.__name__) - except TypeError: # pragma: no cover + is_http_exception = issubclass(obj, HTTPException) + except TypeError: + is_http_exception = False + if not is_http_exception or obj.code is None: continue + __all__.append(obj.__name__) + old_obj = default_exceptions.get(obj.code, None) + if old_obj is not None and issubclass(obj, old_obj): + continue + default_exceptions[obj.code] = obj _find_exceptions() del _find_exceptions class Aborter(object): + """ When passed a dict of code -> exception items it can be used as callable that raises exceptions. If the first argument to the diff --git a/vendor/werkzeug/filesystem.py b/vendor/werkzeug/filesystem.py new file mode 100644 index 00000000..62467465 --- /dev/null +++ b/vendor/werkzeug/filesystem.py @@ -0,0 +1,66 @@ +# -*- coding: utf-8 -*- +""" + werkzeug.filesystem + ~~~~~~~~~~~~~~~~~~~ + + Various utilities for the local filesystem. + + :copyright: (c) 2015 by the Werkzeug Team, see AUTHORS for more details. + :license: BSD, see LICENSE for more details. +""" + +import codecs +import sys +import warnings + +# We do not trust traditional unixes. +has_likely_buggy_unicode_filesystem = \ + sys.platform.startswith('linux') or 'bsd' in sys.platform + + +def _is_ascii_encoding(encoding): + """ + Given an encoding this figures out if the encoding is actually ASCII (which + is something we don't actually want in most cases). This is necessary + because ASCII comes under many names such as ANSI_X3.4-1968. + """ + if encoding is None: + return False + try: + return codecs.lookup(encoding).name == 'ascii' + except LookupError: + return False + + +class BrokenFilesystemWarning(RuntimeWarning, UnicodeWarning): + '''The warning used by Werkzeug to signal a broken filesystem. Will only be + used once per runtime.''' + + +_warned_about_filesystem_encoding = False + + +def get_filesystem_encoding(): + """ + Returns the filesystem encoding that should be used. Note that this is + different from the Python understanding of the filesystem encoding which + might be deeply flawed. Do not use this value against Python's unicode APIs + because it might be different. See :ref:`filesystem-encoding` for the exact + behavior. + + The concept of a filesystem encoding in generally is not something you + should rely on. As such if you ever need to use this function except for + writing wrapper code reconsider. + """ + global _warned_about_filesystem_encoding + rv = sys.getfilesystemencoding() + if has_likely_buggy_unicode_filesystem and not rv \ + or _is_ascii_encoding(rv): + if not _warned_about_filesystem_encoding: + warnings.warn( + 'Detected a misconfigured UNIX filesystem: Will use UTF-8 as ' + 'filesystem encoding instead of {0!r}'.format(rv), + BrokenFilesystemWarning) + _warned_about_filesystem_encoding = True + return 'utf-8' + return rv diff --git a/vendor/werkzeug/formparser.py b/vendor/werkzeug/formparser.py index 61153807..11486913 100644 --- a/vendor/werkzeug/formparser.py +++ b/vendor/werkzeug/formparser.py @@ -6,7 +6,7 @@ This module implements the form parsing. It supports url-encoded forms as well as non-nested multipart uploads. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import re @@ -19,7 +19,7 @@ from functools import update_wrapper from werkzeug._compat import to_native, text_type from werkzeug.urls import url_decode_stream from werkzeug.wsgi import make_line_iter, \ - get_input_stream, get_content_length + get_input_stream, get_content_length from werkzeug.datastructures import Headers, FileStorage, MultiDict from werkzeug.http import parse_options_header @@ -94,6 +94,7 @@ def parse_form_data(environ, stream_factory=None, charset='utf-8', def exhaust_stream(f): """Helper decorator for methods that exhausts the stream on return.""" + def wrapper(self, stream, *args, **kwargs): try: return f(self, stream, *args, **kwargs) @@ -110,6 +111,7 @@ def exhaust_stream(f): class FormDataParser(object): + """This class implements parsing of form data for Werkzeug. By itself it can parse multipart and url encoded form data. It can be subclassed and extended but for most mimetypes it is a better idea to use the @@ -203,6 +205,8 @@ class FormDataParser(object): max_form_memory_size=self.max_form_memory_size, cls=self.cls) boundary = options.get('boundary') + if boundary is None: + raise ValueError('Missing boundary') if isinstance(boundary, text_type): boundary = boundary.encode('ascii') form, files = parser.parse(stream, boundary, content_length) @@ -361,14 +365,14 @@ class MultiPartParser(object): self.fail('Missing boundary') if not is_valid_multipart_boundary(boundary): self.fail('Invalid boundary: %s' % boundary) - if len(boundary) > self.buffer_size: # pragma: no cover + if len(boundary) > self.buffer_size: # pragma: no cover # this should never happen because we check for a minimum size # of 1024 and boundaries may not be longer than 200. The only # situation when this happens is for non debug builds where # the assert is skipped. self.fail('Boundary longer than buffer size') - def parse_lines(self, file, boundary, content_length): + def parse_lines(self, file, boundary, content_length, cap_at_buffer=True): """Generate parts of ``('begin_form', (headers, name))`` ``('begin_file', (headers, name, filename))`` @@ -383,7 +387,8 @@ class MultiPartParser(object): last_part = next_part + b'--' iterator = chain(make_line_iter(file, limit=content_length, - buffer_size=self.buffer_size), + buffer_size=self.buffer_size, + cap_at_buffer=cap_at_buffer), _empty_string_iter) terminator = self._find_terminator(iterator) @@ -455,7 +460,7 @@ class MultiPartParser(object): cutoff = -1 yield _cont, line[:cutoff] - else: # pragma: no cover + else: # pragma: no cover raise ValueError('unexpected end of part') # if we have a leftover in the buffer that is not a newline @@ -508,7 +513,7 @@ class MultiPartParser(object): part_charset = self.get_part_charset(headers) yield ('form', (name, b''.join(container).decode( - part_charset, self.errors))) + part_charset, self.errors))) def parse(self, file, boundary, content_length): formstream, filestream = tee( diff --git a/vendor/werkzeug/http.py b/vendor/werkzeug/http.py index a7347508..13a7eb5b 100644 --- a/vendor/werkzeug/http.py +++ b/vendor/werkzeug/http.py @@ -13,40 +13,58 @@ module. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import re from time import time, gmtime try: from email.utils import parsedate_tz -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover from email.Utils import parsedate_tz try: from urllib2 import parse_http_list as _parse_list_header -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover from urllib.request import parse_http_list as _parse_list_header from datetime import datetime, timedelta from hashlib import md5 import base64 from werkzeug._internal import _cookie_quote, _make_cookie_domain, \ - _cookie_parse_impl + _cookie_parse_impl from werkzeug._compat import to_unicode, iteritems, text_type, \ - string_types, try_coerce_native, to_bytes, PY2, \ - integer_types + string_types, try_coerce_native, to_bytes, PY2, \ + integer_types -# incorrect _cookie_charset = 'latin1' -_accept_re = re.compile(r'([^\s;,]+)(?:[^,]*?;\s*q=(\d*(?:\.\d+)?))?') +# for explanation of "media-range", etc. see Sections 5.3.{1,2} of RFC 7231 +_accept_re = re.compile( + r'''( # media-range capturing-parenthesis + [^\s;,]+ # type/subtype + (?:[ \t]*;[ \t]* # ";" + (?: # parameter non-capturing-parenthesis + [^\s;,q][^\s;,]* # token that doesn't start with "q" + | # or + q[^\s;,=][^\s;,]* # token that is more than just "q" + ) + )* # zero or more parameters + ) # end of media-range + (?:[ \t]*;[ \t]*q= # weight is a "q" parameter + (\d*(?:\.\d+)?) # qvalue capturing-parentheses + [^,]* # "extension" accept params: who cares? + )? # accept params are optional + ''', re.VERBOSE) _token_chars = frozenset("!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" '^_`abcdefghijklmnopqrstuvwxyz|~') _etag_re = re.compile(r'([Ww]/)?(?:"(.*?)"|(.*?))(?:\s*,\s*|$)') _unsafe_header_chars = set('()<>@,;:\"/[]?={} \t') _quoted_string_re = r'"[^"\\]*(?:\\.[^"\\]*)*"' -_option_header_piece_re = re.compile(r';\s*(%s|[^\s;=]+)\s*(?:=\s*(%s|[^;]+))?\s*' % - (_quoted_string_re, _quoted_string_re)) +_option_header_piece_re = re.compile( + r';\s*(%s|[^\s;,=]+)\s*(?:=\s*(%s|[^;,]+)?)?\s*' % + (_quoted_string_re, _quoted_string_re) +) +_option_header_start_mime_type = re.compile(r',\s*([^;,\s]+)([;,]\s*.+)?') _entity_headers = frozenset([ 'allow', 'content-encoding', 'content-language', 'content-length', @@ -98,15 +116,15 @@ HTTP_STATUS_CODES = { 415: 'Unsupported Media Type', 416: 'Requested Range Not Satisfiable', 417: 'Expectation Failed', - 418: 'I\'m a teapot', # see RFC 2324 + 418: 'I\'m a teapot', # see RFC 2324 422: 'Unprocessable Entity', 423: 'Locked', 424: 'Failed Dependency', 426: 'Upgrade Required', - 428: 'Precondition Required', # see RFC 6585 + 428: 'Precondition Required', # see RFC 6585 429: 'Too Many Requests', 431: 'Request Header Fields Too Large', - 449: 'Retry With', # proprietary MS extension + 449: 'Retry With', # proprietary MS extension 500: 'Internal Server Error', 501: 'Not Implemented', 502: 'Bad Gateway', @@ -124,7 +142,7 @@ def wsgi_to_bytes(data): """ if isinstance(data, bytes): return data - return data.encode('latin1') #XXX: utf8 fallback? + return data.encode('latin1') # XXX: utf8 fallback? def bytes_to_wsgi(data): @@ -287,7 +305,7 @@ def parse_dict_header(value, cls=dict): """ result = cls() if not isinstance(value, text_type): - #XXX: validate + # XXX: validate value = bytes_to_wsgi(value) for item in _parse_list_header(value): if '=' not in item: @@ -300,7 +318,7 @@ def parse_dict_header(value, cls=dict): return result -def parse_options_header(value): +def parse_options_header(value, multiple=False): """Parse a ``Content-Type`` like header into a tuple with the content type and the options: @@ -314,23 +332,42 @@ def parse_options_header(value): .. versionadded:: 0.5 :param value: the header to parse. - :return: (str, options) + :param multiple: Whether try to parse and return multiple MIME types + :return: (mimetype, options) or (mimetype, options, mimetype, options, …) + if multiple=True """ - def _tokenize(string): - for match in _option_header_piece_re.finditer(string): - key, value = match.groups() - key = unquote_header_value(key) - if value is not None: - value = unquote_header_value(value, key == 'filename') - yield key, value - if not value: return '', {} - parts = _tokenize(';' + value) - name = next(parts)[0] - extra = dict(parts) - return name, extra + result = [] + + value = "," + value.replace("\n", ",") + while value: + match = _option_header_start_mime_type.match(value) + if not match: + break + result.append(match.group(1)) # mimetype + options = {} + # Parse options + rest = match.group(2) + while rest: + optmatch = _option_header_piece_re.match(rest) + if not optmatch: + break + option, option_value = optmatch.groups() + option = unquote_header_value(option) + if option_value is not None: + option_value = unquote_header_value( + option_value, + option == 'filename') + options[option] = option_value + rest = rest[optmatch.end():] + result.append(options) + if multiple is False: + return tuple(result) + value = rest + + return tuple(result) if result else ('', {}) def parse_accept_header(value, cls=None): @@ -440,14 +477,14 @@ def parse_authorization_header(value): if auth_type == b'basic': try: username, password = base64.b64decode(auth_info).split(b':', 1) - except Exception as e: + except Exception: return return Authorization('basic', {'username': bytes_to_wsgi(username), 'password': bytes_to_wsgi(password)}) elif auth_type == b'digest': auth_map = parse_dict_header(auth_info) for key in 'username', 'realm', 'nonce', 'uri', 'response': - if not key in auth_map: + if key not in auth_map: return if 'qop' in auth_map: if not auth_map.get('nc') or not auth_map.get('cnonce'): @@ -589,14 +626,14 @@ def quote_etag(etag, weak=False): raise ValueError('invalid etag') etag = '"%s"' % etag if weak: - etag = 'w/' + etag + etag = 'W/' + etag return etag def unquote_etag(etag): """Unquote a single etag: - >>> unquote_etag('w/"bar"') + >>> unquote_etag('W/"bar"') ('bar', True) >>> unquote_etag('"bar"') ('bar', False) @@ -608,7 +645,7 @@ def unquote_etag(etag): return None, None etag = etag.strip() weak = False - if etag[:2] in ('w/', 'W/'): + if etag.startswith(('W/', 'w/')): weak = True etag = etag[2:] if etag[:1] == etag[-1:] == '"': @@ -678,7 +715,7 @@ def parse_date(value): elif year >= 69 and year <= 99: year += 1900 return datetime(*((year,) + t[1:7])) - \ - timedelta(seconds=t[-1] or 0) + timedelta(seconds=t[-1] or 0) except (ValueError, OverflowError): return None @@ -762,7 +799,11 @@ def is_resource_modified(environ, etag=None, data=None, last_modified=None): if etag: if_none_match = parse_etags(environ.get('HTTP_IF_NONE_MATCH')) if if_none_match: - unmodified = if_none_match.contains_raw(etag) + # http://tools.ietf.org/html/rfc7232#section-3.2 + # "A recipient MUST use the weak comparison function when comparing + # entity-tags for If-None-Match" + etag, _ = unquote_etag(etag) + unmodified = if_none_match.contains_weak(etag) return not unmodified @@ -969,12 +1010,13 @@ def is_byte_range_valid(start, stop, length): # circular dependency fun from werkzeug.datastructures import Accept, HeaderSet, ETags, Authorization, \ - WWWAuthenticate, TypeConversionDict, IfRange, Range, ContentRange, \ - RequestCacheControl + WWWAuthenticate, TypeConversionDict, IfRange, Range, ContentRange, \ + RequestCacheControl # DEPRECATED # backwards compatible imports -from werkzeug.datastructures import MIMEAccept, CharsetAccept, \ - LanguageAccept, Headers +from werkzeug.datastructures import ( # noqa + MIMEAccept, CharsetAccept, LanguageAccept, Headers +) from werkzeug.urls import iri_to_uri diff --git a/vendor/werkzeug/local.py b/vendor/werkzeug/local.py index 0d4be132..c8f69219 100644 --- a/vendor/werkzeug/local.py +++ b/vendor/werkzeug/local.py @@ -5,9 +5,10 @@ This module implements context-local objects. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ +import copy from functools import update_wrapper from werkzeug.wsgi import ClosingIterator from werkzeug._compat import PY2, implements_bool @@ -37,7 +38,7 @@ def release_local(local): False With this function one can release :class:`Local` objects as well - as :class:`StackLocal` objects. However it is not possible to + as :class:`LocalStack` objects. However it is not possible to release data held by proxies that way, one always has to retain a reference to the underlying local object in order to be able to release it. @@ -86,6 +87,7 @@ class Local(object): class LocalStack(object): + """This class works similar to a :class:`Local` but keeps a stack of objects instead. This is best explained with an example:: @@ -120,6 +122,7 @@ class LocalStack(object): def _get__ident_func__(self): return self._local.__ident_func__ + def _set__ident_func__(self, value): object.__setattr__(self._local, '__ident_func__', value) __ident_func__ = property(_get__ident_func__, _set__ident_func__) @@ -166,6 +169,7 @@ class LocalStack(object): class LocalManager(object): + """Local objects cannot manage themselves. For that you need a local manager. You can pass a local manager multiple locals or add them later by appending them to `manager.locals`. Everytime the manager cleans up @@ -203,7 +207,7 @@ class LocalManager(object): scoped sessions) to the Werkzeug locals. .. versionchanged:: 0.7 - Yu can pass a different ident function to the local manager that + You can pass a different ident function to the local manager that will then be propagated to all the locals passed to the constructor. """ @@ -248,6 +252,7 @@ class LocalManager(object): @implements_bool class LocalProxy(object): + """Acts as a proxy for a werkzeug local. Forwards all operations to a proxied object. The only operations not supported for forwarding are right handed operands and any kind of assignment. @@ -322,7 +327,7 @@ class LocalProxy(object): def __unicode__(self): try: - return unicode(self._get_current_object()) + return unicode(self._get_current_object()) # noqa except RuntimeError: return repr(self) @@ -361,7 +366,7 @@ class LocalProxy(object): __ne__ = lambda x, o: x._get_current_object() != o __gt__ = lambda x, o: x._get_current_object() > o __ge__ = lambda x, o: x._get_current_object() >= o - __cmp__ = lambda x, o: cmp(x._get_current_object(), o) + __cmp__ = lambda x, o: cmp(x._get_current_object(), o) # noqa __hash__ = lambda x: hash(x._get_current_object()) __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) __len__ = lambda x: len(x._get_current_object()) @@ -388,7 +393,7 @@ class LocalProxy(object): __invert__ = lambda x: ~(x._get_current_object()) __complex__ = lambda x: complex(x._get_current_object()) __int__ = lambda x: int(x._get_current_object()) - __long__ = lambda x: long(x._get_current_object()) + __long__ = lambda x: long(x._get_current_object()) # noqa __float__ = lambda x: float(x._get_current_object()) __oct__ = lambda x: oct(x._get_current_object()) __hex__ = lambda x: hex(x._get_current_object()) @@ -407,3 +412,5 @@ class LocalProxy(object): __rfloordiv__ = lambda x, o: o // x._get_current_object() __rmod__ = lambda x, o: o % x._get_current_object() __rdivmod__ = lambda x, o: x._get_current_object().__rdivmod__(o) + __copy__ = lambda x: copy.copy(x._get_current_object()) + __deepcopy__ = lambda x, memo: copy.deepcopy(x._get_current_object(), memo) diff --git a/vendor/werkzeug/posixemulation.py b/vendor/werkzeug/posixemulation.py index 68ef3cfc..8fd6314f 100644 --- a/vendor/werkzeug/posixemulation.py +++ b/vendor/werkzeug/posixemulation.py @@ -14,7 +14,7 @@ r""" This module was introduced in 0.6.1 and is not a public interface. It might become one in later versions of Werkzeug. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import sys @@ -23,9 +23,12 @@ import errno import time import random +from ._compat import to_unicode +from .filesystem import get_filesystem_encoding + can_rename_open_file = False -if os.name == 'nt': # pragma: no cover +if os.name == 'nt': # pragma: no cover _rename = lambda src, dst: False _rename_atomic = lambda src, dst: False @@ -37,17 +40,15 @@ if os.name == 'nt': # pragma: no cover _MoveFileEx = ctypes.windll.kernel32.MoveFileExW def _rename(src, dst): - if not isinstance(src, unicode): - src = unicode(src, sys.getfilesystemencoding()) - if not isinstance(dst, unicode): - dst = unicode(dst, sys.getfilesystemencoding()) + src = to_unicode(src, get_filesystem_encoding()) + dst = to_unicode(dst, get_filesystem_encoding()) if _rename_atomic(src, dst): return True retry = 0 rv = False while not rv and retry < 100: rv = _MoveFileEx(src, dst, _MOVEFILE_REPLACE_EXISTING | - _MOVEFILE_WRITE_THROUGH) + _MOVEFILE_WRITE_THROUGH) if not rv: time.sleep(0.001) retry += 1 diff --git a/vendor/werkzeug/routing.py b/vendor/werkzeug/routing.py index 7a1c50e4..7c58c550 100644 --- a/vendor/werkzeug/routing.py +++ b/vendor/werkzeug/routing.py @@ -92,24 +92,25 @@ method is raised. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ +import difflib import re +import uuid import posixpath -from pprint import pformat -try: - from urlparse import urljoin -except ImportError: - from urllib.parse import urljoin -from werkzeug.urls import url_encode, url_quote +from pprint import pformat +from threading import Lock + +from werkzeug.urls import url_encode, url_quote, url_join from werkzeug.utils import redirect, format_string -from werkzeug.exceptions import HTTPException, NotFound, MethodNotAllowed +from werkzeug.exceptions import HTTPException, NotFound, MethodNotAllowed, \ + BadHost from werkzeug._internal import _get_environ, _encode_idna from werkzeug._compat import itervalues, iteritems, to_unicode, to_bytes, \ - text_type, string_types, native_string_result, \ - implements_to_string, wsgi_decoding_dance + text_type, string_types, native_string_result, \ + implements_to_string, wsgi_decoding_dance from werkzeug.datastructures import ImmutableDict, MultiDict @@ -135,7 +136,7 @@ _converter_args_re = re.compile(r''' \w+| [urUR]?(?P"[^"]*?"|'[^']*') )\s*, -''', re.VERBOSE|re.UNICODE) +''', re.VERBOSE | re.UNICODE) _PYTHON_CONSTANTS = { @@ -210,6 +211,7 @@ def parse_rule(rule): class RoutingException(Exception): + """Special exceptions that require the application to redirect, notifying about missing urls, etc. @@ -218,6 +220,7 @@ class RoutingException(Exception): class RequestRedirect(HTTPException, RoutingException): + """Raise if the map requests a redirect. This is for example the case if `strict_slashes` are activated and an url that requires a trailing slash. @@ -234,10 +237,12 @@ class RequestRedirect(HTTPException, RoutingException): class RequestSlash(RoutingException): + """Internal exception.""" class RequestAliasRedirect(RoutingException): + """This rule is an alias and wants to redirect to the canonical URL.""" def __init__(self, matched_values): @@ -245,24 +250,71 @@ class RequestAliasRedirect(RoutingException): class BuildError(RoutingException, LookupError): + """Raised if the build system cannot find a URL for an endpoint with the values provided. """ - def __init__(self, endpoint, values, method): + def __init__(self, endpoint, values, method, adapter=None): LookupError.__init__(self, endpoint, values, method) self.endpoint = endpoint self.values = values self.method = method + self.suggested = self.closest_rule(adapter) + + def closest_rule(self, adapter): + def score_rule(rule): + return sum([ + 0.98 * difflib.SequenceMatcher( + None, rule.endpoint, self.endpoint + ).ratio(), + 0.01 * bool(set(self.values or ()).issubset(rule.arguments)), + 0.01 * bool(rule.methods and self.method in rule.methods) + ]) + + if adapter and adapter.map._rules: + return max(adapter.map._rules, key=score_rule) + else: + return None + + def __str__(self): + message = [] + message.append("Could not build url for endpoint %r" % self.endpoint) + if self.method: + message.append(" (%r)" % self.method) + if self.values: + message.append(" with values %r" % sorted(self.values.keys())) + message.append(".") + if self.suggested: + if self.endpoint == self.suggested.endpoint: + if self.method and self.method not in self.suggested.methods: + message.append(" Did you mean to use methods %r?" % sorted( + self.suggested.methods + )) + missing_values = self.suggested.arguments.union( + set(self.suggested.defaults or ()) + ) - set(self.values.keys()) + if missing_values: + message.append( + " Did you forget to specify values %r?" % + sorted(missing_values) + ) + else: + message.append( + " Did you mean %r instead?" % self.suggested.endpoint + ) + return "".join(message) class ValidationError(ValueError): + """Validation error. If a rule converter raises this exception the rule does not match the current URL and the next URL is tried. """ class RuleFactory(object): + """As soon as you have more complex URL setups it's a good idea to use rule factories to avoid repetitive tasks. Some of them are builtin, others can be added by subclassing `RuleFactory` and overriding `get_rules`. @@ -275,6 +327,7 @@ class RuleFactory(object): class Subdomain(RuleFactory): + """All URLs provided by this factory have the subdomain set to a specific domain. For example if you want to use the subdomain for the current language this can be a good setup:: @@ -306,6 +359,7 @@ class Subdomain(RuleFactory): class Submount(RuleFactory): + """Like `Subdomain` but prefixes the URL rule with a given string:: url_map = Map([ @@ -332,6 +386,7 @@ class Submount(RuleFactory): class EndpointPrefix(RuleFactory): + """Prefixes all endpoints (which must be strings for this factory) with another string. This can be useful for sub applications:: @@ -357,6 +412,7 @@ class EndpointPrefix(RuleFactory): class RuleTemplate(object): + """Returns copies of the rules wrapped and expands string templates in the endpoint, rule, defaults or subdomain sections. @@ -383,6 +439,7 @@ class RuleTemplate(object): class RuleTemplateFactory(RuleFactory): + """A factory that fills in template variables into rules. Used by `RuleTemplate` internally. @@ -421,6 +478,7 @@ class RuleTemplateFactory(RuleFactory): @implements_to_string class Rule(RuleFactory): + """A Rule represents one URL pattern. There are some options for `Rule` that change the way it behaves and are passed to the `Rule` constructor. Note that besides the rule-string all arguments *must* be keyword arguments @@ -565,14 +623,35 @@ class Rule(RuleFactory): self._trace = self._converters = self._regex = self._weights = None def empty(self): - """Return an unbound copy of this rule. This can be useful if you - want to reuse an already bound URL for another map.""" + """ + Return an unbound copy of this rule. + + This can be useful if want to reuse an already bound URL for another + map. See ``get_empty_kwargs`` to override what keyword arguments are + provided to the new copy. + """ + return type(self)(self.rule, **self.get_empty_kwargs()) + + def get_empty_kwargs(self): + """ + Provides kwargs for instantiating empty copy with empty() + + Use this method to provide custom keyword arguments to the subclass of + ``Rule`` when calling ``some_rule.empty()``. Helpful when the subclass + has custom keyword arguments that are needed at instantiation. + + Must return a ``dict`` that will be provided as kwargs to the new + instance of ``Rule``, following the initial ``self.rule`` value which + is always provided as the first, required positional argument. + """ defaults = None if self.defaults: defaults = dict(self.defaults) - return Rule(self.rule, defaults, self.subdomain, self.methods, - self.build_only, self.endpoint, self.strict_slashes, - self.redirect_to, self.alias, self.host) + return dict(defaults=defaults, subdomain=self.subdomain, + methods=self.methods, build_only=self.build_only, + endpoint=self.endpoint, strict_slashes=self.strict_slashes, + redirect_to=self.redirect_to, alias=self.alias, + host=self.host) def get_rules(self, map): yield self @@ -606,7 +685,7 @@ class Rule(RuleFactory): .. versionadded:: 0.9 """ - if not converter_name in self.map.converters: + if converter_name not in self.map.converters: raise LookupError('the converter %r does not exist' % converter_name) return self.map.converters[converter_name](self.map, *args, **kwargs) @@ -657,8 +736,8 @@ class Rule(RuleFactory): return regex = r'^%s%s$' % ( u''.join(regex_parts), - (not self.is_leaf or not self.strict_slashes) and \ - '(?/?)' or '' + (not self.is_leaf or not self.strict_slashes) and + '(?/?)' or '' ) self._regex = re.compile(regex, re.UNICODE) @@ -732,8 +811,8 @@ class Rule(RuleFactory): if query_vars: url += u'?' + url_encode(query_vars, charset=self.map.charset, - sort=self.map.sort_parameters, - key=self.map.sort_key) + sort=self.map.sort_parameters, + key=self.map.sort_key) return domain_part, url @@ -743,8 +822,8 @@ class Rule(RuleFactory): :internal: """ return not self.build_only and self.defaults and \ - self.endpoint == rule.endpoint and self != rule and \ - self.arguments == rule.arguments + self.endpoint == rule.endpoint and self != rule and \ + self.arguments == rule.arguments def suitable_for(self, values, method=None): """Check if the dict of values has enough data for url generation. @@ -796,11 +875,11 @@ class Rule(RuleFactory): :internal: """ return self.alias and 1 or 0, -len(self.arguments), \ - -len(self.defaults or ()) + -len(self.defaults or ()) def __eq__(self, other): return self.__class__ is other.__class__ and \ - self._trace == other._trace + self._trace == other._trace def __ne__(self, other): return not self.__eq__(other) @@ -821,13 +900,15 @@ class Rule(RuleFactory): return u'<%s %s%s -> %s>' % ( self.__class__.__name__, repr((u''.join(tmp)).lstrip(u'|')).lstrip(u'u'), - self.methods is not None and u' (%s)' % \ - u', '.join(self.methods) or u'', + self.methods is not None + and u' (%s)' % u', '.join(self.methods) + or u'', self.endpoint ) class BaseConverter(object): + """Base class for all converters.""" regex = '[^/]+' weight = 100 @@ -843,6 +924,7 @@ class BaseConverter(object): class UnicodeConverter(BaseConverter): + """This converter is the default converter and accepts any string but only one path segment. Thus the string can not include a slash. @@ -877,6 +959,7 @@ class UnicodeConverter(BaseConverter): class AnyConverter(BaseConverter): + """Matches one of the items provided. Items can either be Python identifiers or strings:: @@ -893,6 +976,7 @@ class AnyConverter(BaseConverter): class PathConverter(BaseConverter): + """Like the default :class:`UnicodeConverter`, but it also matches slashes. This is useful for wikis and similar applications:: @@ -906,6 +990,7 @@ class PathConverter(BaseConverter): class NumberConverter(BaseConverter): + """Baseclass for `IntegerConverter` and `FloatConverter`. :internal: @@ -935,6 +1020,7 @@ class NumberConverter(BaseConverter): class IntegerConverter(NumberConverter): + """This converter only accepts integer values:: Rule('/page/') @@ -954,6 +1040,7 @@ class IntegerConverter(NumberConverter): class FloatConverter(NumberConverter): + """This converter only accepts floating point values:: Rule('/probability/') @@ -971,6 +1058,26 @@ class FloatConverter(NumberConverter): NumberConverter.__init__(self, map, 0, min, max) +class UUIDConverter(BaseConverter): + + """This converter only accepts UUID strings:: + + Rule('/object/') + + .. versionadded:: 0.10 + + :param map: the :class:`Map`. + """ + regex = r'[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-' \ + r'[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}' + + def to_python(self, value): + return uuid.UUID(value) + + def to_url(self, value): + return str(value) + + #: the default converter mapping for the map. DEFAULT_CONVERTERS = { 'default': UnicodeConverter, @@ -978,11 +1085,13 @@ DEFAULT_CONVERTERS = { 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, - 'float': FloatConverter + 'float': FloatConverter, + 'uuid': UUIDConverter, } class Map(object): + """The map class stores all the URL rules and some configuration parameters. Some of the configuration values are only stored on the `Map` instance since those affect all rules, others are just defaults @@ -1027,6 +1136,7 @@ class Map(object): self._rules = [] self._rules_by_endpoint = {} self._remap = True + self._remap_lock = Lock() self.default_subdomain = default_subdomain self.charset = charset @@ -1123,7 +1233,10 @@ class Map(object): subdomain = self.default_subdomain if script_name is None: script_name = '/' - server_name = _encode_idna(server_name) + try: + server_name = _encode_idna(server_name) + except UnicodeError: + raise BadHost() return MapAdapter(self, server_name, script_name, subdomain, url_scheme, path_info, default_method, query_args) @@ -1162,24 +1275,31 @@ class Map(object): :param subdomain: optionally the current subdomain (see above). """ environ = _get_environ(environ) + + if 'HTTP_HOST' in environ: + wsgi_server_name = environ['HTTP_HOST'] + + if environ['wsgi.url_scheme'] == 'http' \ + and wsgi_server_name.endswith(':80'): + wsgi_server_name = wsgi_server_name[:-3] + elif environ['wsgi.url_scheme'] == 'https' \ + and wsgi_server_name.endswith(':443'): + wsgi_server_name = wsgi_server_name[:-4] + else: + wsgi_server_name = environ['SERVER_NAME'] + + if (environ['wsgi.url_scheme'], environ['SERVER_PORT']) not \ + in (('https', '443'), ('http', '80')): + wsgi_server_name += ':' + environ['SERVER_PORT'] + + wsgi_server_name = wsgi_server_name.lower() + if server_name is None: - if 'HTTP_HOST' in environ: - server_name = environ['HTTP_HOST'] - else: - server_name = environ['SERVER_NAME'] - if (environ['wsgi.url_scheme'], environ['SERVER_PORT']) not \ - in (('https', '443'), ('http', '80')): - server_name += ':' + environ['SERVER_PORT'] - elif subdomain is None and not self.host_matching: + server_name = wsgi_server_name + else: server_name = server_name.lower() - if 'HTTP_HOST' in environ: - wsgi_server_name = environ.get('HTTP_HOST') - else: - wsgi_server_name = environ.get('SERVER_NAME') - if (environ['wsgi.url_scheme'], environ['SERVER_PORT']) not \ - in (('https', '443'), ('http', '80')): - wsgi_server_name += ':' + environ['SERVER_PORT'] - wsgi_server_name = wsgi_server_name.lower() + + if subdomain is None and not self.host_matching: cur_server_name = wsgi_server_name.split('.') real_server_name = server_name.split('.') offset = -len(real_server_name) @@ -1210,7 +1330,13 @@ class Map(object): """Called before matching and building to keep the compiled rules in the correct order after things changed. """ - if self._remap: + if not self._remap: + return + + with self._remap_lock: + if not self._remap: + return + self._rules.sort(key=lambda x: x.match_compare_key()) for rules in itervalues(self._rules_by_endpoint): rules.sort(key=lambda x: x.build_compare_key()) @@ -1222,6 +1348,7 @@ class Map(object): class MapAdapter(object): + """Returned by :meth:`Map.bind` or :meth:`Map.bind_to_environ` and does the URL matching and building based on runtime information. """ @@ -1382,8 +1509,10 @@ class MapAdapter(object): query_args = self.query_args method = (method or self.default_method).upper() - path = u'%s|/%s' % (self.map.host_matching and self.server_name or - self.subdomain, path_info.lstrip('/')) + path = u'%s|%s' % ( + self.map.host_matching and self.server_name or self.subdomain, + path_info and '/%s' % path_info.lstrip('/') + ) have_match_for = set() for rule in self.map._rules: @@ -1391,7 +1520,8 @@ class MapAdapter(object): rv = rule.match(path) except RequestSlash: raise RequestRedirect(self.make_redirect_url( - path_info + '/', query_args)) + url_quote(path_info, self.map.charset, + safe='/:|+') + '/', query_args)) except RequestAliasRedirect as e: raise RequestRedirect(self.make_alias_redirect_url( path, rule.endpoint, e.matched_values, method, query_args)) @@ -1416,8 +1546,8 @@ class MapAdapter(object): rule.redirect_to) else: redirect_url = rule.redirect_to(self, **rv) - raise RequestRedirect(str(urljoin('%s://%s%s%s' % ( - self.url_scheme, + raise RequestRedirect(str(url_join('%s://%s%s%s' % ( + self.url_scheme or 'http', self.subdomain and self.subdomain + '.' or '', self.server_name, self.script_name @@ -1512,11 +1642,10 @@ class MapAdapter(object): if query_args: suffix = '?' + self.encode_query_args(query_args) return str('%s://%s/%s%s' % ( - self.url_scheme, + self.url_scheme or 'http', self.get_host(domain_part), posixpath.join(self.script_name[:-1].lstrip('/'), - url_quote(path_info.lstrip('/'), self.map.charset, - safe='/:|+')), + path_info.lstrip('/')), suffix )) @@ -1527,7 +1656,7 @@ class MapAdapter(object): if query_args: url += '?' + self.encode_query_args(query_args) assert url != path, 'detected invalid alias setting. No canonical ' \ - 'URL found' + 'URL found' return url def _partial_build(self, endpoint, values, method, append_unknown): @@ -1585,6 +1714,13 @@ class MapAdapter(object): >>> urls.build("index", {'q': 'My Searchstring'}) '/?q=My+Searchstring' + When processing those additional values, lists are furthermore + interpreted as multiple values (as per + :py:class:`werkzeug.datastructures.MultiDict`): + + >>> urls.build("index", {'q': ['a', 'b', 'c']}) + '/?q=a&q=b&q=c' + If a rule does not exist when building a `BuildError` exception is raised. @@ -1600,7 +1736,9 @@ class MapAdapter(object): appended to the URL as query parameters. :param method: the HTTP method for the rule if there are different URLs for different methods on the same endpoint. - :param force_external: enforce full canonical external URLs. + :param force_external: enforce full canonical external URLs. If the URL + scheme is not provided, this will generate + a protocol-relative URL. :param append_unknown: unknown parameters are appended to the generated URL as query string argument. Disable this if you want the builder to ignore those. @@ -1608,7 +1746,7 @@ class MapAdapter(object): self.map.update() if values: if isinstance(values, MultiDict): - valueiter = values.iteritems(multi=True) + valueiter = iteritems(values, multi=True) else: valueiter = iteritems(values) values = dict((k, v) for k, v in valueiter if v is not None) @@ -1617,7 +1755,7 @@ class MapAdapter(object): rv = self._partial_build(endpoint, values, method, append_unknown) if rv is None: - raise BuildError(endpoint, values, method) + raise BuildError(endpoint, values, method, self) domain_part, path = rv host = self.get_host(domain_part) @@ -1625,10 +1763,11 @@ class MapAdapter(object): # shortcut this. if not force_external and ( (self.map.host_matching and host == self.server_name) or - (not self.map.host_matching and domain_part == self.subdomain)): - return str(urljoin(self.script_name, './' + path.lstrip('/'))) - return str('%s://%s%s/%s' % ( - self.url_scheme, + (not self.map.host_matching and domain_part == self.subdomain) + ): + return str(url_join(self.script_name, './' + path.lstrip('/'))) + return str('%s//%s%s/%s' % ( + self.url_scheme + ':' if self.url_scheme else '', host, self.script_name[:-1], path.lstrip('/') diff --git a/vendor/werkzeug/script.py b/vendor/werkzeug/script.py index 486eeb2d..cfff3c11 100644 --- a/vendor/werkzeug/script.py +++ b/vendor/werkzeug/script.py @@ -67,7 +67,7 @@ r''' or as named parameters, pretty much like Python function calls. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. ''' from __future__ import print_function @@ -88,7 +88,7 @@ argument_types = { converters = { - 'boolean': lambda x: x.lower() in ('1', 'true', 'yes', 'on'), + 'boolean': lambda x: x.lower() in ('1', 'true', 'yes', 'on'), 'string': str, 'integer': int, 'float': float @@ -194,8 +194,7 @@ def find_actions(namespace, action_prefix): def print_usage(actions): """Print the usage information. (Help screen)""" - actions = actions.items() - actions.sort() + actions = sorted(iteritems(actions)) print('usage: %s []' % basename(sys.argv[0])) print(' %s --help' % basename(sys.argv[0])) print() @@ -260,6 +259,7 @@ def make_shell(init_func=None, banner=None, use_ipython=True): banner = 'Interactive Werkzeug Shell' if init_func is None: init_func = dict + def action(ipython=use_ipython): """Start a new interactive python session.""" namespace = init_func() @@ -310,7 +310,9 @@ def make_runserver(app_factory, hostname='localhost', port=5000, """Start a new development server.""" from werkzeug.serving import run_simple app = app_factory() - run_simple(hostname, port, app, reloader, debugger, evalex, - extra_files, 1, threaded, processes, + run_simple(hostname, port, app, + use_reloader=reloader, use_debugger=debugger, + use_evalex=evalex, extra_files=extra_files, + reloader_interval=1, threaded=threaded, processes=processes, static_files=static_files, ssl_context=ssl_context) return action diff --git a/vendor/werkzeug/security.py b/vendor/werkzeug/security.py index 6c129041..04bb912b 100644 --- a/vendor/werkzeug/security.py +++ b/vendor/werkzeug/security.py @@ -5,7 +5,7 @@ Security related helpers such as secure password hashing tools. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import os @@ -19,7 +19,7 @@ from operator import xor from itertools import starmap from werkzeug._compat import range_type, PY2, text_type, izip, to_bytes, \ - string_types, to_native + string_types, to_native SALT_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' @@ -27,7 +27,7 @@ DEFAULT_PBKDF2_ITERATIONS = 1000 _pack_int = Struct('>I').pack -_builtin_safe_str_cmp = getattr(hmac, 'digest_compare', None) +_builtin_safe_str_cmp = getattr(hmac, 'compare_digest', None) _sys_rng = SystemRandom() _os_alt_seps = list(sep for sep in [os.path.sep, os.path.altsep] if sep not in (None, '/')) @@ -48,28 +48,31 @@ _hash_funcs = _find_hashlib_algorithms() def pbkdf2_hex(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None): - """Like :func:`pbkdf2_bin` but returns a hex encoded string. + """Like :func:`pbkdf2_bin`, but returns a hex-encoded string. .. versionadded:: 0.9 :param data: the data to derive. :param salt: the salt for the derivation. :param iterations: the number of iterations. - :param keylen: the length of the resulting key. If not provided + :param keylen: the length of the resulting key. If not provided, the digest size will be used. :param hashfunc: the hash function to use. This can either be the - string name of a known hash function or a function + string name of a known hash function, or a function from the hashlib module. Defaults to sha1. """ rv = pbkdf2_bin(data, salt, iterations, keylen, hashfunc) return to_native(codecs.encode(rv, 'hex_codec')) +_has_native_pbkdf2 = hasattr(hashlib, 'pbkdf2_hmac') + + def pbkdf2_bin(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, keylen=None, hashfunc=None): """Returns a binary digest for the PBKDF2 hash algorithm of `data` - with the given `salt`. It iterates `iterations` time and produces a - key of `keylen` bytes. By default SHA-1 is used as hash function, + with the given `salt`. It iterates `iterations` times and produces a + key of `keylen` bytes. By default, SHA-1 is used as hash function; a different hashlib `hashfunc` can be provided. .. versionadded:: 0.9 @@ -87,10 +90,23 @@ def pbkdf2_bin(data, salt, iterations=DEFAULT_PBKDF2_ITERATIONS, hashfunc = _hash_funcs[hashfunc] elif not hashfunc: hashfunc = hashlib.sha1 + data = to_bytes(data) salt = to_bytes(salt) - mac = hmac.HMAC(to_bytes(data), None, hashfunc) + + # If we're on Python with pbkdf2_hmac we can try to use it for + # compatible digests. + if _has_native_pbkdf2: + _test_hash = hashfunc() + if hasattr(_test_hash, 'name') and \ + _test_hash.name in _hash_funcs: + return hashlib.pbkdf2_hmac(_test_hash.name, + data, salt, iterations, + keylen) + + mac = hmac.HMAC(data, None, hashfunc) if not keylen: keylen = mac.digest_size + def _pseudorandom(x, mac=mac): h = mac.copy() h.update(x) @@ -109,28 +125,36 @@ def safe_str_cmp(a, b): """This function compares strings in somewhat constant time. This requires that the length of at least one string is known in advance. - Returns `True` if the two strings are equal or `False` if they are not. + Returns `True` if the two strings are equal, or `False` if they are not. .. versionadded:: 0.7 """ + if isinstance(a, text_type): + a = a.encode('utf-8') + if isinstance(b, text_type): + b = b.encode('utf-8') + if _builtin_safe_str_cmp is not None: return _builtin_safe_str_cmp(a, b) + if len(a) != len(b): return False + rv = 0 - if isinstance(a, bytes) and isinstance(b, bytes) and not PY2: - for x, y in izip(a, b): - rv |= x ^ y - else: + if PY2: for x, y in izip(a, b): rv |= ord(x) ^ ord(y) + else: + for x, y in izip(a, b): + rv |= x ^ y + return rv == 0 def gen_salt(length): """Generate a random string of SALT_CHARS with specified ``length``.""" if length <= 0: - raise ValueError('requested salt of length <= 0') + raise ValueError('Salt length must be positive') return ''.join(_sys_rng.choice(SALT_CHARS) for _ in range_type(length)) @@ -196,11 +220,11 @@ def generate_password_hash(password, method='pbkdf2:sha1', salt_length=8): pbkdf2:sha1:2000$salt$hash pbkdf2:sha1$salt$hash - :param password: the password to hash - :param method: the hash method to use (one that hashlib supports), can - optionally be in the format ``pbpdf2:[:iterations]`` + :param password: the password to hash. + :param method: the hash method to use (one that hashlib supports). Can + optionally be in the format ``pbkdf2:[:iterations]`` to enable PBKDF2. - :param salt_length: the length of the salt in letters + :param salt_length: the length of the salt in letters. """ salt = method != 'plain' and gen_salt(salt_length) or '' h, actual_method = _hash_internal(method, salt, password) @@ -215,8 +239,8 @@ def check_password_hash(pwhash, password): Returns `True` if the password matched, `False` otherwise. :param pwhash: a hashed string like returned by - :func:`generate_password_hash` - :param password: the plaintext password to compare against the hash + :func:`generate_password_hash`. + :param password: the plaintext password to compare against the hash. """ if pwhash.count('$') < 2: return False diff --git a/vendor/werkzeug/serving.py b/vendor/werkzeug/serving.py index 2fb8660f..d6abbc31 100644 --- a/vendor/werkzeug/serving.py +++ b/vendor/werkzeug/serving.py @@ -32,7 +32,7 @@ instead of a simple start file. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ from __future__ import with_statement @@ -40,14 +40,26 @@ from __future__ import with_statement import os import socket import sys -import time import signal -import subprocess try: - import thread + import ssl except ImportError: - import _thread as thread + class _SslDummy(object): + def __getattr__(self, name): + raise RuntimeError('SSL support unavailable') + ssl = _SslDummy() + + +def _get_openssl_crypto_module(): + try: + from OpenSSL import crypto + except ImportError: + raise TypeError('Using ad-hoc certificates requires the pyOpenSSL ' + 'library.') + else: + return crypto + try: from SocketServer import ThreadingMixIn, ForkingMixIn @@ -56,15 +68,20 @@ except ImportError: from socketserver import ThreadingMixIn, ForkingMixIn from http.server import HTTPServer, BaseHTTPRequestHandler +# important: do not use relative imports here or python -m will break import werkzeug from werkzeug._internal import _log -from werkzeug._compat import iteritems, PY2, reraise, text_type, \ - wsgi_encoding_dance +from werkzeug._compat import PY2, reraise, wsgi_encoding_dance from werkzeug.urls import url_parse, url_unquote -from werkzeug.exceptions import InternalServerError, BadRequest +from werkzeug.exceptions import InternalServerError + + +LISTEN_QUEUE = 128 +can_open_by_fd = hasattr(socket, 'fromfd') class WSGIRequestHandler(BaseHTTPRequestHandler, object): + """A request handler that implements WSGI dispatching.""" @property @@ -88,8 +105,7 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): 'wsgi.multithread': self.server.multithread, 'wsgi.multiprocess': self.server.multiprocess, 'wsgi.run_once': False, - 'werkzeug.server.shutdown': - shutdown_server, + 'werkzeug.server.shutdown': shutdown_server, 'SERVER_SOFTWARE': self.server_version, 'REQUEST_METHOD': self.command, 'SCRIPT_NAME': '', @@ -97,8 +113,8 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): 'QUERY_STRING': wsgi_encoding_dance(request_url.query), 'CONTENT_TYPE': self.headers.get('Content-Type', ''), 'CONTENT_LENGTH': self.headers.get('Content-Length', ''), - 'REMOTE_ADDR': self.client_address[0], - 'REMOTE_PORT': self.client_address[1], + 'REMOTE_ADDR': self.address_string(), + 'REMOTE_PORT': self.port_integer(), 'SERVER_NAME': self.server.server_address[0], 'SERVER_PORT': str(self.server.server_address[1]), 'SERVER_PROTOCOL': self.request_version @@ -109,7 +125,7 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): if key not in ('HTTP_CONTENT_TYPE', 'HTTP_CONTENT_LENGTH'): environ[key] = value - if request_url.netloc: + if request_url.scheme and request_url.netloc: environ['HTTP_HOST'] = request_url.netloc return environ @@ -118,7 +134,7 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): if self.headers.get('Expect', '').lower().strip() == '100-continue': self.wfile.write(b'HTTP/1.1 100 Continue\r\n\r\n') - environ = self.make_environ() + self.environ = environ = self.make_environ() headers_set = [] headers_sent = [] @@ -145,7 +161,7 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): self.send_header('Date', self.date_time_string()) self.end_headers() - assert type(data) is bytes, 'applications must write bytes' + assert isinstance(data, bytes), 'applications must write bytes' self.wfile.write(data) self.wfile.flush() @@ -249,6 +265,9 @@ class WSGIRequestHandler(BaseHTTPRequestHandler, object): def address_string(self): return self.client_address[0] + def port_integer(self): + return self.client_address[1] + def log_request(self, code='-', size='-'): self.log('info', '"%s" %s %s', self.requestline, code, size) @@ -270,14 +289,14 @@ BaseRequestHandler = WSGIRequestHandler def generate_adhoc_ssl_pair(cn=None): from random import random - from OpenSSL import crypto + crypto = _get_openssl_crypto_module() # pretty damn sure that this is not actually accepted by anyone if cn is None: cn = '*' cert = crypto.X509() - cert.set_serial_number(int(random() * sys.maxint)) + cert.set_serial_number(int(random() * sys.maxsize)) cert.gmtime_adj_notBefore(0) cert.gmtime_adj_notAfter(60 * 60 * 24 * 365) @@ -290,7 +309,7 @@ def generate_adhoc_ssl_pair(cn=None): issuer.O = 'Self-Signed' pkey = crypto.PKey() - pkey.generate_key(crypto.TYPE_RSA, 768) + pkey.generate_key(crypto.TYPE_RSA, 1024) cert.set_pubkey(pkey) cert.sign(pkey, 'md5') @@ -323,9 +342,9 @@ def make_ssl_devcert(base_path, host=None, cn=None): cert_file = base_path + '.crt' pkey_file = base_path + '.key' - with open(cert_file, 'w') as f: + with open(cert_file, 'wb') as f: f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) - with open(pkey_file, 'w') as f: + with open(pkey_file, 'wb') as f: f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) return cert_file, pkey_file @@ -333,48 +352,76 @@ def make_ssl_devcert(base_path, host=None, cn=None): def generate_adhoc_ssl_context(): """Generates an adhoc SSL context for the development server.""" - from OpenSSL import SSL + crypto = _get_openssl_crypto_module() + import tempfile + import atexit + cert, pkey = generate_adhoc_ssl_pair() - ctx = SSL.Context(SSL.SSLv23_METHOD) - ctx.use_privatekey(pkey) - ctx.use_certificate(cert) + cert_handle, cert_file = tempfile.mkstemp() + pkey_handle, pkey_file = tempfile.mkstemp() + atexit.register(os.remove, pkey_file) + atexit.register(os.remove, cert_file) + + os.write(cert_handle, crypto.dump_certificate(crypto.FILETYPE_PEM, cert)) + os.write(pkey_handle, crypto.dump_privatekey(crypto.FILETYPE_PEM, pkey)) + os.close(cert_handle) + os.close(pkey_handle) + ctx = load_ssl_context(cert_file, pkey_file) return ctx -def load_ssl_context(cert_file, pkey_file): - """Loads an SSL context from a certificate and private key file.""" - from OpenSSL import SSL - ctx = SSL.Context(SSL.SSLv23_METHOD) - ctx.use_certificate_file(cert_file) - ctx.use_privatekey_file(pkey_file) +def load_ssl_context(cert_file, pkey_file=None, protocol=None): + """Loads SSL context from cert/private key files and optional protocol. + Many parameters are directly taken from the API of + :py:class:`ssl.SSLContext`. + + :param cert_file: Path of the certificate to use. + :param pkey_file: Path of the private key to use. If not given, the key + will be obtained from the certificate file. + :param protocol: One of the ``PROTOCOL_*`` constants in the stdlib ``ssl`` + module. Defaults to ``PROTOCOL_SSLv23``. + """ + if protocol is None: + protocol = ssl.PROTOCOL_SSLv23 + ctx = _SSLContext(protocol) + ctx.load_cert_chain(cert_file, pkey_file) return ctx +class _SSLContext(object): + + '''A dummy class with a small subset of Python3's ``ssl.SSLContext``, only + intended to be used with and by Werkzeug.''' + + def __init__(self, protocol): + self._protocol = protocol + self._certfile = None + self._keyfile = None + self._password = None + + def load_cert_chain(self, certfile, keyfile=None, password=None): + self._certfile = certfile + self._keyfile = keyfile or certfile + self._password = password + + def wrap_socket(self, sock, **kwargs): + return ssl.wrap_socket(sock, keyfile=self._keyfile, + certfile=self._certfile, + ssl_version=self._protocol, **kwargs) + + def is_ssl_error(error=None): """Checks if the given error (or the current one) is an SSL error.""" + exc_types = (ssl.SSLError,) + try: + from OpenSSL.SSL import Error + exc_types += (Error,) + except ImportError: + pass + if error is None: error = sys.exc_info()[1] - from OpenSSL import SSL - return isinstance(error, SSL.Error) - - -class _SSLConnectionFix(object): - """Wrapper around SSL connection to provide a working makefile().""" - - def __init__(self, con): - self._con = con - - def makefile(self, mode, bufsize): - return socket._fileobject(self._con, mode, bufsize) - - def __getattr__(self, attrib): - return getattr(self._con, attrib) - - def shutdown(self, arg=None): - try: - self._con.shutdown() - except Exception: - pass + return isinstance(error, exc_types) def select_ip_version(host, port): @@ -383,46 +430,62 @@ def select_ip_version(host, port): # and various operating systems. Probably this code also is # not supposed to work, but I can't come up with any other # ways to implement this. - ##try: - ## info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, - ## socket.SOCK_STREAM, 0, - ## socket.AI_PASSIVE) - ## if info: - ## return info[0][0] - ##except socket.gaierror: - ## pass + # try: + # info = socket.getaddrinfo(host, port, socket.AF_UNSPEC, + # socket.SOCK_STREAM, 0, + # socket.AI_PASSIVE) + # if info: + # return info[0][0] + # except socket.gaierror: + # pass if ':' in host and hasattr(socket, 'AF_INET6'): return socket.AF_INET6 return socket.AF_INET class BaseWSGIServer(HTTPServer, object): + """Simple single-threaded, single-process WSGI server.""" multithread = False multiprocess = False - request_queue_size = 128 + request_queue_size = LISTEN_QUEUE def __init__(self, host, port, app, handler=None, - passthrough_errors=False, ssl_context=None): + passthrough_errors=False, ssl_context=None, fd=None): if handler is None: handler = WSGIRequestHandler + self.address_family = select_ip_version(host, port) + + if fd is not None: + real_sock = socket.fromfd(fd, self.address_family, + socket.SOCK_STREAM) + port = 0 HTTPServer.__init__(self, (host, int(port)), handler) self.app = app self.passthrough_errors = passthrough_errors self.shutdown_signal = False + self.host = host + self.port = port + + # Patch in the original socket. + if fd is not None: + self.socket.close() + self.socket = real_sock + self.server_address = self.socket.getsockname() if ssl_context is not None: - try: - from OpenSSL import tsafe - except ImportError: - raise TypeError('SSL is not available if the OpenSSL ' - 'library is not installed.') if isinstance(ssl_context, tuple): ssl_context = load_ssl_context(*ssl_context) if ssl_context == 'adhoc': ssl_context = generate_adhoc_ssl_context() - self.socket = tsafe.Connection(ssl_context, self.socket) + # If we are on Python 2 the return value from socket.fromfd + # is an internal socket object but what we need for ssl wrap + # is the wrapper around it :( + sock = self.socket + if PY2 and not isinstance(sock, socket.socket): + sock = socket.socket(sock.family, sock.type, sock.proto, sock) + self.socket = ssl_context.wrap_socket(sock, server_side=True) self.ssl_context = ssl_context else: self.ssl_context = None @@ -436,39 +499,40 @@ class BaseWSGIServer(HTTPServer, object): HTTPServer.serve_forever(self) except KeyboardInterrupt: pass + finally: + self.server_close() def handle_error(self, request, client_address): if self.passthrough_errors: raise - else: - return HTTPServer.handle_error(self, request, client_address) + return HTTPServer.handle_error(self, request, client_address) def get_request(self): con, info = self.socket.accept() - if self.ssl_context is not None: - con = _SSLConnectionFix(con) return con, info class ThreadedWSGIServer(ThreadingMixIn, BaseWSGIServer): + """A WSGI server that does threading.""" multithread = True class ForkingWSGIServer(ForkingMixIn, BaseWSGIServer): + """A WSGI server that does forking.""" multiprocess = True def __init__(self, host, port, app, processes=40, handler=None, - passthrough_errors=False, ssl_context=None): + passthrough_errors=False, ssl_context=None, fd=None): BaseWSGIServer.__init__(self, host, port, app, handler, - passthrough_errors, ssl_context) + passthrough_errors, ssl_context, fd) self.max_children = processes -def make_server(host, port, app=None, threaded=False, processes=1, +def make_server(host=None, port=None, app=None, threaded=False, processes=1, request_handler=None, passthrough_errors=False, - ssl_context=None): + ssl_context=None, fd=None): """Create a new server instance that is either threaded, or forks or just processes one request after another. """ @@ -477,156 +541,32 @@ def make_server(host, port, app=None, threaded=False, processes=1, "multi process server.") elif threaded: return ThreadedWSGIServer(host, port, app, request_handler, - passthrough_errors, ssl_context) + passthrough_errors, ssl_context, fd=fd) elif processes > 1: return ForkingWSGIServer(host, port, app, processes, request_handler, - passthrough_errors, ssl_context) + passthrough_errors, ssl_context, fd=fd) else: return BaseWSGIServer(host, port, app, request_handler, - passthrough_errors, ssl_context) + passthrough_errors, ssl_context, fd=fd) -def _iter_module_files(): - # The list call is necessary on Python 3 in case the module - # dictionary modifies during iteration. - for module in list(sys.modules.values()): - filename = getattr(module, '__file__', None) - if filename: - old = None - while not os.path.isfile(filename): - old = filename - filename = os.path.dirname(filename) - if filename == old: - break - else: - if filename[-4:] in ('.pyc', '.pyo'): - filename = filename[:-1] - yield filename +def is_running_from_reloader(): + """Checks if the application is running from within the Werkzeug + reloader subprocess. - -def _reloader_stat_loop(extra_files=None, interval=1): - """When this function is run from the main thread, it will force other - threads to exit when any modules currently loaded change. - - Copyright notice. This function is based on the autoreload.py from - the CherryPy trac which originated from WSGIKit which is now dead. - - :param extra_files: a list of additional files it should watch. + .. versionadded:: 0.10 """ - from itertools import chain - mtimes = {} - while 1: - for filename in chain(_iter_module_files(), extra_files or ()): - try: - mtime = os.stat(filename).st_mtime - except OSError: - continue - - old_time = mtimes.get(filename) - if old_time is None: - mtimes[filename] = mtime - continue - elif mtime > old_time: - _log('info', ' * Detected change in %r, reloading' % filename) - sys.exit(3) - time.sleep(interval) - - -def _reloader_inotify(extra_files=None, interval=None): - # Mutated by inotify loop when changes occur. - changed = [False] - - # Setup inotify watches - from pyinotify import WatchManager, Notifier - - # this API changed at one point, support both - try: - from pyinotify import EventsCodes as ec - ec.IN_ATTRIB - except (ImportError, AttributeError): - import pyinotify as ec - - wm = WatchManager() - mask = ec.IN_DELETE_SELF | ec.IN_MOVE_SELF | ec.IN_MODIFY | ec.IN_ATTRIB - - def signal_changed(event): - if changed[0]: - return - _log('info', ' * Detected change in %r, reloading' % event.path) - changed[:] = [True] - - for fname in extra_files or (): - wm.add_watch(fname, mask, signal_changed) - - # ... And now we wait... - notif = Notifier(wm) - try: - while not changed[0]: - # always reiterate through sys.modules, adding them - for fname in _iter_module_files(): - wm.add_watch(fname, mask, signal_changed) - notif.process_events() - if notif.check_events(timeout=interval): - notif.read_events() - # TODO Set timeout to something small and check parent liveliness - finally: - notif.stop() - sys.exit(3) - - -# currently we always use the stat loop reloader for the simple reason -# that the inotify one does not respond to added files properly. Also -# it's quite buggy and the API is a mess. -reloader_loop = _reloader_stat_loop - - -def restart_with_reloader(): - """Spawn a new Python interpreter with the same arguments as this one, - but running the reloader thread. - """ - while 1: - _log('info', ' * Restarting with reloader') - args = [sys.executable] + sys.argv - new_environ = os.environ.copy() - new_environ['WERKZEUG_RUN_MAIN'] = 'true' - - # a weird bug on windows. sometimes unicode strings end up in the - # environment and subprocess.call does not like this, encode them - # to latin1 and continue. - if os.name == 'nt' and PY2: - for key, value in iteritems(new_environ): - if isinstance(value, text_type): - new_environ[key] = value.encode('iso-8859-1') - - exit_code = subprocess.call(args, env=new_environ) - if exit_code != 3: - return exit_code - - -def run_with_reloader(main_func, extra_files=None, interval=1): - """Run the given function in an independent python interpreter.""" - import signal - signal.signal(signal.SIGTERM, lambda *args: sys.exit(0)) - if os.environ.get('WERKZEUG_RUN_MAIN') == 'true': - thread.start_new_thread(main_func, ()) - try: - reloader_loop(extra_files, interval) - except KeyboardInterrupt: - return - try: - sys.exit(restart_with_reloader()) - except KeyboardInterrupt: - pass + return os.environ.get('WERKZEUG_RUN_MAIN') == 'true' def run_simple(hostname, port, application, use_reloader=False, use_debugger=False, use_evalex=True, - extra_files=None, reloader_interval=1, threaded=False, + extra_files=None, reloader_interval=1, + reloader_type='auto', threaded=False, processes=1, request_handler=None, static_files=None, passthrough_errors=False, ssl_context=None): - """Start an application using wsgiref and with an optional reloader. This - wraps `wsgiref` to fix the wrong default reporting of the multithreaded - WSGI variable and adds optional multithreading and fork support. + """Start a WSGI application. Optional features include a reloader, + multithreading and fork support. This function has a command-line interface too:: @@ -646,6 +586,11 @@ def run_simple(hostname, port, application, use_reloader=False, .. versionadded:: 0.9 Added command-line interface. + .. versionadded:: 0.10 + Improved the reloader and added support for changing the backend + through the `reloader_type` parameter. See :ref:`reloader` + for more information. + :param hostname: The host for the application. eg: ``'localhost'`` :param port: The port for the server. eg: ``8080`` :param application: the WSGI application to execute @@ -657,6 +602,10 @@ def run_simple(hostname, port, application, use_reloader=False, additionally to the modules. For example configuration files. :param reloader_interval: the interval for the reloader in seconds. + :param reloader_type: the type of reloader to use. The default is + auto detection. Valid values are ``'stat'`` and + ``'watchdog'``. See :ref:`reloader` for more + information. :param threaded: should the process handle each request in a separate thread? :param processes: if greater than 1 then handle each request in a new process @@ -673,11 +622,11 @@ def run_simple(hostname, port, application, use_reloader=False, :param passthrough_errors: set this to `True` to disable the error catching. This means that the server will die on errors but it can be useful to hook debuggers in (pdb etc.) - :param ssl_context: an SSL context for the connection. Either an OpenSSL - context, a tuple in the form ``(cert_file, pkey_file)``, - the string ``'adhoc'`` if the server should - automatically create one, or `None` to disable SSL - (which is the default). + :param ssl_context: an SSL context for the connection. Either an + :class:`ssl.SSLContext`, a tuple in the form + ``(cert_file, pkey_file)``, the string ``'adhoc'`` if + the server should automatically create one, or ``None`` + to disable SSL (which is the default). """ if use_debugger: from werkzeug.debug import DebuggedApplication @@ -686,29 +635,72 @@ def run_simple(hostname, port, application, use_reloader=False, from werkzeug.wsgi import SharedDataMiddleware application = SharedDataMiddleware(application, static_files) - def inner(): - make_server(hostname, port, application, threaded, - processes, request_handler, - passthrough_errors, ssl_context).serve_forever() - - if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': - display_hostname = hostname != '*' and hostname or 'localhost' + def log_startup(sock): + display_hostname = hostname not in ('', '*') and hostname or 'localhost' if ':' in display_hostname: display_hostname = '[%s]' % display_hostname - _log('info', ' * Running on %s://%s:%d/', ssl_context is None - and 'http' or 'https', display_hostname, port) + quit_msg = '(Press CTRL+C to quit)' + port = sock.getsockname()[1] + _log('info', ' * Running on %s://%s:%d/ %s', + ssl_context is None and 'http' or 'https', + display_hostname, port, quit_msg) + + def inner(): + try: + fd = int(os.environ['WERKZEUG_SERVER_FD']) + except (LookupError, ValueError): + fd = None + srv = make_server(hostname, port, application, threaded, + processes, request_handler, + passthrough_errors, ssl_context, + fd=fd) + if fd is None: + log_startup(srv.socket) + srv.serve_forever() + if use_reloader: - # Create and destroy a socket so that any exceptions are raised before - # we spawn a separate Python interpreter and lose this ability. - address_family = select_ip_version(hostname, port) - test_socket = socket.socket(address_family, socket.SOCK_STREAM) - test_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - test_socket.bind((hostname, port)) - test_socket.close() - run_with_reloader(inner, extra_files, reloader_interval) + # If we're not running already in the subprocess that is the + # reloader we want to open up a socket early to make sure the + # port is actually available. + if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': + if port == 0 and not can_open_by_fd: + raise ValueError('Cannot bind to a random port with enabled ' + 'reloader if the Python interpreter does ' + 'not support socket opening by fd.') + + # Create and destroy a socket so that any exceptions are + # raised before we spawn a separate Python interpreter and + # lose this ability. + address_family = select_ip_version(hostname, port) + s = socket.socket(address_family, socket.SOCK_STREAM) + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind((hostname, port)) + if hasattr(s, 'set_inheritable'): + s.set_inheritable(True) + + # If we can open the socket by file descriptor, then we can just + # reuse this one and our socket will survive the restarts. + if can_open_by_fd: + os.environ['WERKZEUG_SERVER_FD'] = str(s.fileno()) + s.listen(LISTEN_QUEUE) + log_startup(s) + else: + s.close() + + from ._reloader import run_with_reloader + run_with_reloader(inner, extra_files, reloader_interval, + reloader_type) else: inner() + +def run_with_reloader(*args, **kwargs): + # People keep using undocumented APIs. Do not use this function + # please, we do not guarantee that it continues working. + from ._reloader import run_with_reloader + return run_with_reloader(*args, **kwargs) + + def main(): '''A simple command-line interface for :py:func:`run_simple`.''' @@ -716,7 +708,8 @@ def main(): import optparse from werkzeug.utils import import_string - parser = optparse.OptionParser(usage='Usage: %prog [options] app_module:app_object') + parser = optparse.OptionParser( + usage='Usage: %prog [options] app_module:app_object') parser.add_option('-b', '--bind', dest='address', help='The hostname:port the app should listen on.') parser.add_option('-d', '--debug', dest='use_debugger', diff --git a/vendor/werkzeug/test.py b/vendor/werkzeug/test.py index 4b9c7431..84f1cd94 100644 --- a/vendor/werkzeug/test.py +++ b/vendor/werkzeug/test.py @@ -5,7 +5,7 @@ This module implements a client to WSGI applications for testing. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import sys @@ -22,20 +22,20 @@ except ImportError: from urllib.request import Request as U2Request try: from http.cookiejar import CookieJar -except ImportError: # Py2 +except ImportError: # Py2 from cookielib import CookieJar -from werkzeug._compat import iterlists, iteritems, itervalues, to_native, \ - string_types, text_type, reraise, wsgi_encoding_dance, \ - make_literal_wrapper +from werkzeug._compat import iterlists, iteritems, itervalues, to_bytes, \ + string_types, text_type, reraise, wsgi_encoding_dance, \ + make_literal_wrapper from werkzeug._internal import _empty_stream, _get_environ from werkzeug.wrappers import BaseRequest from werkzeug.urls import url_encode, url_fix, iri_to_uri, url_unquote, \ - url_unparse, url_parse + url_unparse, url_parse from werkzeug.wsgi import get_host, get_current_url, ClosingIterator from werkzeug.utils import dump_cookie from werkzeug.datastructures import FileMultiDict, MultiDict, \ - CombinedMultiDict, Headers, FileStorage + CombinedMultiDict, Headers, FileStorage def stream_encode_multipart(values, use_tempfile=True, threshold=1024 * 500, @@ -97,11 +97,12 @@ def stream_encode_multipart(values, use_tempfile=True, threshold=1024 * 500, break write_binary(chunk) else: - if isinstance(value, string_types): - value = to_native(value, charset) - else: + if not isinstance(value, string_types): value = str(value) - write('\r\n\r\n' + value) + + value = to_bytes(value, charset) + write('\r\n\r\n') + write_binary(value) write('\r\n') write('--%s--\r\n' % boundary) @@ -128,6 +129,7 @@ def File(fd, filename=None, mimetype=None): class _TestCookieHeaders(object): + """A headers adapter for cookielib """ @@ -151,6 +153,7 @@ class _TestCookieHeaders(object): class _TestCookieResponse(object): + """Something that looks like a httplib.HTTPResponse, but is actually just an adapter for our test responses to make them available for cookielib. """ @@ -163,6 +166,7 @@ class _TestCookieResponse(object): class _TestCookieJar(CookieJar): + """A cookielib.CookieJar modified to inject and read cookie headers from and to wsgi environments, and wsgi application responses. """ @@ -206,6 +210,7 @@ def _iter_data(data): class EnvironBuilder(object): + """This class can be used to conveniently create a WSGI environment for testing purposes. It can be used to quickly create WSGI environments or request objects from arbitrary data. @@ -303,7 +308,8 @@ class EnvironBuilder(object): elif not isinstance(headers, Headers): headers = Headers(headers) self.headers = headers - self.content_type = content_type + if content_type is not None: + self.content_type = content_type if errors_stream is None: errors_stream = sys.stderr self.errors_stream = errors_stream @@ -377,9 +383,9 @@ class EnvironBuilder(object): def _get_content_type(self): ct = self.headers.get('Content-Type') if ct is None and not self._input_stream: - if self.method in ('POST', 'PUT', 'PATCH'): - if self._files: - return 'multipart/form-data' + if self._files: + return 'multipart/form-data' + elif self._form: return 'application/x-www-form-urlencoded' return None return ct @@ -413,6 +419,7 @@ class EnvironBuilder(object): def form_property(name, storage, doc): key = '_' + name + def getter(self): if self._input_stream is not None: raise AttributeError('an input stream is defined') @@ -420,7 +427,9 @@ class EnvironBuilder(object): if rv is None: rv = storage() setattr(self, key, rv) + return rv + def setter(self, value): self._input_stream = None setattr(self, key, value) @@ -534,7 +543,7 @@ class EnvironBuilder(object): stream_encode_multipart(values, charset=self.charset) content_type += '; boundary="%s"' % boundary elif content_type == 'application/x-www-form-urlencoded': - #py2v3 review + # XXX: py2v3 review values = url_encode(self.form, charset=self.charset) values = values.encode('ascii') content_length = len(values) @@ -588,6 +597,7 @@ class EnvironBuilder(object): class ClientRedirectError(Exception): + """ If a redirect loop is detected when using follow_redirects=True with the :cls:`Client`, then this exception is raised. @@ -595,6 +605,7 @@ class ClientRedirectError(Exception): class Client(object): + """This class allows to send requests to a wrapped application. The response wrapper can be a class or factory function that takes @@ -678,6 +689,12 @@ class Client(object): raise RuntimeError('%r does not support redirect to ' 'external targets' % self.__class__) + status_code = int(response[1].split(None, 1)[0]) + if status_code == 307: + method = environ['REQUEST_METHOD'] + else: + method = 'GET' + # For redirect handling we temporarily disable the response # wrapper. This is not threadsafe but not a real concern # since the test client must not be shared anyways. @@ -686,7 +703,7 @@ class Client(object): try: return self.open(path=script_root, base_url=base_url, query_string=qs, as_tuple=True, - buffered=buffered) + buffered=buffered, method=method) finally: self.response_wrapper = old_response_wrapper @@ -746,7 +763,8 @@ class Client(object): raise ClientRedirectError('loop detected') redirect_chain.append(new_redirect_entry) environ, response = self.resolve_redirect(response, new_location, - environ, buffered=buffered) + environ, + buffered=buffered) if self.response_wrapper is not None: response = self.response_wrapper(*response) @@ -850,29 +868,29 @@ def run_wsgi_app(app, environ, buffered=False): response[:] = [status, headers] return buffer.append - app_iter = app(environ, start_response) + app_rv = app(environ, start_response) + close_func = getattr(app_rv, 'close', None) + app_iter = iter(app_rv) # when buffering we emit the close call early and convert the # application iterator into a regular list if buffered: - close_func = getattr(app_iter, 'close', None) try: app_iter = list(app_iter) finally: if close_func is not None: close_func() - # otherwise we iterate the application iter until we have - # a response, chain the already received data with the already - # collected data and wrap it in a new `ClosingIterator` if - # we have a close callable. + # otherwise we iterate the application iter until we have a response, chain + # the already received data with the already collected data and wrap it in + # a new `ClosingIterator` if we need to restore a `close` callable from the + # original return value. else: while not response: buffer.append(next(app_iter)) if buffer: - close_func = getattr(app_iter, 'close', None) app_iter = chain(buffer, app_iter) - if close_func is not None: - app_iter = ClosingIterator(app_iter, close_func) + if close_func is not None and app_iter is not app_rv: + app_iter = ClosingIterator(app_iter, close_func) return app_iter, response[0], Headers(response[1]) diff --git a/vendor/werkzeug/testapp.py b/vendor/werkzeug/testapp.py index 8efcf171..595555a0 100644 --- a/vendor/werkzeug/testapp.py +++ b/vendor/werkzeug/testapp.py @@ -6,7 +6,7 @@ Provide a small test application that can be used to test a WSGI server and check it for WSGI compliance. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import os @@ -17,8 +17,8 @@ from werkzeug.wrappers import BaseRequest as Request, BaseResponse as Response from werkzeug.utils import escape import base64 -logo = Response(base64.b64decode( -'''R0lGODlhoACgAOMIAAEDACwpAEpCAGdgAJaKAM28AOnVAP3rAP///////// +logo = Response(base64.b64decode(''' +R0lGODlhoACgAOMIAAEDACwpAEpCAGdgAJaKAM28AOnVAP3rAP///////// //////////////////////yH5BAEKAAgALAAAAACgAKAAAAT+EMlJq704680R+F0ojmRpnuj0rWnrv nB8rbRs33gu0bzu/0AObxgsGn3D5HHJbCUFyqZ0ukkSDlAidctNFg7gbI9LZlrBaHGtzAae0eloe25 7w9EDOX2fst/xenyCIn5/gFqDiVVDV4aGeYiKkhSFjnCQY5OTlZaXgZp8nJ2ekaB0SQOjqphrpnOiq @@ -147,7 +147,7 @@ def iter_sys_path(): for item in sys.path: path = os.path.join(cwd, item or os.path.curdir) yield strip(os.path.normpath(path)), \ - not os.path.isdir(path), path != item + not os.path.isdir(path), path != item def render_testapp(req): diff --git a/vendor/werkzeug/testsuite/__init__.py b/vendor/werkzeug/testsuite/__init__.py deleted file mode 100644 index dd834bc9..00000000 --- a/vendor/werkzeug/testsuite/__init__.py +++ /dev/null @@ -1,267 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite - ~~~~~~~~~~~~~~~~~~ - - Contains all test Werkzeug tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import re -import sys -import unittest -import shutil -import tempfile -import atexit - -from werkzeug.utils import find_modules -from werkzeug._compat import text_type, integer_types, reraise - - -def get_temporary_directory(): - directory = tempfile.mkdtemp() - @atexit.register - def remove_directory(): - try: - shutil.rmtree(directory) - except EnvironmentError: - pass - return directory - - -def iter_suites(package): - """Yields all testsuites.""" - for module in find_modules(package, include_packages=True): - mod = __import__(module, fromlist=['*']) - if hasattr(mod, 'suite'): - yield mod.suite() - - -def find_all_tests(suite): - """Yields all the tests and their names from a given suite.""" - suites = [suite] - while suites: - s = suites.pop() - try: - suites.extend(s) - except TypeError: - yield s, '%s.%s.%s' % ( - s.__class__.__module__, - s.__class__.__name__, - s._testMethodName - ) - - -class WerkzeugTestCase(unittest.TestCase): - """Baseclass for all the tests that Werkzeug uses. Use these - methods for testing instead of the camelcased ones in the - baseclass for consistency. - """ - - def setup(self): - pass - - def teardown(self): - pass - - def setUp(self): - self.setup() - - def tearDown(self): - unittest.TestCase.tearDown(self) - self.teardown() - - def assert_line_equal(self, x, y): - assert x == y, "lines not equal\n a = %r\n b = %r" % (x, y) - - def assert_equal(self, x, y, msg=None): - return self.assertEqual(x, y, msg) - - def assert_not_equal(self, x, y): - return self.assertNotEqual(x, y) - - def assert_raises(self, exc_type, callable=None, *args, **kwargs): - catcher = _ExceptionCatcher(self, exc_type) - if callable is None: - return catcher - with catcher: - callable(*args, **kwargs) - - if sys.version_info[:2] == (2, 6): - def assertIsNone(self, x): - assert x is None, "%r is not None" % (x,) - - def assertIsNotNone(self, x): - assert x is not None, "%r is None" % (x, ) - - def assertIn(self, x, y): - assert x in y, "%r not in %r" % (x, y) - - def assertNotIn(self, x, y): - assert x not in y, "%r in %r" % (x, y) - - def assertIsInstance(self, x, y): - assert isinstance(x, y), "not isinstance(%r, %r)" % (x, y) - - def assertIs(self, x, y): - assert x is y, "%r is not %r" % (x, y) - - def assertIsNot(self, x, y): - assert x is not y, "%r is %r" % (x, y) - - def assertSequenceEqual(self, x, y): - self.assertEqual(x, y) - - def assertRaisesRegex(self, exc_type, regex, *args, **kwargs): - catcher = _ExceptionCatcher(self, exc_type) - if not args: - return catcher - elif callable(args[0]): - with catcher: - args[0](*args[1:], **kwargs) - if args[0] is not None: - assert re.search(args[0], catcher.exc_value[0]) - else: - raise NotImplementedError() - - elif sys.version_info[0] == 2: - def assertRaisesRegex(self, *args, **kwargs): - return self.assertRaisesRegexp(*args, **kwargs) - - def assert_is_none(self, x): - self.assertIsNone(x) - - def assert_is_not_none(self, x): - self.assertIsNotNone(x) - - def assert_in(self, x, y): - self.assertIn(x, y) - - def assert_is_instance(self, x, y): - self.assertIsInstance(x, y) - - def assert_not_in(self, x, y): - self.assertNotIn(x, y) - - def assert_is(self, x, y): - self.assertIs(x, y) - - def assert_is_not(self, x, y): - self.assertIsNot(x, y) - - def assert_true(self, x): - self.assertTrue(x) - - def assert_false(self, x): - self.assertFalse(x) - - def assert_raises_regex(self, *args, **kwargs): - return self.assertRaisesRegex(*args, **kwargs) - - def assert_sequence_equal(self, x, y): - self.assertSequenceEqual(x, y) - - def assert_strict_equal(self, x, y): - '''Stricter version of assert_equal that doesn't do implicit conversion - between unicode and strings''' - self.assert_equal(x, y) - assert issubclass(type(x), type(y)) or issubclass(type(y), type(x)), \ - '%s != %s' % (type(x), type(y)) - if isinstance(x, (bytes, text_type, integer_types)) or x is None: - return - elif isinstance(x, dict) or isinstance(y, dict): - x = sorted(x.items()) - y = sorted(y.items()) - elif isinstance(x, set) or isinstance(y, set): - x = sorted(x) - y = sorted(y) - rx, ry = repr(x), repr(y) - if rx != ry: - rx = rx[:200] + (rx[200:] and '...') - ry = ry[:200] + (ry[200:] and '...') - raise AssertionError(rx, ry) - assert repr(x) == repr(y), repr((x, y))[:200] - - -class _ExceptionCatcher(object): - - def __init__(self, test_case, exc_type): - self.test_case = test_case - self.exc_type = exc_type - self.exc_value = None - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, tb): - exception_name = self.exc_type.__name__ - if exc_type is None: - self.test_case.fail('Expected exception of type %r' % - exception_name) - elif not issubclass(exc_type, self.exc_type): - reraise(exc_type, exc_value, tb) - self.exc_value = exc_value - return True - - -class BetterLoader(unittest.TestLoader): - """A nicer loader that solves two problems. First of all we are setting - up tests from different sources and we're doing this programmatically - which breaks the default loading logic so this is required anyways. - Secondly this loader has a nicer interpolation for test names than the - default one so you can just do ``run-tests.py ViewTestCase`` and it - will work. - """ - - def getRootSuite(self): - return suite() - - def loadTestsFromName(self, name, module=None): - root = self.getRootSuite() - if name == 'suite': - return root - - all_tests = [] - for testcase, testname in find_all_tests(root): - if testname == name or \ - testname.endswith('.' + name) or \ - ('.' + name + '.') in testname or \ - testname.startswith(name + '.'): - all_tests.append(testcase) - - if not all_tests: - raise LookupError('could not find test case for "%s"' % name) - - if len(all_tests) == 1: - return all_tests[0] - rv = unittest.TestSuite() - for test in all_tests: - rv.addTest(test) - return rv - - -def suite(): - """A testsuite that has all the Flask tests. You can use this - function to integrate the Flask tests into your own testsuite - in case you want to test that monkeypatches to Flask do not - break it. - """ - suite = unittest.TestSuite() - for other_suite in iter_suites(__name__): - suite.addTest(other_suite) - return suite - - -def main(): - """Runs the testsuite as command line application.""" - try: - unittest.main(testLoader=BetterLoader(), defaultTest='suite') - except Exception: - import sys - import traceback - traceback.print_exc() - sys.exit(1) diff --git a/vendor/werkzeug/testsuite/compat.py b/vendor/werkzeug/testsuite/compat.py deleted file mode 100644 index 6d811116..00000000 --- a/vendor/werkzeug/testsuite/compat.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.compat - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Ensure that old stuff does not break on update. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -import warnings -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.wrappers import Response -from werkzeug.test import create_environ - - -class CompatTestCase(WerkzeugTestCase): - - def test_old_imports(self): - from werkzeug.utils import Headers, MultiDict, CombinedMultiDict, \ - Headers, EnvironHeaders - from werkzeug.http import Accept, MIMEAccept, CharsetAccept, \ - LanguageAccept, ETags, HeaderSet, WWWAuthenticate, \ - Authorization - - def test_exposed_werkzeug_mod(self): - import werkzeug - for key in werkzeug.__all__: - # deprecated, skip it - if key in ('templates', 'Template'): - continue - getattr(werkzeug, key) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(CompatTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/__init__.py b/vendor/werkzeug/testsuite/contrib/__init__.py deleted file mode 100644 index d6d011c7..00000000 --- a/vendor/werkzeug/testsuite/contrib/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.contrib - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the contrib modules. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -from werkzeug.testsuite import iter_suites - - -def suite(): - suite = unittest.TestSuite() - for other_suite in iter_suites(__name__): - suite.addTest(other_suite) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/cache.py b/vendor/werkzeug/testsuite/contrib/cache.py deleted file mode 100644 index aa075adf..00000000 --- a/vendor/werkzeug/testsuite/contrib/cache.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.cache - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the cache system - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import time -import unittest -import tempfile -import shutil - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.contrib import cache - -try: - import redis - try: - from redis.exceptions import ConnectionError as RedisConnectionError - cache.RedisCache(key_prefix='werkzeug-test-case:')._client.set('test','connection') - except RedisConnectionError: - redis = None -except ImportError: - redis = None - - -class SimpleCacheTestCase(WerkzeugTestCase): - - def test_get_dict(self): - c = cache.SimpleCache() - c.set('a', 'a') - c.set('b', 'b') - d = c.get_dict('a', 'b') - assert 'a' in d - assert 'a' == d['a'] - assert 'b' in d - assert 'b' == d['b'] - - def test_set_many(self): - c = cache.SimpleCache() - c.set_many({0: 0, 1: 1, 2: 4}) - assert c.get(2) == 4 - c.set_many((i, i*i) for i in range(3)) - assert c.get(2) == 4 - - -class FileSystemCacheTestCase(WerkzeugTestCase): - - def test_set_get(self): - tmp_dir = tempfile.mkdtemp() - try: - c = cache.FileSystemCache(cache_dir=tmp_dir) - for i in range(3): - c.set(str(i), i * i) - for i in range(3): - result = c.get(str(i)) - assert result == i * i - finally: - shutil.rmtree(tmp_dir) - - def test_filesystemcache_prune(self): - THRESHOLD = 13 - tmp_dir = tempfile.mkdtemp() - c = cache.FileSystemCache(cache_dir=tmp_dir, threshold=THRESHOLD) - for i in range(2 * THRESHOLD): - c.set(str(i), i) - cache_files = os.listdir(tmp_dir) - shutil.rmtree(tmp_dir) - assert len(cache_files) <= THRESHOLD - - - def test_filesystemcache_clear(self): - tmp_dir = tempfile.mkdtemp() - c = cache.FileSystemCache(cache_dir=tmp_dir) - c.set('foo', 'bar') - cache_files = os.listdir(tmp_dir) - assert len(cache_files) == 1 - c.clear() - cache_files = os.listdir(tmp_dir) - assert len(cache_files) == 0 - shutil.rmtree(tmp_dir) - - -class RedisCacheTestCase(WerkzeugTestCase): - - def make_cache(self): - return cache.RedisCache(key_prefix='werkzeug-test-case:') - - def teardown(self): - self.make_cache().clear() - - def test_compat(self): - c = self.make_cache() - c._client.set(c.key_prefix + 'foo', 'Awesome') - self.assert_equal(c.get('foo'), 'Awesome') - c._client.set(c.key_prefix + 'foo', '42') - self.assert_equal(c.get('foo'), 42) - - def test_get_set(self): - c = self.make_cache() - c.set('foo', ['bar']) - assert c.get('foo') == ['bar'] - - def test_get_many(self): - c = self.make_cache() - c.set('foo', ['bar']) - c.set('spam', 'eggs') - assert c.get_many('foo', 'spam') == [['bar'], 'eggs'] - - def test_set_many(self): - c = self.make_cache() - c.set_many({'foo': 'bar', 'spam': ['eggs']}) - assert c.get('foo') == 'bar' - assert c.get('spam') == ['eggs'] - - def test_expire(self): - c = self.make_cache() - c.set('foo', 'bar', 1) - time.sleep(2) - assert c.get('foo') is None - - def test_add(self): - c = self.make_cache() - # sanity check that add() works like set() - c.add('foo', 'bar') - assert c.get('foo') == 'bar' - c.add('foo', 'qux') - assert c.get('foo') == 'bar' - - def test_delete(self): - c = self.make_cache() - c.add('foo', 'bar') - assert c.get('foo') == 'bar' - c.delete('foo') - assert c.get('foo') is None - - def test_delete_many(self): - c = self.make_cache() - c.add('foo', 'bar') - c.add('spam', 'eggs') - c.delete_many('foo', 'spam') - assert c.get('foo') is None - assert c.get('spam') is None - - def test_inc_dec(self): - c = self.make_cache() - c.set('foo', 1) - assert c.inc('foo') == 2 - assert c.dec('foo') == 1 - c.delete('foo') - - - def test_true_false(self): - c = self.make_cache() - c.set('foo', True) - assert c.get('foo') == True - c.set('bar', False) - assert c.get('bar') == False - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SimpleCacheTestCase)) - suite.addTest(unittest.makeSuite(FileSystemCacheTestCase)) - if redis is not None: - suite.addTest(unittest.makeSuite(RedisCacheTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/fixers.py b/vendor/werkzeug/testsuite/contrib/fixers.py deleted file mode 100644 index 699a858e..00000000 --- a/vendor/werkzeug/testsuite/contrib/fixers.py +++ /dev/null @@ -1,193 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.fixers - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Server / Browser fixers. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.datastructures import ResponseCacheControl -from werkzeug.http import parse_cache_control_header - -from werkzeug.test import create_environ, Client -from werkzeug.wrappers import Request, Response -from werkzeug.contrib import fixers -from werkzeug.utils import redirect - - -@Request.application -def path_check_app(request): - return Response('PATH_INFO: %s\nSCRIPT_NAME: %s' % ( - request.environ.get('PATH_INFO', ''), - request.environ.get('SCRIPT_NAME', '') - )) - - -class ServerFixerTestCase(WerkzeugTestCase): - - def test_cgi_root_fix(self): - app = fixers.CGIRootFix(path_check_app) - response = Response.from_app(app, dict(create_environ(), - SCRIPT_NAME='/foo', - PATH_INFO='/bar', - SERVER_SOFTWARE='lighttpd/1.4.27' - )) - self.assert_equal(response.get_data(), - b'PATH_INFO: /foo/bar\nSCRIPT_NAME: ') - - def test_cgi_root_fix_custom_app_root(self): - app = fixers.CGIRootFix(path_check_app, app_root='/baz/poop/') - response = Response.from_app(app, dict(create_environ(), - SCRIPT_NAME='/foo', - PATH_INFO='/bar' - )) - self.assert_equal(response.get_data(), b'PATH_INFO: /foo/bar\nSCRIPT_NAME: baz/poop') - - def test_path_info_from_request_uri_fix(self): - app = fixers.PathInfoFromRequestUriFix(path_check_app) - for key in 'REQUEST_URI', 'REQUEST_URL', 'UNENCODED_URL': - env = dict(create_environ(), SCRIPT_NAME='/test', PATH_INFO='/?????') - env[key] = '/test/foo%25bar?drop=this' - response = Response.from_app(app, env) - self.assert_equal(response.get_data(), b'PATH_INFO: /foo%bar\nSCRIPT_NAME: /test') - - def test_proxy_fix(self): - @Request.application - def app(request): - return Response('%s|%s' % ( - request.remote_addr, - # do not use request.host as this fixes too :) - request.environ['HTTP_HOST'] - )) - app = fixers.ProxyFix(app, num_proxies=2) - environ = dict(create_environ(), - HTTP_X_FORWARDED_PROTO="https", - HTTP_X_FORWARDED_HOST='example.com', - HTTP_X_FORWARDED_FOR='1.2.3.4, 5.6.7.8', - REMOTE_ADDR='127.0.0.1', - HTTP_HOST='fake' - ) - - response = Response.from_app(app, environ) - - self.assert_equal(response.get_data(), b'1.2.3.4|example.com') - - # And we must check that if it is a redirection it is - # correctly done: - - redirect_app = redirect('/foo/bar.hml') - response = Response.from_app(redirect_app, environ) - - wsgi_headers = response.get_wsgi_headers(environ) - assert wsgi_headers['Location'] == 'https://example.com/foo/bar.hml' - - def test_proxy_fix_weird_enum(self): - @fixers.ProxyFix - @Request.application - def app(request): - return Response(request.remote_addr) - environ = dict(create_environ(), - HTTP_X_FORWARDED_FOR=',', - REMOTE_ADDR='127.0.0.1', - ) - - response = Response.from_app(app, environ) - self.assert_strict_equal(response.get_data(), b'127.0.0.1') - - def test_header_rewriter_fix(self): - @Request.application - def application(request): - return Response("", headers=[ - ('X-Foo', 'bar') - ]) - application = fixers.HeaderRewriterFix(application, ('X-Foo',), (('X-Bar', '42'),)) - response = Response.from_app(application, create_environ()) - assert response.headers['Content-Type'] == 'text/plain; charset=utf-8' - assert 'X-Foo' not in response.headers - assert response.headers['X-Bar'] == '42' - - -class BrowserFixerTestCase(WerkzeugTestCase): - - def test_ie_fixes(self): - @fixers.InternetExplorerFix - @Request.application - def application(request): - response = Response('binary data here', mimetype='application/vnd.ms-excel') - response.headers['Vary'] = 'Cookie' - response.headers['Content-Disposition'] = 'attachment; filename=foo.xls' - return response - - c = Client(application, Response) - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - - # IE gets no vary - self.assert_equal(response.get_data(), b'binary data here') - assert 'vary' not in response.headers - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - assert response.headers['content-type'] == 'application/vnd.ms-excel' - - # other browsers do - c = Client(application, Response) - response = c.get('/') - self.assert_equal(response.get_data(), b'binary data here') - assert 'vary' in response.headers - - cc = ResponseCacheControl() - cc.no_cache = True - - @fixers.InternetExplorerFix - @Request.application - def application(request): - response = Response('binary data here', mimetype='application/vnd.ms-excel') - response.headers['Pragma'] = ', '.join(pragma) - response.headers['Cache-Control'] = cc.to_header() - response.headers['Content-Disposition'] = 'attachment; filename=foo.xls' - return response - - - # IE has no pragma or cache control - pragma = ('no-cache',) - c = Client(application, Response) - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - self.assert_equal(response.get_data(), b'binary data here') - assert 'pragma' not in response.headers - assert 'cache-control' not in response.headers - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - - # IE has simplified pragma - pragma = ('no-cache', 'x-foo') - cc.proxy_revalidate = True - response = c.get('/', headers=[ - ('User-Agent', 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)') - ]) - self.assert_equal(response.get_data(), b'binary data here') - assert response.headers['pragma'] == 'x-foo' - assert response.headers['cache-control'] == 'proxy-revalidate' - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - - # regular browsers get everything - response = c.get('/') - self.assert_equal(response.get_data(), b'binary data here') - assert response.headers['pragma'] == 'no-cache, x-foo' - cc = parse_cache_control_header(response.headers['cache-control'], - cls=ResponseCacheControl) - assert cc.no_cache - assert cc.proxy_revalidate - assert response.headers['content-disposition'] == 'attachment; filename=foo.xls' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(ServerFixerTestCase)) - suite.addTest(unittest.makeSuite(BrowserFixerTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/iterio.py b/vendor/werkzeug/testsuite/contrib/iterio.py deleted file mode 100644 index 704e4aec..00000000 --- a/vendor/werkzeug/testsuite/contrib/iterio.py +++ /dev/null @@ -1,184 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.iterio - ~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the iterio object. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -from functools import partial - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.contrib.iterio import IterIO, greenlet - - -class IterOTestSuite(WerkzeugTestCase): - - def test_basic_native(self): - io = IterIO(["Hello", "World", "1", "2", "3"]) - self.assert_equal(io.tell(), 0) - self.assert_equal(io.read(2), "He") - self.assert_equal(io.tell(), 2) - self.assert_equal(io.read(3), "llo") - self.assert_equal(io.tell(), 5) - io.seek(0) - self.assert_equal(io.read(5), "Hello") - self.assert_equal(io.tell(), 5) - self.assert_equal(io._buf, "Hello") - self.assert_equal(io.read(), "World123") - self.assert_equal(io.tell(), 13) - io.close() - assert io.closed - - io = IterIO(["Hello\n", "World!"]) - self.assert_equal(io.readline(), 'Hello\n') - self.assert_equal(io._buf, 'Hello\n') - self.assert_equal(io.read(), 'World!') - self.assert_equal(io._buf, 'Hello\nWorld!') - self.assert_equal(io.tell(), 12) - io.seek(0) - self.assert_equal(io.readlines(), ['Hello\n', 'World!']) - - io = IterIO(["foo\n", "bar"]) - io.seek(-4, 2) - self.assert_equal(io.read(4), '\nbar') - - self.assert_raises(IOError, io.seek, 2, 100) - io.close() - self.assert_raises(ValueError, io.read) - - def test_basic_bytes(self): - io = IterIO([b"Hello", b"World", b"1", b"2", b"3"]) - self.assert_equal(io.tell(), 0) - self.assert_equal(io.read(2), b"He") - self.assert_equal(io.tell(), 2) - self.assert_equal(io.read(3), b"llo") - self.assert_equal(io.tell(), 5) - io.seek(0) - self.assert_equal(io.read(5), b"Hello") - self.assert_equal(io.tell(), 5) - self.assert_equal(io._buf, b"Hello") - self.assert_equal(io.read(), b"World123") - self.assert_equal(io.tell(), 13) - io.close() - assert io.closed - - io = IterIO([b"Hello\n", b"World!"]) - self.assert_equal(io.readline(), b'Hello\n') - self.assert_equal(io._buf, b'Hello\n') - self.assert_equal(io.read(), b'World!') - self.assert_equal(io._buf, b'Hello\nWorld!') - self.assert_equal(io.tell(), 12) - io.seek(0) - self.assert_equal(io.readlines(), [b'Hello\n', b'World!']) - - io = IterIO([b"foo\n", b"bar"]) - io.seek(-4, 2) - self.assert_equal(io.read(4), b'\nbar') - - self.assert_raises(IOError, io.seek, 2, 100) - io.close() - self.assert_raises(ValueError, io.read) - - def test_basic_unicode(self): - io = IterIO([u"Hello", u"World", u"1", u"2", u"3"]) - self.assert_equal(io.tell(), 0) - self.assert_equal(io.read(2), u"He") - self.assert_equal(io.tell(), 2) - self.assert_equal(io.read(3), u"llo") - self.assert_equal(io.tell(), 5) - io.seek(0) - self.assert_equal(io.read(5), u"Hello") - self.assert_equal(io.tell(), 5) - self.assert_equal(io._buf, u"Hello") - self.assert_equal(io.read(), u"World123") - self.assert_equal(io.tell(), 13) - io.close() - assert io.closed - - io = IterIO([u"Hello\n", u"World!"]) - self.assert_equal(io.readline(), u'Hello\n') - self.assert_equal(io._buf, u'Hello\n') - self.assert_equal(io.read(), u'World!') - self.assert_equal(io._buf, u'Hello\nWorld!') - self.assert_equal(io.tell(), 12) - io.seek(0) - self.assert_equal(io.readlines(), [u'Hello\n', u'World!']) - - io = IterIO([u"foo\n", u"bar"]) - io.seek(-4, 2) - self.assert_equal(io.read(4), u'\nbar') - - self.assert_raises(IOError, io.seek, 2, 100) - io.close() - self.assert_raises(ValueError, io.read) - - def test_sentinel_cases(self): - io = IterIO([]) - self.assert_strict_equal(io.read(), '') - io = IterIO([], b'') - self.assert_strict_equal(io.read(), b'') - io = IterIO([], u'') - self.assert_strict_equal(io.read(), u'') - - io = IterIO([]) - self.assert_strict_equal(io.read(), '') - io = IterIO([b'']) - self.assert_strict_equal(io.read(), b'') - io = IterIO([u'']) - self.assert_strict_equal(io.read(), u'') - - io = IterIO([]) - self.assert_strict_equal(io.readline(), '') - io = IterIO([], b'') - self.assert_strict_equal(io.readline(), b'') - io = IterIO([], u'') - self.assert_strict_equal(io.readline(), u'') - - io = IterIO([]) - self.assert_strict_equal(io.readline(), '') - io = IterIO([b'']) - self.assert_strict_equal(io.readline(), b'') - io = IterIO([u'']) - self.assert_strict_equal(io.readline(), u'') - - -class IterITestSuite(WerkzeugTestCase): - - def test_basic(self): - def producer(out): - out.write('1\n') - out.write('2\n') - out.flush() - out.write('3\n') - iterable = IterIO(producer) - self.assert_equal(next(iterable), '1\n2\n') - self.assert_equal(next(iterable), '3\n') - self.assert_raises(StopIteration, next, iterable) - - def test_sentinel_cases(self): - def producer_dummy_flush(out): - out.flush() - iterable = IterIO(producer_dummy_flush) - self.assert_strict_equal(next(iterable), '') - - def producer_empty(out): - pass - iterable = IterIO(producer_empty) - self.assert_raises(StopIteration, next, iterable) - - iterable = IterIO(producer_dummy_flush, b'') - self.assert_strict_equal(next(iterable), b'') - iterable = IterIO(producer_dummy_flush, u'') - self.assert_strict_equal(next(iterable), u'') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(IterOTestSuite)) - if greenlet is not None: - suite.addTest(unittest.makeSuite(IterITestSuite)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/securecookie.py b/vendor/werkzeug/testsuite/contrib/securecookie.py deleted file mode 100644 index f30abcc7..00000000 --- a/vendor/werkzeug/testsuite/contrib/securecookie.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.securecookie - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the secure cookie. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.utils import parse_cookie -from werkzeug.wrappers import Request, Response -from werkzeug.contrib.securecookie import SecureCookie - - -class SecureCookieTestCase(WerkzeugTestCase): - - def test_basic_support(self): - c = SecureCookie(secret_key=b'foo') - assert c.new - assert not c.modified - assert not c.should_save - c['x'] = 42 - assert c.modified - assert c.should_save - s = c.serialize() - - c2 = SecureCookie.unserialize(s, b'foo') - assert c is not c2 - assert not c2.new - assert not c2.modified - assert not c2.should_save - self.assert_equal(c2, c) - - c3 = SecureCookie.unserialize(s, b'wrong foo') - assert not c3.modified - assert not c3.new - self.assert_equal(c3, {}) - - def test_wrapper_support(self): - req = Request.from_values() - resp = Response() - c = SecureCookie.load_cookie(req, secret_key=b'foo') - assert c.new - c['foo'] = 42 - self.assert_equal(c.secret_key, b'foo') - c.save_cookie(resp) - - req = Request.from_values(headers={ - 'Cookie': 'session="%s"' % parse_cookie(resp.headers['set-cookie'])['session'] - }) - c2 = SecureCookie.load_cookie(req, secret_key=b'foo') - assert not c2.new - self.assert_equal(c2, c) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SecureCookieTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/sessions.py b/vendor/werkzeug/testsuite/contrib/sessions.py deleted file mode 100644 index c81e5383..00000000 --- a/vendor/werkzeug/testsuite/contrib/sessions.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.sessions - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Added tests for the sessions. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -import shutil -from tempfile import mkdtemp, gettempdir - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.contrib.sessions import FilesystemSessionStore - - - -class SessionTestCase(WerkzeugTestCase): - - def setup(self): - self.session_folder = mkdtemp() - - def teardown(self): - shutil.rmtree(self.session_folder) - - def test_default_tempdir(self): - store = FilesystemSessionStore() - assert store.path == gettempdir() - - def test_basic_fs_sessions(self): - store = FilesystemSessionStore(self.session_folder) - x = store.new() - assert x.new - assert not x.modified - x['foo'] = [1, 2, 3] - assert x.modified - store.save(x) - - x2 = store.get(x.sid) - assert not x2.new - assert not x2.modified - assert x2 is not x - assert x2 == x - x2['test'] = 3 - assert x2.modified - assert not x2.new - store.save(x2) - - x = store.get(x.sid) - store.delete(x) - x2 = store.get(x.sid) - # the session is not new when it was used previously. - assert not x2.new - - def test_renewing_fs_session(self): - store = FilesystemSessionStore(self.session_folder, renew_missing=True) - x = store.new() - store.save(x) - store.delete(x) - x2 = store.get(x.sid) - assert x2.new - - def test_fs_session_lising(self): - store = FilesystemSessionStore(self.session_folder, renew_missing=True) - sessions = set() - for x in range(10): - sess = store.new() - store.save(sess) - sessions.add(sess.sid) - - listed_sessions = set(store.list()) - assert sessions == listed_sessions - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SessionTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/contrib/wrappers.py b/vendor/werkzeug/testsuite/contrib/wrappers.py deleted file mode 100644 index f29a6d87..00000000 --- a/vendor/werkzeug/testsuite/contrib/wrappers.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.contrib.wrappers - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Added tests for the sessions. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.contrib import wrappers -from werkzeug import routing -from werkzeug.wrappers import Request, Response - - -class WrappersTestCase(WerkzeugTestCase): - - def test_reverse_slash_behavior(self): - class MyRequest(wrappers.ReverseSlashBehaviorRequestMixin, Request): - pass - req = MyRequest.from_values('/foo/bar', 'http://example.com/test') - assert req.url == 'http://example.com/test/foo/bar' - assert req.path == 'foo/bar' - assert req.script_root == '/test/' - - # make sure the routing system works with the slashes in - # reverse order as well. - map = routing.Map([routing.Rule('/foo/bar', endpoint='foo')]) - adapter = map.bind_to_environ(req.environ) - assert adapter.match() == ('foo', {}) - adapter = map.bind(req.host, req.script_root) - assert adapter.match(req.path) == ('foo', {}) - - def test_dynamic_charset_request_mixin(self): - class MyRequest(wrappers.DynamicCharsetRequestMixin, Request): - pass - env = {'CONTENT_TYPE': 'text/html'} - req = MyRequest(env) - assert req.charset == 'latin1' - - env = {'CONTENT_TYPE': 'text/html; charset=utf-8'} - req = MyRequest(env) - assert req.charset == 'utf-8' - - env = {'CONTENT_TYPE': 'application/octet-stream'} - req = MyRequest(env) - assert req.charset == 'latin1' - assert req.url_charset == 'latin1' - - MyRequest.url_charset = 'utf-8' - env = {'CONTENT_TYPE': 'application/octet-stream'} - req = MyRequest(env) - assert req.charset == 'latin1' - assert req.url_charset == 'utf-8' - - def return_ascii(x): - return "ascii" - env = {'CONTENT_TYPE': 'text/plain; charset=x-weird-charset'} - req = MyRequest(env) - req.unknown_charset = return_ascii - assert req.charset == 'ascii' - assert req.url_charset == 'utf-8' - - def test_dynamic_charset_response_mixin(self): - class MyResponse(wrappers.DynamicCharsetResponseMixin, Response): - default_charset = 'utf-7' - resp = MyResponse(mimetype='text/html') - assert resp.charset == 'utf-7' - resp.charset = 'utf-8' - assert resp.charset == 'utf-8' - assert resp.mimetype == 'text/html' - assert resp.mimetype_params == {'charset': 'utf-8'} - resp.mimetype_params['charset'] = 'iso-8859-15' - assert resp.charset == 'iso-8859-15' - resp.set_data(u'Hällo Wörld') - assert b''.join(resp.iter_encoded()) == \ - u'Hällo Wörld'.encode('iso-8859-15') - del resp.headers['content-type'] - try: - resp.charset = 'utf-8' - except TypeError as e: - pass - else: - assert False, 'expected type error on charset setting without ct' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(WrappersTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/datastructures.py b/vendor/werkzeug/testsuite/datastructures.py deleted file mode 100644 index 5e1d1f97..00000000 --- a/vendor/werkzeug/testsuite/datastructures.py +++ /dev/null @@ -1,788 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.datastructures - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the functionality of the provided Werkzeug - datastructures. - - TODO: - - - FileMultiDict - - Immutable types undertested - - Split up dict tests - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import unittest -import pickle -from contextlib import contextmanager -from copy import copy - -from werkzeug import datastructures -from werkzeug._compat import iterkeys, itervalues, iteritems, iterlists, \ - iterlistvalues, text_type -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.exceptions import BadRequestKeyError - - -class NativeItermethodsTestCase(WerkzeugTestCase): - def test_basic(self): - @datastructures.native_itermethods(['keys', 'values', 'items']) - class StupidDict(object): - def keys(self, multi=1): - return iter(['a', 'b', 'c'] * multi) - - def values(self, multi=1): - return iter([1, 2, 3] * multi) - - def items(self, multi=1): - return iter(zip(iterkeys(self, multi=multi), - itervalues(self, multi=multi))) - - d = StupidDict() - expected_keys = ['a', 'b', 'c'] - expected_values = [1, 2, 3] - expected_items = list(zip(expected_keys, expected_values)) - - self.assert_equal(list(iterkeys(d)), expected_keys) - self.assert_equal(list(itervalues(d)), expected_values) - self.assert_equal(list(iteritems(d)), expected_items) - - self.assert_equal(list(iterkeys(d, 2)), expected_keys * 2) - self.assert_equal(list(itervalues(d, 2)), expected_values * 2) - self.assert_equal(list(iteritems(d, 2)), expected_items * 2) - - -class MutableMultiDictBaseTestCase(WerkzeugTestCase): - storage_class = None - - def test_pickle(self): - cls = self.storage_class - - for protocol in range(pickle.HIGHEST_PROTOCOL + 1): - d = cls() - d.setlist(b'foo', [1, 2, 3, 4]) - d.setlist(b'bar', b'foo bar baz'.split()) - s = pickle.dumps(d, protocol) - ud = pickle.loads(s) - self.assert_equal(type(ud), type(d)) - self.assert_equal(ud, d) - self.assert_equal(pickle.loads( - s.replace(b'werkzeug.datastructures', b'werkzeug')), d) - ud[b'newkey'] = b'bla' - self.assert_not_equal(ud, d) - - def test_basic_interface(self): - md = self.storage_class() - assert isinstance(md, dict) - - mapping = [('a', 1), ('b', 2), ('a', 2), ('d', 3), - ('a', 1), ('a', 3), ('d', 4), ('c', 3)] - md = self.storage_class(mapping) - - # simple getitem gives the first value - self.assert_equal(md['a'], 1) - self.assert_equal(md['c'], 3) - with self.assert_raises(KeyError): - md['e'] - self.assert_equal(md.get('a'), 1) - - # list getitem - self.assert_equal(md.getlist('a'), [1, 2, 1, 3]) - self.assert_equal(md.getlist('d'), [3, 4]) - # do not raise if key not found - self.assert_equal(md.getlist('x'), []) - - # simple setitem overwrites all values - md['a'] = 42 - self.assert_equal(md.getlist('a'), [42]) - - # list setitem - md.setlist('a', [1, 2, 3]) - self.assert_equal(md['a'], 1) - self.assert_equal(md.getlist('a'), [1, 2, 3]) - - # verify that it does not change original lists - l1 = [1, 2, 3] - md.setlist('a', l1) - del l1[:] - self.assert_equal(md['a'], 1) - - # setdefault, setlistdefault - self.assert_equal(md.setdefault('u', 23), 23) - self.assert_equal(md.getlist('u'), [23]) - del md['u'] - - md.setlist('u', [-1, -2]) - - # delitem - del md['u'] - with self.assert_raises(KeyError): - md['u'] - del md['d'] - self.assert_equal(md.getlist('d'), []) - - # keys, values, items, lists - self.assert_equal(list(sorted(md.keys())), ['a', 'b', 'c']) - self.assert_equal(list(sorted(iterkeys(md))), ['a', 'b', 'c']) - - self.assert_equal(list(sorted(itervalues(md))), [1, 2, 3]) - self.assert_equal(list(sorted(itervalues(md))), [1, 2, 3]) - - self.assert_equal(list(sorted(md.items())), - [('a', 1), ('b', 2), ('c', 3)]) - self.assert_equal(list(sorted(md.items(multi=True))), - [('a', 1), ('a', 2), ('a', 3), ('b', 2), ('c', 3)]) - self.assert_equal(list(sorted(iteritems(md))), - [('a', 1), ('b', 2), ('c', 3)]) - self.assert_equal(list(sorted(iteritems(md, multi=True))), - [('a', 1), ('a', 2), ('a', 3), ('b', 2), ('c', 3)]) - - self.assert_equal(list(sorted(md.lists())), - [('a', [1, 2, 3]), ('b', [2]), ('c', [3])]) - self.assert_equal(list(sorted(iterlists(md))), - [('a', [1, 2, 3]), ('b', [2]), ('c', [3])]) - - # copy method - c = md.copy() - self.assert_equal(c['a'], 1) - self.assert_equal(c.getlist('a'), [1, 2, 3]) - - # copy method 2 - c = copy(md) - self.assert_equal(c['a'], 1) - self.assert_equal(c.getlist('a'), [1, 2, 3]) - - # update with a multidict - od = self.storage_class([('a', 4), ('a', 5), ('y', 0)]) - md.update(od) - self.assert_equal(md.getlist('a'), [1, 2, 3, 4, 5]) - self.assert_equal(md.getlist('y'), [0]) - - # update with a regular dict - md = c - od = {'a': 4, 'y': 0} - md.update(od) - self.assert_equal(md.getlist('a'), [1, 2, 3, 4]) - self.assert_equal(md.getlist('y'), [0]) - - # pop, poplist, popitem, popitemlist - self.assert_equal(md.pop('y'), 0) - assert 'y' not in md - self.assert_equal(md.poplist('a'), [1, 2, 3, 4]) - assert 'a' not in md - self.assert_equal(md.poplist('missing'), []) - - # remaining: b=2, c=3 - popped = md.popitem() - assert popped in [('b', 2), ('c', 3)] - popped = md.popitemlist() - assert popped in [('b', [2]), ('c', [3])] - - # type conversion - md = self.storage_class({'a': '4', 'b': ['2', '3']}) - self.assert_equal(md.get('a', type=int), 4) - self.assert_equal(md.getlist('b', type=int), [2, 3]) - - # repr - md = self.storage_class([('a', 1), ('a', 2), ('b', 3)]) - assert "('a', 1)" in repr(md) - assert "('a', 2)" in repr(md) - assert "('b', 3)" in repr(md) - - # add and getlist - md.add('c', '42') - md.add('c', '23') - self.assert_equal(md.getlist('c'), ['42', '23']) - md.add('c', 'blah') - self.assert_equal(md.getlist('c', type=int), [42, 23]) - - # setdefault - md = self.storage_class() - md.setdefault('x', []).append(42) - md.setdefault('x', []).append(23) - self.assert_equal(md['x'], [42, 23]) - - # to dict - md = self.storage_class() - md['foo'] = 42 - md.add('bar', 1) - md.add('bar', 2) - self.assert_equal(md.to_dict(), {'foo': 42, 'bar': 1}) - self.assert_equal(md.to_dict(flat=False), {'foo': [42], 'bar': [1, 2]}) - - # popitem from empty dict - with self.assert_raises(KeyError): - self.storage_class().popitem() - - with self.assert_raises(KeyError): - self.storage_class().popitemlist() - - # key errors are of a special type - with self.assert_raises(BadRequestKeyError): - self.storage_class()[42] - - # setlist works - md = self.storage_class() - md['foo'] = 42 - md.setlist('foo', [1, 2]) - self.assert_equal(md.getlist('foo'), [1, 2]) - - -class ImmutableDictBaseTestCase(WerkzeugTestCase): - storage_class = None - - def test_follows_dict_interface(self): - cls = self.storage_class - - data = {'foo': 1, 'bar': 2, 'baz': 3} - d = cls(data) - - self.assert_equal(d['foo'], 1) - self.assert_equal(d['bar'], 2) - self.assert_equal(d['baz'], 3) - self.assert_equal(sorted(d.keys()), ['bar', 'baz', 'foo']) - self.assert_true('foo' in d) - self.assert_true('foox' not in d) - self.assert_equal(len(d), 3) - - def test_copies_are_mutable(self): - cls = self.storage_class - immutable = cls({'a': 1}) - with self.assert_raises(TypeError): - immutable.pop('a') - - mutable = immutable.copy() - mutable.pop('a') - self.assert_true('a' in immutable) - self.assert_true(mutable is not immutable) - self.assert_true(copy(immutable) is immutable) - - def test_dict_is_hashable(self): - cls = self.storage_class - immutable = cls({'a': 1, 'b': 2}) - immutable2 = cls({'a': 2, 'b': 2}) - x = set([immutable]) - self.assert_true(immutable in x) - self.assert_true(immutable2 not in x) - x.discard(immutable) - self.assert_true(immutable not in x) - self.assert_true(immutable2 not in x) - x.add(immutable2) - self.assert_true(immutable not in x) - self.assert_true(immutable2 in x) - x.add(immutable) - self.assert_true(immutable in x) - self.assert_true(immutable2 in x) - - -class ImmutableTypeConversionDictTestCase(ImmutableDictBaseTestCase): - storage_class = datastructures.ImmutableTypeConversionDict - - -class ImmutableMultiDictTestCase(ImmutableDictBaseTestCase): - storage_class = datastructures.ImmutableMultiDict - - def test_multidict_is_hashable(self): - cls = self.storage_class - immutable = cls({'a': [1, 2], 'b': 2}) - immutable2 = cls({'a': [1], 'b': 2}) - x = set([immutable]) - self.assert_true(immutable in x) - self.assert_true(immutable2 not in x) - x.discard(immutable) - self.assert_true(immutable not in x) - self.assert_true(immutable2 not in x) - x.add(immutable2) - self.assert_true(immutable not in x) - self.assert_true(immutable2 in x) - x.add(immutable) - self.assert_true(immutable in x) - self.assert_true(immutable2 in x) - - -class ImmutableDictTestCase(ImmutableDictBaseTestCase): - storage_class = datastructures.ImmutableDict - - -class ImmutableOrderedMultiDictTestCase(ImmutableDictBaseTestCase): - storage_class = datastructures.ImmutableOrderedMultiDict - - def test_ordered_multidict_is_hashable(self): - a = self.storage_class([('a', 1), ('b', 1), ('a', 2)]) - b = self.storage_class([('a', 1), ('a', 2), ('b', 1)]) - self.assert_not_equal(hash(a), hash(b)) - - -class MultiDictTestCase(MutableMultiDictBaseTestCase): - storage_class = datastructures.MultiDict - - def test_multidict_pop(self): - make_d = lambda: self.storage_class({'foo': [1, 2, 3, 4]}) - d = make_d() - self.assert_equal(d.pop('foo'), 1) - assert not d - d = make_d() - self.assert_equal(d.pop('foo', 32), 1) - assert not d - d = make_d() - self.assert_equal(d.pop('foos', 32), 32) - assert d - - with self.assert_raises(KeyError): - d.pop('foos') - - def test_setlistdefault(self): - md = self.storage_class() - self.assert_equal(md.setlistdefault('u', [-1, -2]), [-1, -2]) - self.assert_equal(md.getlist('u'), [-1, -2]) - self.assert_equal(md['u'], -1) - - def test_iter_interfaces(self): - mapping = [('a', 1), ('b', 2), ('a', 2), ('d', 3), - ('a', 1), ('a', 3), ('d', 4), ('c', 3)] - md = self.storage_class(mapping) - self.assert_equal(list(zip(md.keys(), md.listvalues())), - list(md.lists())) - self.assert_equal(list(zip(md, iterlistvalues(md))), - list(iterlists(md))) - self.assert_equal(list(zip(iterkeys(md), iterlistvalues(md))), - list(iterlists(md))) - - -class OrderedMultiDictTestCase(MutableMultiDictBaseTestCase): - storage_class = datastructures.OrderedMultiDict - - def test_ordered_interface(self): - cls = self.storage_class - - d = cls() - assert not d - d.add('foo', 'bar') - self.assert_equal(len(d), 1) - d.add('foo', 'baz') - self.assert_equal(len(d), 1) - self.assert_equal(list(iteritems(d)), [('foo', 'bar')]) - self.assert_equal(list(d), ['foo']) - self.assert_equal(list(iteritems(d, multi=True)), - [('foo', 'bar'), ('foo', 'baz')]) - del d['foo'] - assert not d - self.assert_equal(len(d), 0) - self.assert_equal(list(d), []) - - d.update([('foo', 1), ('foo', 2), ('bar', 42)]) - d.add('foo', 3) - self.assert_equal(d.getlist('foo'), [1, 2, 3]) - self.assert_equal(d.getlist('bar'), [42]) - self.assert_equal(list(iteritems(d)), [('foo', 1), ('bar', 42)]) - - expected = ['foo', 'bar'] - - self.assert_sequence_equal(list(d.keys()), expected) - self.assert_sequence_equal(list(d), expected) - self.assert_sequence_equal(list(iterkeys(d)), expected) - - self.assert_equal(list(iteritems(d, multi=True)), - [('foo', 1), ('foo', 2), ('bar', 42), ('foo', 3)]) - self.assert_equal(len(d), 2) - - self.assert_equal(d.pop('foo'), 1) - assert d.pop('blafasel', None) is None - self.assert_equal(d.pop('blafasel', 42), 42) - self.assert_equal(len(d), 1) - self.assert_equal(d.poplist('bar'), [42]) - assert not d - - d.get('missingkey') is None - - d.add('foo', 42) - d.add('foo', 23) - d.add('bar', 2) - d.add('foo', 42) - self.assert_equal(d, datastructures.MultiDict(d)) - id = self.storage_class(d) - self.assert_equal(d, id) - d.add('foo', 2) - assert d != id - - d.update({'blah': [1, 2, 3]}) - self.assert_equal(d['blah'], 1) - self.assert_equal(d.getlist('blah'), [1, 2, 3]) - - # setlist works - d = self.storage_class() - d['foo'] = 42 - d.setlist('foo', [1, 2]) - self.assert_equal(d.getlist('foo'), [1, 2]) - - with self.assert_raises(BadRequestKeyError): - d.pop('missing') - with self.assert_raises(BadRequestKeyError): - d['missing'] - - # popping - d = self.storage_class() - d.add('foo', 23) - d.add('foo', 42) - d.add('foo', 1) - self.assert_equal(d.popitem(), ('foo', 23)) - with self.assert_raises(BadRequestKeyError): - d.popitem() - assert not d - - d.add('foo', 23) - d.add('foo', 42) - d.add('foo', 1) - self.assert_equal(d.popitemlist(), ('foo', [23, 42, 1])) - - with self.assert_raises(BadRequestKeyError): - d.popitemlist() - - def test_iterables(self): - a = datastructures.MultiDict((("key_a", "value_a"),)) - b = datastructures.MultiDict((("key_b", "value_b"),)) - ab = datastructures.CombinedMultiDict((a,b)) - - self.assert_equal(sorted(ab.lists()), [('key_a', ['value_a']), ('key_b', ['value_b'])]) - self.assert_equal(sorted(ab.listvalues()), [['value_a'], ['value_b']]) - self.assert_equal(sorted(ab.keys()), ["key_a", "key_b"]) - - self.assert_equal(sorted(iterlists(ab)), [('key_a', ['value_a']), ('key_b', ['value_b'])]) - self.assert_equal(sorted(iterlistvalues(ab)), [['value_a'], ['value_b']]) - self.assert_equal(sorted(iterkeys(ab)), ["key_a", "key_b"]) - - -class CombinedMultiDictTestCase(WerkzeugTestCase): - storage_class = datastructures.CombinedMultiDict - - def test_basic_interface(self): - d1 = datastructures.MultiDict([('foo', '1')]) - d2 = datastructures.MultiDict([('bar', '2'), ('bar', '3')]) - d = self.storage_class([d1, d2]) - - # lookup - self.assert_equal(d['foo'], '1') - self.assert_equal(d['bar'], '2') - self.assert_equal(d.getlist('bar'), ['2', '3']) - - self.assert_equal(sorted(d.items()), - [('bar', '2'), ('foo', '1')]) - self.assert_equal(sorted(d.items(multi=True)), - [('bar', '2'), ('bar', '3'), ('foo', '1')]) - assert 'missingkey' not in d - assert 'foo' in d - - # type lookup - self.assert_equal(d.get('foo', type=int), 1) - self.assert_equal(d.getlist('bar', type=int), [2, 3]) - - # get key errors for missing stuff - with self.assert_raises(KeyError): - d['missing'] - - # make sure that they are immutable - with self.assert_raises(TypeError): - d['foo'] = 'blub' - - # copies are immutable - d = d.copy() - with self.assert_raises(TypeError): - d['foo'] = 'blub' - - # make sure lists merges - md1 = datastructures.MultiDict((("foo", "bar"),)) - md2 = datastructures.MultiDict((("foo", "blafasel"),)) - x = self.storage_class((md1, md2)) - self.assert_equal(list(iterlists(x)), [('foo', ['bar', 'blafasel'])]) - - -class HeadersTestCase(WerkzeugTestCase): - storage_class = datastructures.Headers - - def test_basic_interface(self): - headers = self.storage_class() - headers.add('Content-Type', 'text/plain') - headers.add('X-Foo', 'bar') - assert 'x-Foo' in headers - assert 'Content-type' in headers - - headers['Content-Type'] = 'foo/bar' - self.assert_equal(headers['Content-Type'], 'foo/bar') - self.assert_equal(len(headers.getlist('Content-Type')), 1) - - # list conversion - self.assert_equal(headers.to_wsgi_list(), [ - ('Content-Type', 'foo/bar'), - ('X-Foo', 'bar') - ]) - self.assert_equal(str(headers), ( - "Content-Type: foo/bar\r\n" - "X-Foo: bar\r\n" - "\r\n")) - self.assert_equal(str(self.storage_class()), "\r\n") - - # extended add - headers.add('Content-Disposition', 'attachment', filename='foo') - self.assert_equal(headers['Content-Disposition'], - 'attachment; filename=foo') - - headers.add('x', 'y', z='"') - self.assert_equal(headers['x'], r'y; z="\""') - - def test_defaults_and_conversion(self): - # defaults - headers = self.storage_class([ - ('Content-Type', 'text/plain'), - ('X-Foo', 'bar'), - ('X-Bar', '1'), - ('X-Bar', '2') - ]) - self.assert_equal(headers.getlist('x-bar'), ['1', '2']) - self.assert_equal(headers.get('x-Bar'), '1') - self.assert_equal(headers.get('Content-Type'), 'text/plain') - - self.assert_equal(headers.setdefault('X-Foo', 'nope'), 'bar') - self.assert_equal(headers.setdefault('X-Bar', 'nope'), '1') - self.assert_equal(headers.setdefault('X-Baz', 'quux'), 'quux') - self.assert_equal(headers.setdefault('X-Baz', 'nope'), 'quux') - headers.pop('X-Baz') - - # type conversion - self.assert_equal(headers.get('x-bar', type=int), 1) - self.assert_equal(headers.getlist('x-bar', type=int), [1, 2]) - - # list like operations - self.assert_equal(headers[0], ('Content-Type', 'text/plain')) - self.assert_equal(headers[:1], self.storage_class([('Content-Type', 'text/plain')])) - del headers[:2] - del headers[-1] - self.assert_equal(headers, self.storage_class([('X-Bar', '1')])) - - def test_copying(self): - a = self.storage_class([('foo', 'bar')]) - b = a.copy() - a.add('foo', 'baz') - self.assert_equal(a.getlist('foo'), ['bar', 'baz']) - self.assert_equal(b.getlist('foo'), ['bar']) - - def test_popping(self): - headers = self.storage_class([('a', 1)]) - self.assert_equal(headers.pop('a'), 1) - self.assert_equal(headers.pop('b', 2), 2) - - with self.assert_raises(KeyError): - headers.pop('c') - - def test_set_arguments(self): - a = self.storage_class() - a.set('Content-Disposition', 'useless') - a.set('Content-Disposition', 'attachment', filename='foo') - self.assert_equal(a['Content-Disposition'], 'attachment; filename=foo') - - def test_reject_newlines(self): - h = self.storage_class() - - for variation in 'foo\nbar', 'foo\r\nbar', 'foo\rbar': - with self.assert_raises(ValueError): - h['foo'] = variation - with self.assert_raises(ValueError): - h.add('foo', variation) - with self.assert_raises(ValueError): - h.add('foo', 'test', option=variation) - with self.assert_raises(ValueError): - h.set('foo', variation) - with self.assert_raises(ValueError): - h.set('foo', 'test', option=variation) - - def test_slicing(self): - # there's nothing wrong with these being native strings - # Headers doesn't care about the data types - h = self.storage_class() - h.set('X-Foo-Poo', 'bleh') - h.set('Content-Type', 'application/whocares') - h.set('X-Forwarded-For', '192.168.0.123') - h[:] = [(k, v) for k, v in h if k.startswith(u'X-')] - self.assert_equal(list(h), [ - ('X-Foo-Poo', 'bleh'), - ('X-Forwarded-For', '192.168.0.123') - ]) - - def test_bytes_operations(self): - h = self.storage_class() - h.set('X-Foo-Poo', 'bleh') - h.set('X-Whoops', b'\xff') - - self.assert_equal(h.get('x-foo-poo', as_bytes=True), b'bleh') - self.assert_equal(h.get('x-whoops', as_bytes=True), b'\xff') - - -class EnvironHeadersTestCase(WerkzeugTestCase): - storage_class = datastructures.EnvironHeaders - - def test_basic_interface(self): - # this happens in multiple WSGI servers because they - # use a vary naive way to convert the headers; - broken_env = { - 'HTTP_CONTENT_TYPE': 'text/html', - 'CONTENT_TYPE': 'text/html', - 'HTTP_CONTENT_LENGTH': '0', - 'CONTENT_LENGTH': '0', - 'HTTP_ACCEPT': '*', - 'wsgi.version': (1, 0) - } - headers = self.storage_class(broken_env) - assert headers - self.assert_equal(len(headers), 3) - self.assert_equal(sorted(headers), [ - ('Accept', '*'), - ('Content-Length', '0'), - ('Content-Type', 'text/html') - ]) - assert not self.storage_class({'wsgi.version': (1, 0)}) - self.assert_equal(len(self.storage_class({'wsgi.version': (1, 0)})), 0) - - def test_return_type_is_unicode(self): - # environ contains native strings; we return unicode - headers = self.storage_class({ - 'HTTP_FOO': '\xe2\x9c\x93', - 'CONTENT_TYPE': 'text/plain', - }) - self.assert_equal(headers['Foo'], u"\xe2\x9c\x93") - assert isinstance(headers['Foo'], text_type) - assert isinstance(headers['Content-Type'], text_type) - iter_output = dict(iter(headers)) - self.assert_equal(iter_output['Foo'], u"\xe2\x9c\x93") - assert isinstance(iter_output['Foo'], text_type) - assert isinstance(iter_output['Content-Type'], text_type) - - def test_bytes_operations(self): - foo_val = '\xff' - h = self.storage_class({ - 'HTTP_X_FOO': foo_val - }) - - self.assert_equal(h.get('x-foo', as_bytes=True), b'\xff') - self.assert_equal(h.get('x-foo'), u'\xff') - - -class HeaderSetTestCase(WerkzeugTestCase): - storage_class = datastructures.HeaderSet - - def test_basic_interface(self): - hs = self.storage_class() - hs.add('foo') - hs.add('bar') - assert 'Bar' in hs - self.assert_equal(hs.find('foo'), 0) - self.assert_equal(hs.find('BAR'), 1) - assert hs.find('baz') < 0 - hs.discard('missing') - hs.discard('foo') - assert hs.find('foo') < 0 - self.assert_equal(hs.find('bar'), 0) - - with self.assert_raises(IndexError): - hs.index('missing') - - self.assert_equal(hs.index('bar'), 0) - assert hs - hs.clear() - assert not hs - - -class ImmutableListTestCase(WerkzeugTestCase): - storage_class = datastructures.ImmutableList - - def test_list_hashable(self): - t = (1, 2, 3, 4) - l = self.storage_class(t) - self.assert_equal(hash(t), hash(l)) - self.assert_not_equal(t, l) - - -def make_call_asserter(assert_equal_func, func=None): - """Utility to assert a certain number of function calls. - - >>> assert_calls, func = make_call_asserter(self.assert_equal) - >>> with assert_calls(2): - func() - func() - """ - - calls = [0] - - @contextmanager - def asserter(count, msg=None): - calls[0] = 0 - yield - assert_equal_func(calls[0], count, msg) - - def wrapped(*args, **kwargs): - calls[0] += 1 - if func is not None: - return func(*args, **kwargs) - - return asserter, wrapped - - -class CallbackDictTestCase(WerkzeugTestCase): - storage_class = datastructures.CallbackDict - - def test_callback_dict_reads(self): - assert_calls, func = make_call_asserter(self.assert_equal) - initial = {'a': 'foo', 'b': 'bar'} - dct = self.storage_class(initial=initial, on_update=func) - with assert_calls(0, 'callback triggered by read-only method'): - # read-only methods - dct['a'] - dct.get('a') - self.assert_raises(KeyError, lambda: dct['x']) - 'a' in dct - list(iter(dct)) - dct.copy() - with assert_calls(0, 'callback triggered without modification'): - # methods that may write but don't - dct.pop('z', None) - dct.setdefault('a') - - def test_callback_dict_writes(self): - assert_calls, func = make_call_asserter(self.assert_equal) - initial = {'a': 'foo', 'b': 'bar'} - dct = self.storage_class(initial=initial, on_update=func) - with assert_calls(8, 'callback not triggered by write method'): - # always-write methods - dct['z'] = 123 - dct['z'] = 123 # must trigger again - del dct['z'] - dct.pop('b', None) - dct.setdefault('x') - dct.popitem() - dct.update([]) - dct.clear() - with assert_calls(0, 'callback triggered by failed del'): - self.assert_raises(KeyError, lambda: dct.__delitem__('x')) - with assert_calls(0, 'callback triggered by failed pop'): - self.assert_raises(KeyError, lambda: dct.pop('x')) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(MultiDictTestCase)) - suite.addTest(unittest.makeSuite(OrderedMultiDictTestCase)) - suite.addTest(unittest.makeSuite(CombinedMultiDictTestCase)) - suite.addTest(unittest.makeSuite(ImmutableTypeConversionDictTestCase)) - suite.addTest(unittest.makeSuite(ImmutableMultiDictTestCase)) - suite.addTest(unittest.makeSuite(ImmutableDictTestCase)) - suite.addTest(unittest.makeSuite(ImmutableOrderedMultiDictTestCase)) - suite.addTest(unittest.makeSuite(HeadersTestCase)) - suite.addTest(unittest.makeSuite(EnvironHeadersTestCase)) - suite.addTest(unittest.makeSuite(HeaderSetTestCase)) - suite.addTest(unittest.makeSuite(NativeItermethodsTestCase)) - suite.addTest(unittest.makeSuite(CallbackDictTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/debug.py b/vendor/werkzeug/testsuite/debug.py deleted file mode 100644 index f408be52..00000000 --- a/vendor/werkzeug/testsuite/debug.py +++ /dev/null @@ -1,172 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.debug - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests some debug utilities. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -import sys -import re - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.debug.repr import debug_repr, DebugReprGenerator, \ - dump, helper -from werkzeug.debug.console import HTMLStringO -from werkzeug._compat import PY2 - - -class DebugReprTestCase(WerkzeugTestCase): - - def test_basic_repr(self): - self.assert_equal(debug_repr([]), u'[]') - self.assert_equal(debug_repr([1, 2]), - u'[1, 2]') - self.assert_equal(debug_repr([1, 'test']), - u'[1, \'test\']') - self.assert_equal(debug_repr([None]), - u'[None]') - - def test_sequence_repr(self): - self.assert_equal(debug_repr(list(range(20))), ( - u'[0, 1, ' - u'2, 3, ' - u'4, 5, ' - u'6, 7, ' - u'8, ' - u'9, 10, ' - u'11, 12, ' - u'13, 14, ' - u'15, 16, ' - u'17, 18, ' - u'19]' - )) - - def test_mapping_repr(self): - self.assert_equal(debug_repr({}), u'{}') - self.assert_equal(debug_repr({'foo': 42}), - u'{\'foo\'' - u': 42' - u'}') - self.assert_equal(debug_repr(dict(zip(range(10), [None] * 10))), - u'{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None}') - self.assert_equal( - debug_repr((1, 'zwei', u'drei')), - u'(1, \'' - u'zwei\', %s\'drei\')' % ('u' if PY2 else '')) - - def test_custom_repr(self): - class Foo(object): - def __repr__(self): - return '' - self.assert_equal(debug_repr(Foo()), - '<Foo 42>') - - def test_list_subclass_repr(self): - class MyList(list): - pass - self.assert_equal( - debug_repr(MyList([1, 2])), - u'werkzeug.testsuite.debug.MyList([' - u'1, 2])') - - def test_regex_repr(self): - self.assert_equal(debug_repr(re.compile(r'foo\d')), - u're.compile(r\'foo\\d\')') - #XXX: no raw string here cause of a syntax bug in py3.3 - self.assert_equal(debug_repr(re.compile(u'foo\\d')), - u're.compile(%sr\'foo\\d\')' % - ('u' if PY2 else '')) - - def test_set_repr(self): - self.assert_equal(debug_repr(frozenset('x')), - u'frozenset([\'x\'])') - self.assert_equal(debug_repr(set('x')), - u'set([\'x\'])') - - def test_recursive_repr(self): - a = [1] - a.append(a) - self.assert_equal(debug_repr(a), - u'[1, [...]]') - - def test_broken_repr(self): - class Foo(object): - def __repr__(self): - raise Exception('broken!') - - self.assert_equal( - debug_repr(Foo()), - u'<broken repr (Exception: ' - u'broken!)>') - - -class Foo(object): - x = 42 - y = 23 - - def __init__(self): - self.z = 15 - - -class DebugHelpersTestCase(WerkzeugTestCase): - - def test_object_dumping(self): - drg = DebugReprGenerator() - out = drg.dump_object(Foo()) - assert re.search('Details for werkzeug.testsuite.debug.Foo object at', out) - assert re.search('x.*42(?s)', out) - assert re.search('y.*23(?s)', out) - assert re.search('z.*15(?s)', out) - - out = drg.dump_object({'x': 42, 'y': 23}) - assert re.search('Contents of', out) - assert re.search('x.*42(?s)', out) - assert re.search('y.*23(?s)', out) - - out = drg.dump_object({'x': 42, 'y': 23, 23: 11}) - assert not re.search('Contents of', out) - - out = drg.dump_locals({'x': 42, 'y': 23}) - assert re.search('Local variables in frame', out) - assert re.search('x.*42(?s)', out) - assert re.search('y.*23(?s)', out) - - def test_debug_dump(self): - old = sys.stdout - sys.stdout = HTMLStringO() - try: - dump([1, 2, 3]) - x = sys.stdout.reset() - dump() - y = sys.stdout.reset() - finally: - sys.stdout = old - - self.assert_in('Details for list object at', x) - self.assert_in('1', x) - self.assert_in('Local variables in frame', y) - self.assert_in('x', y) - self.assert_in('old', y) - - def test_debug_help(self): - old = sys.stdout - sys.stdout = HTMLStringO() - try: - helper([1, 2, 3]) - x = sys.stdout.reset() - finally: - sys.stdout = old - - self.assert_in('Help on list object', x) - self.assert_in('__delitem__', x) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(DebugReprTestCase)) - suite.addTest(unittest.makeSuite(DebugHelpersTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/exceptions.py b/vendor/werkzeug/testsuite/exceptions.py deleted file mode 100644 index 71c78fb4..00000000 --- a/vendor/werkzeug/testsuite/exceptions.py +++ /dev/null @@ -1,85 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.exceptions - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - The tests for the exception classes. - - TODO: - - - This is undertested. HTML is never checked - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import exceptions -from werkzeug.wrappers import Response -from werkzeug._compat import text_type - - -class ExceptionsTestCase(WerkzeugTestCase): - - def test_proxy_exception(self): - orig_resp = Response('Hello World') - try: - exceptions.abort(orig_resp) - except exceptions.HTTPException as e: - resp = e.get_response({}) - else: - self.fail('exception not raised') - self.assert_true(resp is orig_resp) - self.assert_equal(resp.get_data(), b'Hello World') - - def test_aborter(self): - abort = exceptions.abort - self.assert_raises(exceptions.BadRequest, abort, 400) - self.assert_raises(exceptions.Unauthorized, abort, 401) - self.assert_raises(exceptions.Forbidden, abort, 403) - self.assert_raises(exceptions.NotFound, abort, 404) - self.assert_raises(exceptions.MethodNotAllowed, abort, 405, ['GET', 'HEAD']) - self.assert_raises(exceptions.NotAcceptable, abort, 406) - self.assert_raises(exceptions.RequestTimeout, abort, 408) - self.assert_raises(exceptions.Gone, abort, 410) - self.assert_raises(exceptions.LengthRequired, abort, 411) - self.assert_raises(exceptions.PreconditionFailed, abort, 412) - self.assert_raises(exceptions.RequestEntityTooLarge, abort, 413) - self.assert_raises(exceptions.RequestURITooLarge, abort, 414) - self.assert_raises(exceptions.UnsupportedMediaType, abort, 415) - self.assert_raises(exceptions.UnprocessableEntity, abort, 422) - self.assert_raises(exceptions.InternalServerError, abort, 500) - self.assert_raises(exceptions.NotImplemented, abort, 501) - self.assert_raises(exceptions.BadGateway, abort, 502) - self.assert_raises(exceptions.ServiceUnavailable, abort, 503) - - myabort = exceptions.Aborter({1: exceptions.NotFound}) - self.assert_raises(LookupError, myabort, 404) - self.assert_raises(exceptions.NotFound, myabort, 1) - - myabort = exceptions.Aborter(extra={1: exceptions.NotFound}) - self.assert_raises(exceptions.NotFound, myabort, 404) - self.assert_raises(exceptions.NotFound, myabort, 1) - - def test_exception_repr(self): - exc = exceptions.NotFound() - self.assert_equal(text_type(exc), '404: Not Found') - self.assert_equal(repr(exc), "") - - exc = exceptions.NotFound('Not There') - self.assert_equal(text_type(exc), '404: Not Found') - self.assert_equal(repr(exc), "") - - def test_special_exceptions(self): - exc = exceptions.MethodNotAllowed(['GET', 'HEAD', 'POST']) - h = dict(exc.get_headers({})) - self.assert_equal(h['Allow'], 'GET, HEAD, POST') - self.assert_true('The method is not allowed' in exc.get_description()) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(ExceptionsTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/formparser.py b/vendor/werkzeug/testsuite/formparser.py deleted file mode 100644 index d395e3e9..00000000 --- a/vendor/werkzeug/testsuite/formparser.py +++ /dev/null @@ -1,400 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.formparser - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the form parsing facilities. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import unittest -from os.path import join, dirname - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import formparser -from werkzeug.test import create_environ, Client -from werkzeug.wrappers import Request, Response -from werkzeug.exceptions import RequestEntityTooLarge -from werkzeug.datastructures import MultiDict -from werkzeug.formparser import parse_form_data -from werkzeug._compat import BytesIO - - -@Request.application -def form_data_consumer(request): - result_object = request.args['object'] - if result_object == 'text': - return Response(repr(request.form['text'])) - f = request.files[result_object] - return Response(b'\n'.join(( - repr(f.filename).encode('ascii'), - repr(f.name).encode('ascii'), - repr(f.content_type).encode('ascii'), - f.stream.read() - ))) - - -def get_contents(filename): - with open(filename, 'rb') as f: - return f.read() - - -class FormParserTestCase(WerkzeugTestCase): - - def test_limiting(self): - data = b'foo=Hello+World&bar=baz' - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_content_length = 400 - self.assert_strict_equal(req.form['foo'], u'Hello World') - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_form_memory_size = 7 - self.assert_raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='application/x-www-form-urlencoded', - method='POST') - req.max_form_memory_size = 400 - self.assert_strict_equal(req.form['foo'], u'Hello World') - - data = (b'--foo\r\nContent-Disposition: form-field; name=foo\r\n\r\n' - b'Hello World\r\n' - b'--foo\r\nContent-Disposition: form-field; name=bar\r\n\r\n' - b'bar=baz\r\n--foo--') - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_content_length = 4 - self.assert_raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_content_length = 400 - self.assert_strict_equal(req.form['foo'], u'Hello World') - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_form_memory_size = 7 - self.assert_raises(RequestEntityTooLarge, lambda: req.form['foo']) - - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - req.max_form_memory_size = 400 - self.assert_strict_equal(req.form['foo'], u'Hello World') - - def test_parse_form_data_put_without_content(self): - # A PUT without a Content-Type header returns empty data - - # Both rfc1945 and rfc2616 (1.0 and 1.1) say "Any HTTP/[1.0/1.1] message - # containing an entity-body SHOULD include a Content-Type header field - # defining the media type of that body." In the case where either - # headers are omitted, parse_form_data should still work. - env = create_environ('/foo', 'http://example.org/', method='PUT') - del env['CONTENT_TYPE'] - del env['CONTENT_LENGTH'] - - stream, form, files = formparser.parse_form_data(env) - self.assert_strict_equal(stream.read(), b'') - self.assert_strict_equal(len(form), 0) - self.assert_strict_equal(len(files), 0) - - def test_parse_form_data_get_without_content(self): - env = create_environ('/foo', 'http://example.org/', method='GET') - del env['CONTENT_TYPE'] - del env['CONTENT_LENGTH'] - - stream, form, files = formparser.parse_form_data(env) - self.assert_strict_equal(stream.read(), b'') - self.assert_strict_equal(len(form), 0) - self.assert_strict_equal(len(files), 0) - - def test_large_file(self): - data = b'x' * (1024 * 600) - req = Request.from_values(data={'foo': (BytesIO(data), 'test.txt')}, - method='POST') - # make sure we have a real file here, because we expect to be - # on the disk. > 1024 * 500 - self.assert_true(hasattr(req.files['foo'].stream, u'fileno')) - # close file to prevent fds from leaking - req.files['foo'].close() - - def test_streaming_parse(self): - data = b'x' * (1024 * 600) - class StreamMPP(formparser.MultiPartParser): - def parse(self, file, boundary, content_length): - i = iter(self.parse_lines(file, boundary, content_length)) - one = next(i) - two = next(i) - return self.cls(()), {'one': one, 'two': two} - class StreamFDP(formparser.FormDataParser): - def _sf_parse_multipart(self, stream, mimetype, - content_length, options): - form, files = StreamMPP( - self.stream_factory, self.charset, self.errors, - max_form_memory_size=self.max_form_memory_size, - cls=self.cls).parse(stream, options.get('boundary').encode('ascii'), - content_length) - return stream, form, files - parse_functions = {} - parse_functions.update(formparser.FormDataParser.parse_functions) - parse_functions['multipart/form-data'] = _sf_parse_multipart - class StreamReq(Request): - form_data_parser_class = StreamFDP - req = StreamReq.from_values(data={'foo': (BytesIO(data), 'test.txt')}, - method='POST') - self.assert_strict_equal('begin_file', req.files['one'][0]) - self.assert_strict_equal(('foo', 'test.txt'), req.files['one'][1][1:]) - self.assert_strict_equal('cont', req.files['two'][0]) - self.assert_strict_equal(data, req.files['two'][1]) - - -class MultiPartTestCase(WerkzeugTestCase): - - def test_basic(self): - resources = join(dirname(__file__), 'multipart') - client = Client(form_data_consumer, Response) - - repository = [ - ('firefox3-2png1txt', '---------------------------186454651713519341951581030105', [ - (u'anchor.png', 'file1', 'image/png', 'file1.png'), - (u'application_edit.png', 'file2', 'image/png', 'file2.png') - ], u'example text'), - ('firefox3-2pnglongtext', '---------------------------14904044739787191031754711748', [ - (u'accept.png', 'file1', 'image/png', 'file1.png'), - (u'add.png', 'file2', 'image/png', 'file2.png') - ], u'--long text\r\n--with boundary\r\n--lookalikes--'), - ('opera8-2png1txt', '----------zEO9jQKmLc2Cq88c23Dx19', [ - (u'arrow_branch.png', 'file1', 'image/png', 'file1.png'), - (u'award_star_bronze_1.png', 'file2', 'image/png', 'file2.png') - ], u'blafasel öäü'), - ('webkit3-2png1txt', '----WebKitFormBoundaryjdSFhcARk8fyGNy6', [ - (u'gtk-apply.png', 'file1', 'image/png', 'file1.png'), - (u'gtk-no.png', 'file2', 'image/png', 'file2.png') - ], u'this is another text with ümläüts'), - ('ie6-2png1txt', '---------------------------7d91b03a20128', [ - (u'file1.png', 'file1', 'image/x-png', 'file1.png'), - (u'file2.png', 'file2', 'image/x-png', 'file2.png') - ], u'ie6 sucks :-/') - ] - - for name, boundary, files, text in repository: - folder = join(resources, name) - data = get_contents(join(folder, 'request.txt')) - for filename, field, content_type, fsname in files: - response = client.post('/?object=' + field, data=data, content_type= - 'multipart/form-data; boundary="%s"' % boundary, - content_length=len(data)) - lines = response.get_data().split(b'\n', 3) - self.assert_strict_equal(lines[0], repr(filename).encode('ascii')) - self.assert_strict_equal(lines[1], repr(field).encode('ascii')) - self.assert_strict_equal(lines[2], repr(content_type).encode('ascii')) - self.assert_strict_equal(lines[3], get_contents(join(folder, fsname))) - response = client.post('/?object=text', data=data, content_type= - 'multipart/form-data; boundary="%s"' % boundary, - content_length=len(data)) - self.assert_strict_equal(response.get_data(), repr(text).encode('utf-8')) - - def test_ie7_unc_path(self): - client = Client(form_data_consumer, Response) - data_file = join(dirname(__file__), 'multipart', 'ie7_full_path_request.txt') - data = get_contents(data_file) - boundary = '---------------------------7da36d1b4a0164' - response = client.post('/?object=cb_file_upload_multiple', data=data, content_type= - 'multipart/form-data; boundary="%s"' % boundary, content_length=len(data)) - lines = response.get_data().split(b'\n', 3) - self.assert_strict_equal(lines[0], - repr(u'Sellersburg Town Council Meeting 02-22-2010doc.doc').encode('ascii')) - - def test_end_of_file(self): - # This test looks innocent but it was actually timeing out in - # the Werkzeug 0.5 release version (#394) - data = ( - b'--foo\r\n' - b'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n' - b'Content-Type: text/plain\r\n\r\n' - b'file contents and no end' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - self.assert_true(not data.files) - self.assert_true(not data.form) - - def test_broken(self): - data = ( - '--foo\r\n' - 'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n' - 'Content-Transfer-Encoding: base64\r\n' - 'Content-Type: text/plain\r\n\r\n' - 'broken base 64' - '--foo--' - ) - _, form, files = formparser.parse_form_data(create_environ(data=data, - method='POST', content_type='multipart/form-data; boundary=foo')) - self.assert_true(not files) - self.assert_true(not form) - - self.assert_raises(ValueError, formparser.parse_form_data, - create_environ(data=data, method='POST', - content_type='multipart/form-data; boundary=foo'), - silent=False) - - def test_file_no_content_type(self): - data = ( - b'--foo\r\n' - b'Content-Disposition: form-data; name="test"; filename="test.txt"\r\n\r\n' - b'file contents\r\n--foo--' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - self.assert_equal(data.files['test'].filename, 'test.txt') - self.assert_strict_equal(data.files['test'].read(), b'file contents') - - def test_extra_newline(self): - # this test looks innocent but it was actually timeing out in - # the Werkzeug 0.5 release version (#394) - data = ( - b'\r\n\r\n--foo\r\n' - b'Content-Disposition: form-data; name="foo"\r\n\r\n' - b'a string\r\n' - b'--foo--' - ) - data = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - self.assert_true(not data.files) - self.assert_strict_equal(data.form['foo'], u'a string') - - def test_headers(self): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'X-Custom-Header: blah\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - foo = req.files['foo'] - self.assert_strict_equal(foo.mimetype, 'text/plain') - self.assert_strict_equal(foo.mimetype_params, {'charset': 'utf-8'}) - self.assert_strict_equal(foo.headers['content-type'], foo.content_type) - self.assert_strict_equal(foo.content_type, 'text/plain; charset=utf-8') - self.assert_strict_equal(foo.headers['x-custom-header'], 'blah') - - def test_nonstandard_line_endings(self): - for nl in b'\n', b'\r', b'\r\n': - data = nl.join(( - b'--foo', - b'Content-Disposition: form-data; name=foo', - b'', - b'this is just bar', - b'--foo', - b'Content-Disposition: form-data; name=bar', - b'', - b'blafasel', - b'--foo--' - )) - req = Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; ' - 'boundary=foo', method='POST') - self.assert_strict_equal(req.form['foo'], u'this is just bar') - self.assert_strict_equal(req.form['bar'], u'blafasel') - - def test_failures(self): - def parse_multipart(stream, boundary, content_length): - parser = formparser.MultiPartParser(content_length) - return parser.parse(stream, boundary, content_length) - self.assert_raises(ValueError, parse_multipart, BytesIO(), b'broken ', 0) - - data = b'--foo\r\n\r\nHello World\r\n--foo--' - self.assert_raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - data = b'--foo\r\nContent-Disposition: form-field; name=foo\r\n' \ - b'Content-Transfer-Encoding: base64\r\n\r\nHello World\r\n--foo--' - self.assert_raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - data = b'--foo\r\nContent-Disposition: form-field; name=foo\r\n\r\nHello World\r\n' - self.assert_raises(ValueError, parse_multipart, BytesIO(data), b'foo', len(data)) - - x = formparser.parse_multipart_headers(['foo: bar\r\n', ' x test\r\n']) - self.assert_strict_equal(x['foo'], 'bar\n x test') - self.assert_raises(ValueError, formparser.parse_multipart_headers, - ['foo: bar\r\n', ' x test']) - - def test_bad_newline_bad_newline_assumption(self): - class ISORequest(Request): - charset = 'latin1' - contents = b'U2vlbmUgbORu' - data = b'--foo\r\nContent-Disposition: form-data; name="test"\r\n' \ - b'Content-Transfer-Encoding: base64\r\n\r\n' + \ - contents + b'\r\n--foo--' - req = ISORequest.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - self.assert_strict_equal(req.form['test'], u'Sk\xe5ne l\xe4n') - - def test_empty_multipart(self): - environ = {} - data = b'--boundary--' - environ['REQUEST_METHOD'] = 'POST' - environ['CONTENT_TYPE'] = 'multipart/form-data; boundary=boundary' - environ['CONTENT_LENGTH'] = str(len(data)) - environ['wsgi.input'] = BytesIO(data) - stream, form, files = parse_form_data(environ, silent=False) - rv = stream.read() - self.assert_equal(rv, b'') - self.assert_equal(form, MultiDict()) - self.assert_equal(files, MultiDict()) - - -class InternalFunctionsTestCase(WerkzeugTestCase): - - def test_line_parser(self): - assert formparser._line_parse('foo') == ('foo', False) - assert formparser._line_parse('foo\r\n') == ('foo', True) - assert formparser._line_parse('foo\r') == ('foo', True) - assert formparser._line_parse('foo\n') == ('foo', True) - - def test_find_terminator(self): - lineiter = iter(b'\n\n\nfoo\nbar\nbaz'.splitlines(True)) - find_terminator = formparser.MultiPartParser()._find_terminator - line = find_terminator(lineiter) - self.assert_equal(line, b'foo') - self.assert_equal(list(lineiter), [b'bar\n', b'baz']) - self.assert_equal(find_terminator([]), b'') - self.assert_equal(find_terminator([b'']), b'') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(FormParserTestCase)) - suite.addTest(unittest.makeSuite(MultiPartTestCase)) - suite.addTest(unittest.makeSuite(InternalFunctionsTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/http.py b/vendor/werkzeug/testsuite/http.py deleted file mode 100644 index 8535bfd9..00000000 --- a/vendor/werkzeug/testsuite/http.py +++ /dev/null @@ -1,448 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.http - ~~~~~~~~~~~~~~~~~~~~~~~ - - HTTP parsing utilities. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -from datetime import datetime - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug._compat import itervalues, wsgi_encoding_dance - -from werkzeug import http, datastructures -from werkzeug.test import create_environ - - -class HTTPUtilityTestCase(WerkzeugTestCase): - - def test_accept(self): - a = http.parse_accept_header('en-us,ru;q=0.5') - self.assert_equal(list(itervalues(a)), ['en-us', 'ru']) - self.assert_equal(a.best, 'en-us') - self.assert_equal(a.find('ru'), 1) - self.assert_raises(ValueError, a.index, 'de') - self.assert_equal(a.to_header(), 'en-us,ru;q=0.5') - - def test_mime_accept(self): - a = http.parse_accept_header('text/xml,application/xml,' - 'application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png,*/*;q=0.5', - datastructures.MIMEAccept) - self.assert_raises(ValueError, lambda: a['missing']) - self.assert_equal(a['image/png'], 1) - self.assert_equal(a['text/plain'], 0.8) - self.assert_equal(a['foo/bar'], 0.5) - self.assert_equal(a[a.find('foo/bar')], ('*/*', 0.5)) - - def test_accept_matches(self): - a = http.parse_accept_header('text/xml,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png', datastructures.MIMEAccept) - self.assert_equal(a.best_match(['text/html', 'application/xhtml+xml']), - 'application/xhtml+xml') - self.assert_equal(a.best_match(['text/html']), 'text/html') - self.assert_true(a.best_match(['foo/bar']) is None) - self.assert_equal(a.best_match(['foo/bar', 'bar/foo'], - default='foo/bar'), 'foo/bar') - self.assert_equal(a.best_match(['application/xml', 'text/xml']), 'application/xml') - - def test_charset_accept(self): - a = http.parse_accept_header('ISO-8859-1,utf-8;q=0.7,*;q=0.7', - datastructures.CharsetAccept) - self.assert_equal(a['iso-8859-1'], a['iso8859-1']) - self.assert_equal(a['iso-8859-1'], 1) - self.assert_equal(a['UTF8'], 0.7) - self.assert_equal(a['ebcdic'], 0.7) - - def test_language_accept(self): - a = http.parse_accept_header('de-AT,de;q=0.8,en;q=0.5', - datastructures.LanguageAccept) - self.assert_equal(a.best, 'de-AT') - self.assert_true('de_AT' in a) - self.assert_true('en' in a) - self.assert_equal(a['de-at'], 1) - self.assert_equal(a['en'], 0.5) - - def test_set_header(self): - hs = http.parse_set_header('foo, Bar, "Blah baz", Hehe') - self.assert_true('blah baz' in hs) - self.assert_true('foobar' not in hs) - self.assert_true('foo' in hs) - self.assert_equal(list(hs), ['foo', 'Bar', 'Blah baz', 'Hehe']) - hs.add('Foo') - self.assert_equal(hs.to_header(), 'foo, Bar, "Blah baz", Hehe') - - def test_list_header(self): - hl = http.parse_list_header('foo baz, blah') - self.assert_equal(hl, ['foo baz', 'blah']) - - def test_dict_header(self): - d = http.parse_dict_header('foo="bar baz", blah=42') - self.assert_equal(d, {'foo': 'bar baz', 'blah': '42'}) - - def test_cache_control_header(self): - cc = http.parse_cache_control_header('max-age=0, no-cache') - assert cc.max_age == 0 - assert cc.no_cache - cc = http.parse_cache_control_header('private, community="UCI"', None, - datastructures.ResponseCacheControl) - assert cc.private - assert cc['community'] == 'UCI' - - c = datastructures.ResponseCacheControl() - assert c.no_cache is None - assert c.private is None - c.no_cache = True - assert c.no_cache == '*' - c.private = True - assert c.private == '*' - del c.private - assert c.private is None - assert c.to_header() == 'no-cache' - - def test_authorization_header(self): - a = http.parse_authorization_header('Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==') - assert a.type == 'basic' - assert a.username == 'Aladdin' - assert a.password == 'open sesame' - - a = http.parse_authorization_header('''Digest username="Mufasa", - realm="testrealm@host.invalid", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - uri="/dir/index.html", - qop=auth, - nc=00000001, - cnonce="0a4f113b", - response="6629fae49393a05397450978507c4ef1", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert a.type == 'digest' - assert a.username == 'Mufasa' - assert a.realm == 'testrealm@host.invalid' - assert a.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert a.uri == '/dir/index.html' - assert 'auth' in a.qop - assert a.nc == '00000001' - assert a.cnonce == '0a4f113b' - assert a.response == '6629fae49393a05397450978507c4ef1' - assert a.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - a = http.parse_authorization_header('''Digest username="Mufasa", - realm="testrealm@host.invalid", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - uri="/dir/index.html", - response="e257afa1414a3340d93d30955171dd0e", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert a.type == 'digest' - assert a.username == 'Mufasa' - assert a.realm == 'testrealm@host.invalid' - assert a.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert a.uri == '/dir/index.html' - assert a.response == 'e257afa1414a3340d93d30955171dd0e' - assert a.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - assert http.parse_authorization_header('') is None - assert http.parse_authorization_header(None) is None - assert http.parse_authorization_header('foo') is None - - def test_www_authenticate_header(self): - wa = http.parse_www_authenticate_header('Basic realm="WallyWorld"') - assert wa.type == 'basic' - assert wa.realm == 'WallyWorld' - wa.realm = 'Foo Bar' - assert wa.to_header() == 'Basic realm="Foo Bar"' - - wa = http.parse_www_authenticate_header('''Digest - realm="testrealm@host.com", - qop="auth,auth-int", - nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", - opaque="5ccc069c403ebaf9f0171e9517f40e41"''') - assert wa.type == 'digest' - assert wa.realm == 'testrealm@host.com' - assert 'auth' in wa.qop - assert 'auth-int' in wa.qop - assert wa.nonce == 'dcd98b7102dd2f0e8b11d0f600bfb0c093' - assert wa.opaque == '5ccc069c403ebaf9f0171e9517f40e41' - - wa = http.parse_www_authenticate_header('broken') - assert wa.type == 'broken' - - assert not http.parse_www_authenticate_header('').type - assert not http.parse_www_authenticate_header('') - - def test_etags(self): - assert http.quote_etag('foo') == '"foo"' - assert http.quote_etag('foo', True) == 'w/"foo"' - assert http.unquote_etag('"foo"') == ('foo', False) - assert http.unquote_etag('w/"foo"') == ('foo', True) - es = http.parse_etags('"foo", "bar", w/"baz", blar') - assert sorted(es) == ['bar', 'blar', 'foo'] - assert 'foo' in es - assert 'baz' not in es - assert es.contains_weak('baz') - assert 'blar' in es - assert es.contains_raw('w/"baz"') - assert es.contains_raw('"foo"') - assert sorted(es.to_header().split(', ')) == ['"bar"', '"blar"', '"foo"', 'w/"baz"'] - - def test_etags_nonzero(self): - etags = http.parse_etags('w/"foo"') - self.assert_true(bool(etags)) - self.assert_true(etags.contains_raw('w/"foo"')) - - def test_parse_date(self): - assert http.parse_date('Sun, 06 Nov 1994 08:49:37 GMT ') == datetime(1994, 11, 6, 8, 49, 37) - assert http.parse_date('Sunday, 06-Nov-94 08:49:37 GMT') == datetime(1994, 11, 6, 8, 49, 37) - assert http.parse_date(' Sun Nov 6 08:49:37 1994') == datetime(1994, 11, 6, 8, 49, 37) - assert http.parse_date('foo') is None - - def test_parse_date_overflows(self): - assert http.parse_date(' Sun 02 Feb 1343 08:49:37 GMT') == datetime(1343, 2, 2, 8, 49, 37) - assert http.parse_date('Thu, 01 Jan 1970 00:00:00 GMT') == datetime(1970, 1, 1, 0, 0) - assert http.parse_date('Thu, 33 Jan 1970 00:00:00 GMT') is None - - def test_remove_entity_headers(self): - now = http.http_date() - headers1 = [('Date', now), ('Content-Type', 'text/html'), ('Content-Length', '0')] - headers2 = datastructures.Headers(headers1) - - http.remove_entity_headers(headers1) - assert headers1 == [('Date', now)] - - http.remove_entity_headers(headers2) - self.assert_equal(headers2, datastructures.Headers([(u'Date', now)])) - - def test_remove_hop_by_hop_headers(self): - headers1 = [('Connection', 'closed'), ('Foo', 'bar'), - ('Keep-Alive', 'wtf')] - headers2 = datastructures.Headers(headers1) - - http.remove_hop_by_hop_headers(headers1) - assert headers1 == [('Foo', 'bar')] - - http.remove_hop_by_hop_headers(headers2) - assert headers2 == datastructures.Headers([('Foo', 'bar')]) - - def test_parse_options_header(self): - assert http.parse_options_header(r'something; foo="other\"thing"') == \ - ('something', {'foo': 'other"thing'}) - assert http.parse_options_header(r'something; foo="other\"thing"; meh=42') == \ - ('something', {'foo': 'other"thing', 'meh': '42'}) - assert http.parse_options_header(r'something; foo="other\"thing"; meh=42; bleh') == \ - ('something', {'foo': 'other"thing', 'meh': '42', 'bleh': None}) - assert http.parse_options_header('something; foo="other;thing"; meh=42; bleh') == \ - ('something', {'foo': 'other;thing', 'meh': '42', 'bleh': None}) - assert http.parse_options_header('something; foo="otherthing"; meh=; bleh') == \ - ('something', {'foo': 'otherthing', 'meh': None, 'bleh': None}) - - - - def test_dump_options_header(self): - assert http.dump_options_header('foo', {'bar': 42}) == \ - 'foo; bar=42' - assert http.dump_options_header('foo', {'bar': 42, 'fizz': None}) in \ - ('foo; bar=42; fizz', 'foo; fizz; bar=42') - - def test_dump_header(self): - assert http.dump_header([1, 2, 3]) == '1, 2, 3' - assert http.dump_header([1, 2, 3], allow_token=False) == '"1", "2", "3"' - assert http.dump_header({'foo': 'bar'}, allow_token=False) == 'foo="bar"' - assert http.dump_header({'foo': 'bar'}) == 'foo=bar' - - def test_is_resource_modified(self): - env = create_environ() - - # ignore POST - env['REQUEST_METHOD'] = 'POST' - assert not http.is_resource_modified(env, etag='testing') - env['REQUEST_METHOD'] = 'GET' - - # etagify from data - self.assert_raises(TypeError, http.is_resource_modified, env, - data='42', etag='23') - env['HTTP_IF_NONE_MATCH'] = http.generate_etag(b'awesome') - assert not http.is_resource_modified(env, data=b'awesome') - - env['HTTP_IF_MODIFIED_SINCE'] = http.http_date(datetime(2008, 1, 1, 12, 30)) - assert not http.is_resource_modified(env, - last_modified=datetime(2008, 1, 1, 12, 00)) - assert http.is_resource_modified(env, - last_modified=datetime(2008, 1, 1, 13, 00)) - - def test_date_formatting(self): - assert http.cookie_date(0) == 'Thu, 01-Jan-1970 00:00:00 GMT' - assert http.cookie_date(datetime(1970, 1, 1)) == 'Thu, 01-Jan-1970 00:00:00 GMT' - assert http.http_date(0) == 'Thu, 01 Jan 1970 00:00:00 GMT' - assert http.http_date(datetime(1970, 1, 1)) == 'Thu, 01 Jan 1970 00:00:00 GMT' - - def test_cookies(self): - self.assert_strict_equal( - dict(http.parse_cookie('dismiss-top=6; CP=null*; PHPSESSID=0a539d42abc001cd' - 'c762809248d4beed; a=42')), - { - 'CP': u'null*', - 'PHPSESSID': u'0a539d42abc001cdc762809248d4beed', - 'a': u'42', - 'dismiss-top': u'6' - } - ) - self.assert_strict_equal( - set(http.dump_cookie('foo', 'bar baz blub', 360, httponly=True, - sync_expires=False).split(u'; ')), - set([u'HttpOnly', u'Max-Age=360', u'Path=/', u'foo="bar baz blub"']) - ) - self.assert_strict_equal(dict(http.parse_cookie('fo234{=bar; blub=Blah')), - {'fo234{': u'bar', 'blub': u'Blah'}) - - def test_cookie_quoting(self): - val = http.dump_cookie("foo", "?foo") - self.assert_strict_equal(val, 'foo="?foo"; Path=/') - self.assert_strict_equal(dict(http.parse_cookie(val)), {'foo': u'?foo'}) - - self.assert_strict_equal(dict(http.parse_cookie(r'foo="foo\054bar"')), - {'foo': u'foo,bar'}) - - def test_cookie_domain_resolving(self): - val = http.dump_cookie('foo', 'bar', domain=u'\N{SNOWMAN}.com') - self.assert_strict_equal(val, 'foo=bar; Domain=xn--n3h.com; Path=/') - - def test_cookie_unicode_dumping(self): - val = http.dump_cookie('foo', u'\N{SNOWMAN}') - h = datastructures.Headers() - h.add('Set-Cookie', val) - self.assert_equal(h['Set-Cookie'], 'foo="\\342\\230\\203"; Path=/') - - cookies = http.parse_cookie(h['Set-Cookie']) - self.assert_equal(cookies['foo'], u'\N{SNOWMAN}') - - def test_cookie_unicode_keys(self): - # Yes, this is technically against the spec but happens - val = http.dump_cookie(u'fö', u'fö') - self.assert_equal(val, wsgi_encoding_dance(u'fö="f\\303\\266"; Path=/', 'utf-8')) - cookies = http.parse_cookie(val) - self.assert_equal(cookies[u'fö'], u'fö') - - def test_cookie_unicode_parsing(self): - # This is actually a correct test. This is what is being submitted - # by firefox if you set an unicode cookie and we get the cookie sent - # in on Python 3 under PEP 3333. - cookies = http.parse_cookie(u'fö=fö') - self.assert_equal(cookies[u'fö'], u'fö') - - def test_cookie_domain_encoding(self): - val = http.dump_cookie('foo', 'bar', domain=u'\N{SNOWMAN}.com') - self.assert_strict_equal(val, 'foo=bar; Domain=xn--n3h.com; Path=/') - - val = http.dump_cookie('foo', 'bar', domain=u'.\N{SNOWMAN}.com') - self.assert_strict_equal(val, 'foo=bar; Domain=.xn--n3h.com; Path=/') - - val = http.dump_cookie('foo', 'bar', domain=u'.foo.com') - self.assert_strict_equal(val, 'foo=bar; Domain=.foo.com; Path=/') - - -class RangeTestCase(WerkzeugTestCase): - - def test_if_range_parsing(self): - rv = http.parse_if_range_header('"Test"') - assert rv.etag == 'Test' - assert rv.date is None - assert rv.to_header() == '"Test"' - - # weak information is dropped - rv = http.parse_if_range_header('w/"Test"') - assert rv.etag == 'Test' - assert rv.date is None - assert rv.to_header() == '"Test"' - - # broken etags are supported too - rv = http.parse_if_range_header('bullshit') - assert rv.etag == 'bullshit' - assert rv.date is None - assert rv.to_header() == '"bullshit"' - - rv = http.parse_if_range_header('Thu, 01 Jan 1970 00:00:00 GMT') - assert rv.etag is None - assert rv.date == datetime(1970, 1, 1) - assert rv.to_header() == 'Thu, 01 Jan 1970 00:00:00 GMT' - - for x in '', None: - rv = http.parse_if_range_header(x) - assert rv.etag is None - assert rv.date is None - assert rv.to_header() == '' - - def test_range_parsing(): - rv = http.parse_range_header('bytes=52') - assert rv is None - - rv = http.parse_range_header('bytes=52-') - assert rv.units == 'bytes' - assert rv.ranges == [(52, None)] - assert rv.to_header() == 'bytes=52-' - - rv = http.parse_range_header('bytes=52-99') - assert rv.units == 'bytes' - assert rv.ranges == [(52, 100)] - assert rv.to_header() == 'bytes=52-99' - - rv = http.parse_range_header('bytes=52-99,-1000') - assert rv.units == 'bytes' - assert rv.ranges == [(52, 100), (-1000, None)] - assert rv.to_header() == 'bytes=52-99,-1000' - - rv = http.parse_range_header('bytes = 1 - 100') - assert rv.units == 'bytes' - assert rv.ranges == [(1, 101)] - assert rv.to_header() == 'bytes=1-100' - - rv = http.parse_range_header('AWesomes=0-999') - assert rv.units == 'awesomes' - assert rv.ranges == [(0, 1000)] - assert rv.to_header() == 'awesomes=0-999' - - def test_content_range_parsing(): - rv = http.parse_content_range_header('bytes 0-98/*') - assert rv.units == 'bytes' - assert rv.start == 0 - assert rv.stop == 99 - assert rv.length is None - assert rv.to_header() == 'bytes 0-98/*' - - rv = http.parse_content_range_header('bytes 0-98/*asdfsa') - assert rv is None - - rv = http.parse_content_range_header('bytes 0-99/100') - assert rv.to_header() == 'bytes 0-99/100' - rv.start = None - rv.stop = None - assert rv.units == 'bytes' - assert rv.to_header() == 'bytes */100' - - rv = http.parse_content_range_header('bytes */100') - assert rv.start is None - assert rv.stop is None - assert rv.length == 100 - assert rv.units == 'bytes' - - -class RegressionTestCase(WerkzeugTestCase): - - def test_best_match_works(self): - # was a bug in 0.6 - rv = http.parse_accept_header('foo=,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,' - 'image/png,*/*;q=0.5', - datastructures.MIMEAccept).best_match(['foo/bar']) - self.assert_equal(rv, 'foo/bar') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(HTTPUtilityTestCase)) - suite.addTest(unittest.makeSuite(RegressionTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/internal.py b/vendor/werkzeug/testsuite/internal.py deleted file mode 100644 index 72a3ef88..00000000 --- a/vendor/werkzeug/testsuite/internal.py +++ /dev/null @@ -1,81 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.internal - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Internal tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from datetime import datetime -from warnings import filterwarnings, resetwarnings - -from werkzeug.testsuite import WerkzeugTestCase -from werkzeug.wrappers import Request, Response - -from werkzeug import _internal as internal -from werkzeug.test import create_environ - - -class InternalTestCase(WerkzeugTestCase): - - def test_date_to_unix(self): - assert internal._date_to_unix(datetime(1970, 1, 1)) == 0 - assert internal._date_to_unix(datetime(1970, 1, 1, 1, 0, 0)) == 3600 - assert internal._date_to_unix(datetime(1970, 1, 1, 1, 1, 1)) == 3661 - x = datetime(2010, 2, 15, 16, 15, 39) - assert internal._date_to_unix(x) == 1266250539 - - def test_easteregg(self): - req = Request.from_values('/?macgybarchakku') - resp = Response.force_type(internal._easteregg(None), req) - assert b'About Werkzeug' in resp.get_data() - assert b'the Swiss Army knife of Python web development' in resp.get_data() - - def test_wrapper_internals(self): - req = Request.from_values(data={'foo': 'bar'}, method='POST') - req._load_form_data() - assert req.form.to_dict() == {'foo': 'bar'} - - # second call does not break - req._load_form_data() - assert req.form.to_dict() == {'foo': 'bar'} - - # check reprs - assert repr(req) == "" - resp = Response() - assert repr(resp) == '' - resp.set_data('Hello World!') - assert repr(resp) == '' - resp.response = iter(['Test']) - assert repr(resp) == '' - - # unicode data does not set content length - response = Response([u'Hällo Wörld']) - headers = response.get_wsgi_headers(create_environ()) - assert u'Content-Length' not in headers - - response = Response([u'Hällo Wörld'.encode('utf-8')]) - headers = response.get_wsgi_headers(create_environ()) - assert u'Content-Length' in headers - - # check for internal warnings - filterwarnings('error', category=Warning) - response = Response() - environ = create_environ() - response.response = 'What the...?' - self.assert_raises(Warning, lambda: list(response.iter_encoded())) - self.assert_raises(Warning, lambda: list(response.get_app_iter(environ))) - response.direct_passthrough = True - self.assert_raises(Warning, lambda: list(response.iter_encoded())) - self.assert_raises(Warning, lambda: list(response.get_app_iter(environ))) - resetwarnings() - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(InternalTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/local.py b/vendor/werkzeug/testsuite/local.py deleted file mode 100644 index 0f8294fd..00000000 --- a/vendor/werkzeug/testsuite/local.py +++ /dev/null @@ -1,159 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.local - ~~~~~~~~~~~~~~~~~~~~~~~~ - - Local and local proxy tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import time -import unittest -from threading import Thread - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import local - - -class LocalTestCase(WerkzeugTestCase): - - def test_basic_local(self): - l = local.Local() - l.foo = 0 - values = [] - def value_setter(idx): - time.sleep(0.01 * idx) - l.foo = idx - time.sleep(0.02) - values.append(l.foo) - threads = [Thread(target=value_setter, args=(x,)) - for x in [1, 2, 3]] - for thread in threads: - thread.start() - time.sleep(0.2) - assert sorted(values) == [1, 2, 3] - - def delfoo(): - del l.foo - delfoo() - self.assert_raises(AttributeError, lambda: l.foo) - self.assert_raises(AttributeError, delfoo) - - local.release_local(l) - - def test_local_release(self): - loc = local.Local() - loc.foo = 42 - local.release_local(loc) - assert not hasattr(loc, 'foo') - - ls = local.LocalStack() - ls.push(42) - local.release_local(ls) - assert ls.top is None - - def test_local_proxy(self): - foo = [] - ls = local.LocalProxy(lambda: foo) - ls.append(42) - ls.append(23) - ls[1:] = [1, 2, 3] - assert foo == [42, 1, 2, 3] - assert repr(foo) == repr(ls) - assert foo[0] == 42 - foo += [1] - assert list(foo) == [42, 1, 2, 3, 1] - - def test_local_proxy_operations_math(self): - foo = 2 - ls = local.LocalProxy(lambda: foo) - assert ls + 1 == 3 - assert 1 + ls == 3 - assert ls - 1 == 1 - assert 1 - ls == -1 - assert ls * 1 == 2 - assert 1 * ls == 2 - assert ls / 1 == 2 - assert 1.0 / ls == 0.5 - assert ls // 1.0 == 2.0 - assert 1.0 // ls == 0.0 - assert ls % 2 == 0 - assert 2 % ls == 0 - - def test_local_proxy_operations_strings(self): - foo = "foo" - ls = local.LocalProxy(lambda: foo) - assert ls + "bar" == "foobar" - assert "bar" + ls == "barfoo" - assert ls * 2 == "foofoo" - - foo = "foo %s" - assert ls % ("bar",) == "foo bar" - - def test_local_stack(self): - ident = local.get_ident() - - ls = local.LocalStack() - assert ident not in ls._local.__storage__ - assert ls.top is None - ls.push(42) - assert ident in ls._local.__storage__ - assert ls.top == 42 - ls.push(23) - assert ls.top == 23 - ls.pop() - assert ls.top == 42 - ls.pop() - assert ls.top is None - assert ls.pop() is None - assert ls.pop() is None - - proxy = ls() - ls.push([1, 2]) - assert proxy == [1, 2] - ls.push((1, 2)) - assert proxy == (1, 2) - ls.pop() - ls.pop() - assert repr(proxy) == '' - - assert ident not in ls._local.__storage__ - - def test_local_proxies_with_callables(self): - foo = 42 - ls = local.LocalProxy(lambda: foo) - assert ls == 42 - foo = [23] - ls.append(42) - assert ls == [23, 42] - assert foo == [23, 42] - - def test_custom_idents(self): - ident = 0 - loc = local.Local() - stack = local.LocalStack() - mgr = local.LocalManager([loc, stack], ident_func=lambda: ident) - - loc.foo = 42 - stack.push({'foo': 42}) - ident = 1 - loc.foo = 23 - stack.push({'foo': 23}) - ident = 0 - assert loc.foo == 42 - assert stack.top['foo'] == 42 - stack.pop() - assert stack.top is None - ident = 1 - assert loc.foo == 23 - assert stack.top['foo'] == 23 - stack.pop() - assert stack.top is None - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(LocalTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/multipart/collect.py b/vendor/werkzeug/testsuite/multipart/collect.py deleted file mode 100644 index daa0e09e..00000000 --- a/vendor/werkzeug/testsuite/multipart/collect.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python -""" -Hacky helper application to collect form data. -""" -from werkzeug.serving import run_simple -from werkzeug.wrappers import Request, Response - - -def copy_stream(request): - from os import mkdir - from time import time - folder = 'request-%d' % time() - mkdir(folder) - environ = request.environ - f = open(folder + '/request.txt', 'wb+') - f.write(environ['wsgi.input'].read(int(environ['CONTENT_LENGTH']))) - f.flush() - f.seek(0) - environ['wsgi.input'] = f - request.stat_folder = folder - - -def stats(request): - copy_stream(request) - f1 = request.files['file1'] - f2 = request.files['file2'] - text = request.form['text'] - f1.save(request.stat_folder + '/file1.bin') - f2.save(request.stat_folder + '/file2.bin') - open(request.stat_folder + '/text.txt', 'w').write(text.encode('utf-8')) - return Response('Done.') - - -def upload_file(request): - return Response(''' -

    Upload File

    -
    -
    -
    -
    - -
    - ''', mimetype='text/html') - - -def application(environ, start_responseonse): - request = Request(environ) - if request.method == 'POST': - response = stats(request) - else: - response = upload_file(request) - return response(environ, start_responseonse) - - -if __name__ == '__main__': - run_simple('localhost', 5000, application, use_debugger=True) diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file1.png b/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file1.png deleted file mode 100644 index 9b3422c6..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file1.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file2.png b/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file2.png deleted file mode 100644 index fb2efb87..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/file2.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/request.txt b/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/request.txt deleted file mode 100644 index 721e04e3..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/text.txt b/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/text.txt deleted file mode 100644 index c87634d5..00000000 --- a/vendor/werkzeug/testsuite/multipart/firefox3-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -example text \ No newline at end of file diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file1.png b/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file1.png deleted file mode 100644 index 89c8129a..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file1.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file2.png b/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file2.png deleted file mode 100644 index 6332fefe..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/file2.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/request.txt b/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/request.txt deleted file mode 100644 index 489290b6..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/text.txt b/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/text.txt deleted file mode 100644 index 3bf804d5..00000000 --- a/vendor/werkzeug/testsuite/multipart/firefox3-2pnglongtext/text.txt +++ /dev/null @@ -1,3 +0,0 @@ ---long text ---with boundary ---lookalikes-- \ No newline at end of file diff --git a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file1.png b/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file1.png deleted file mode 100644 index 9b3422c6..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file1.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file2.png b/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file2.png deleted file mode 100644 index fb2efb87..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/file2.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/request.txt b/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/request.txt deleted file mode 100644 index 59fdeae2..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/text.txt b/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/text.txt deleted file mode 100644 index 7c465b7a..00000000 --- a/vendor/werkzeug/testsuite/multipart/ie6-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -ie6 sucks :-/ \ No newline at end of file diff --git a/vendor/werkzeug/testsuite/multipart/ie7_full_path_request.txt b/vendor/werkzeug/testsuite/multipart/ie7_full_path_request.txt deleted file mode 100644 index acc4e2e1..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/ie7_full_path_request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file1.png b/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file1.png deleted file mode 100644 index 7542db1d..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file1.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file2.png b/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file2.png deleted file mode 100644 index 658c7117..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/file2.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/request.txt b/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/request.txt deleted file mode 100644 index 8f325914..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/text.txt b/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/text.txt deleted file mode 100644 index ca01cb00..00000000 --- a/vendor/werkzeug/testsuite/multipart/opera8-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -blafasel öäü \ No newline at end of file diff --git a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file1.png b/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file1.png deleted file mode 100644 index afca0732..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file1.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file2.png b/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file2.png deleted file mode 100644 index 2a7da6e2..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/file2.png and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/request.txt b/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/request.txt deleted file mode 100644 index b4ce0eef..00000000 Binary files a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/request.txt and /dev/null differ diff --git a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/text.txt b/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/text.txt deleted file mode 100644 index baa13008..00000000 --- a/vendor/werkzeug/testsuite/multipart/webkit3-2png1txt/text.txt +++ /dev/null @@ -1 +0,0 @@ -this is another text with ümläüts \ No newline at end of file diff --git a/vendor/werkzeug/testsuite/res/test.txt b/vendor/werkzeug/testsuite/res/test.txt deleted file mode 100644 index a8efdcc3..00000000 --- a/vendor/werkzeug/testsuite/res/test.txt +++ /dev/null @@ -1 +0,0 @@ -FOUND diff --git a/vendor/werkzeug/testsuite/routing.py b/vendor/werkzeug/testsuite/routing.py deleted file mode 100644 index 5715b526..00000000 --- a/vendor/werkzeug/testsuite/routing.py +++ /dev/null @@ -1,673 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.routing - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Routing tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import routing as r -from werkzeug.wrappers import Response -from werkzeug.datastructures import ImmutableDict -from werkzeug.test import create_environ - - -class RoutingTestCase(WerkzeugTestCase): - - def test_basic_routing(self): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - assert adapter.match('/') == ('index', {}) - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/bar/') == ('bar', {}) - self.assert_raises(r.RequestRedirect, lambda: adapter.match('/bar')) - self.assert_raises(r.NotFound, lambda: adapter.match('/blub')) - - adapter = map.bind('example.org', '/test') - try: - adapter.match('/bar') - except r.RequestRedirect as e: - assert e.new_url == 'http://example.org/test/bar/' - else: - self.fail('Expected request redirect') - - adapter = map.bind('example.org', '/') - try: - adapter.match('/bar') - except r.RequestRedirect as e: - assert e.new_url == 'http://example.org/bar/' - else: - self.fail('Expected request redirect') - - adapter = map.bind('example.org', '/') - try: - adapter.match('/bar', query_args={'aha': 'muhaha'}) - except r.RequestRedirect as e: - assert e.new_url == 'http://example.org/bar/?aha=muhaha' - else: - self.fail('Expected request redirect') - - adapter = map.bind('example.org', '/') - try: - adapter.match('/bar', query_args='aha=muhaha') - except r.RequestRedirect as e: - assert e.new_url == 'http://example.org/bar/?aha=muhaha' - else: - self.fail('Expected request redirect') - - adapter = map.bind_to_environ(create_environ('/bar?foo=bar', - 'http://example.org/')) - try: - adapter.match() - except r.RequestRedirect as e: - assert e.new_url == 'http://example.org/bar/?foo=bar' - else: - self.fail('Expected request redirect') - - def test_environ_defaults(self): - environ = create_environ("/foo") - self.assert_strict_equal(environ["PATH_INFO"], '/foo') - m = r.Map([r.Rule("/foo", endpoint="foo"), r.Rule("/bar", endpoint="bar")]) - a = m.bind_to_environ(environ) - self.assert_strict_equal(a.match("/foo"), ('foo', {})) - self.assert_strict_equal(a.match(), ('foo', {})) - self.assert_strict_equal(a.match("/bar"), ('bar', {})) - self.assert_raises(r.NotFound, a.match, "/bars") - - def test_environ_nonascii_pathinfo(self): - environ = create_environ(u'/лошадь') - m = r.Map([ - r.Rule(u'/', endpoint='index'), - r.Rule(u'/лошадь', endpoint='horse') - ]) - a = m.bind_to_environ(environ) - self.assert_strict_equal(a.match(u'/'), ('index', {})) - self.assert_strict_equal(a.match(u'/лошадь'), ('horse', {})) - self.assert_raises(r.NotFound, a.match, u'/барсук') - - def test_basic_building(self): - map = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/foo', endpoint='foo'), - r.Rule('/bar/', endpoint='bar'), - r.Rule('/bar/', endpoint='bari'), - r.Rule('/bar/', endpoint='barf'), - r.Rule('/bar/', endpoint='barp'), - r.Rule('/hehe', endpoint='blah', subdomain='blah') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - - assert adapter.build('index', {}) == 'http://example.org/' - assert adapter.build('foo', {}) == 'http://example.org/foo' - assert adapter.build('bar', {'baz': 'blub'}) == 'http://example.org/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == 'http://example.org/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == 'http://example.org/bar/la/di' - assert adapter.build('blah', {}) == '/hehe' - self.assert_raises(r.BuildError, lambda: adapter.build('urks')) - - adapter = map.bind('example.org', '/test', subdomain='blah') - assert adapter.build('index', {}) == 'http://example.org/test/' - assert adapter.build('foo', {}) == 'http://example.org/test/foo' - assert adapter.build('bar', {'baz': 'blub'}) == 'http://example.org/test/bar/blub' - assert adapter.build('bari', {'bazi': 50}) == 'http://example.org/test/bar/50' - assert adapter.build('barf', {'bazf': 0.815}) == 'http://example.org/test/bar/0.815' - assert adapter.build('barp', {'bazp': 'la/di'}) == 'http://example.org/test/bar/la/di' - assert adapter.build('blah', {}) == '/test/hehe' - - def test_defaults(self): - map = r.Map([ - r.Rule('/foo/', defaults={'page': 1}, endpoint='foo'), - r.Rule('/foo/', endpoint='foo') - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/foo/') == ('foo', {'page': 1}) - self.assert_raises(r.RequestRedirect, lambda: adapter.match('/foo/1')) - assert adapter.match('/foo/2') == ('foo', {'page': 2}) - assert adapter.build('foo', {}) == '/foo/' - assert adapter.build('foo', {'page': 1}) == '/foo/' - assert adapter.build('foo', {'page': 2}) == '/foo/2' - - def test_greedy(self): - map = r.Map([ - r.Rule('/foo', endpoint='foo'), - r.Rule('/', endpoint='bar'), - r.Rule('//', endpoint='bar') - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/foo') == ('foo', {}) - assert adapter.match('/blub') == ('bar', {'bar': 'blub'}) - assert adapter.match('/he/he') == ('bar', {'bar': 'he', 'blub': 'he'}) - - assert adapter.build('foo', {}) == '/foo' - assert adapter.build('bar', {'bar': 'blub'}) == '/blub' - assert adapter.build('bar', {'bar': 'blub', 'blub': 'bar'}) == '/blub/bar' - - def test_path(self): - map = r.Map([ - r.Rule('/', defaults={'name': 'FrontPage'}, endpoint='page'), - r.Rule('/Special', endpoint='special'), - r.Rule('/', endpoint='year'), - r.Rule('/', endpoint='page'), - r.Rule('//edit', endpoint='editpage'), - r.Rule('//silly/', endpoint='sillypage'), - r.Rule('//silly//edit', endpoint='editsillypage'), - r.Rule('/Talk:', endpoint='talk'), - r.Rule('/User:', endpoint='user'), - r.Rule('/User:/', endpoint='userpage'), - r.Rule('/Files/', endpoint='files'), - ]) - adapter = map.bind('example.org', '/') - - assert adapter.match('/') == ('page', {'name':'FrontPage'}) - self.assert_raises(r.RequestRedirect, lambda: adapter.match('/FrontPage')) - assert adapter.match('/Special') == ('special', {}) - assert adapter.match('/2007') == ('year', {'year':2007}) - assert adapter.match('/Some/Page') == ('page', {'name':'Some/Page'}) - assert adapter.match('/Some/Page/edit') == ('editpage', {'name':'Some/Page'}) - assert adapter.match('/Foo/silly/bar') == ('sillypage', {'name':'Foo', 'name2':'bar'}) - assert adapter.match('/Foo/silly/bar/edit') == ('editsillypage', {'name':'Foo', 'name2':'bar'}) - assert adapter.match('/Talk:Foo/Bar') == ('talk', {'name':'Foo/Bar'}) - assert adapter.match('/User:thomas') == ('user', {'username':'thomas'}) - assert adapter.match('/User:thomas/projects/werkzeug') == \ - ('userpage', {'username':'thomas', 'name':'projects/werkzeug'}) - assert adapter.match('/Files/downloads/werkzeug/0.2.zip') == \ - ('files', {'file':'downloads/werkzeug/0.2.zip'}) - - def test_dispatch(self): - env = create_environ('/') - map = r.Map([ - r.Rule('/', endpoint='root'), - r.Rule('/foo/', endpoint='foo') - ]) - adapter = map.bind_to_environ(env) - - raise_this = None - def view_func(endpoint, values): - if raise_this is not None: - raise raise_this - return Response(repr((endpoint, values))) - dispatch = lambda p, q=False: Response.force_type(adapter.dispatch(view_func, p, - catch_http_exceptions=q), env) - - assert dispatch('/').data == b"('root', {})" - assert dispatch('/foo').status_code == 301 - raise_this = r.NotFound() - self.assert_raises(r.NotFound, lambda: dispatch('/bar')) - assert dispatch('/bar', True).status_code == 404 - - def test_http_host_before_server_name(self): - env = { - 'HTTP_HOST': 'wiki.example.com', - 'SERVER_NAME': 'web0.example.com', - 'SERVER_PORT': '80', - 'SCRIPT_NAME': '', - 'PATH_INFO': '', - 'REQUEST_METHOD': 'GET', - 'wsgi.url_scheme': 'http' - } - map = r.Map([r.Rule('/', endpoint='index', subdomain='wiki')]) - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.match('/') == ('index', {}) - assert adapter.build('index', force_external=True) == 'http://wiki.example.com/' - assert adapter.build('index') == '/' - - env['HTTP_HOST'] = 'admin.example.com' - adapter = map.bind_to_environ(env, server_name='example.com') - assert adapter.build('index') == 'http://wiki.example.com/' - - def test_adapter_url_parameter_sorting(self): - map = r.Map([r.Rule('/', endpoint='index')], sort_parameters=True, - sort_key=lambda x: x[1]) - adapter = map.bind('localhost', '/') - assert adapter.build('index', {'x': 20, 'y': 10, 'z': 30}, - force_external=True) == 'http://localhost/?y=10&x=20&z=30' - - def test_request_direct_charset_bug(self): - map = r.Map([r.Rule(u'/öäü/')]) - adapter = map.bind('localhost', '/') - try: - adapter.match(u'/öäü') - except r.RequestRedirect as e: - assert e.new_url == 'http://localhost/%C3%B6%C3%A4%C3%BC/' - else: - self.fail('expected request redirect exception') - - def test_request_redirect_default(self): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}), - r.Rule(u'/foo/')]) - adapter = map.bind('localhost', '/') - try: - adapter.match(u'/foo/42') - except r.RequestRedirect as e: - assert e.new_url == 'http://localhost/foo' - else: - self.fail('expected request redirect exception') - - def test_request_redirect_default_subdomain(self): - map = r.Map([r.Rule(u'/foo', defaults={'bar': 42}, subdomain='test'), - r.Rule(u'/foo/', subdomain='other')]) - adapter = map.bind('localhost', '/', subdomain='other') - try: - adapter.match(u'/foo/42') - except r.RequestRedirect as e: - assert e.new_url == 'http://test.localhost/foo' - else: - self.fail('expected request redirect exception') - - def test_adapter_match_return_rule(self): - rule = r.Rule('/foo/', endpoint='foo') - map = r.Map([rule]) - adapter = map.bind('localhost', '/') - assert adapter.match('/foo/', return_rule=True) == (rule, {}) - - def test_server_name_interpolation(self): - server_name = 'example.invalid' - map = r.Map([r.Rule('/', endpoint='index'), - r.Rule('/', endpoint='alt', subdomain='alt')]) - - env = create_environ('/', 'http://%s/' % server_name) - adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('index', {}) - - env = create_environ('/', 'http://alt.%s/' % server_name) - adapter = map.bind_to_environ(env, server_name=server_name) - assert adapter.match() == ('alt', {}) - - env = create_environ('/', 'http://%s/' % server_name) - adapter = map.bind_to_environ(env, server_name='foo') - assert adapter.subdomain == '' - - def test_rule_emptying(self): - rule = r.Rule('/foo', {'meh': 'muh'}, 'x', ['POST'], - False, 'x', True, None) - rule2 = rule.empty() - assert rule.__dict__ == rule2.__dict__ - rule.methods.add('GET') - assert rule.__dict__ != rule2.__dict__ - rule.methods.discard('GET') - rule.defaults['meh'] = 'aha' - assert rule.__dict__ != rule2.__dict__ - - def test_rule_templates(self): - testcase = r.RuleTemplate( - [ r.Submount('/test/$app', - [ r.Rule('/foo/', endpoint='handle_foo') - , r.Rule('/bar/', endpoint='handle_bar') - , r.Rule('/baz/', endpoint='handle_baz') - ]), - r.EndpointPrefix('${app}', - [ r.Rule('/${app}-blah', endpoint='bar') - , r.Rule('/${app}-meh', endpoint='baz') - ]), - r.Subdomain('$app', - [ r.Rule('/blah', endpoint='x_bar') - , r.Rule('/meh', endpoint='x_baz') - ]) - ]) - - url_map = r.Map( - [ testcase(app='test1') - , testcase(app='test2') - , testcase(app='test3') - , testcase(app='test4') - ]) - - out = sorted([(x.rule, x.subdomain, x.endpoint) - for x in url_map.iter_rules()]) - - assert out == ([ - ('/blah', 'test1', 'x_bar'), - ('/blah', 'test2', 'x_bar'), - ('/blah', 'test3', 'x_bar'), - ('/blah', 'test4', 'x_bar'), - ('/meh', 'test1', 'x_baz'), - ('/meh', 'test2', 'x_baz'), - ('/meh', 'test3', 'x_baz'), - ('/meh', 'test4', 'x_baz'), - ('/test/test1/bar/', '', 'handle_bar'), - ('/test/test1/baz/', '', 'handle_baz'), - ('/test/test1/foo/', '', 'handle_foo'), - ('/test/test2/bar/', '', 'handle_bar'), - ('/test/test2/baz/', '', 'handle_baz'), - ('/test/test2/foo/', '', 'handle_foo'), - ('/test/test3/bar/', '', 'handle_bar'), - ('/test/test3/baz/', '', 'handle_baz'), - ('/test/test3/foo/', '', 'handle_foo'), - ('/test/test4/bar/', '', 'handle_bar'), - ('/test/test4/baz/', '', 'handle_baz'), - ('/test/test4/foo/', '', 'handle_foo'), - ('/test1-blah', '', 'test1bar'), - ('/test1-meh', '', 'test1baz'), - ('/test2-blah', '', 'test2bar'), - ('/test2-meh', '', 'test2baz'), - ('/test3-blah', '', 'test3bar'), - ('/test3-meh', '', 'test3baz'), - ('/test4-blah', '', 'test4bar'), - ('/test4-meh', '', 'test4baz') - ]) - - def test_non_string_parts(self): - m = r.Map([ - r.Rule('/', endpoint='foo') - ]) - a = m.bind('example.com') - self.assert_equal(a.build('foo', {'foo': 42}), '/42') - - def test_complex_routing_rules(self): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/', endpoint='an_int'), - r.Rule('/', endpoint='a_string'), - r.Rule('/foo/', endpoint='nested'), - r.Rule('/foobar/', endpoint='nestedbar'), - r.Rule('/foo//', endpoint='nested_show'), - r.Rule('/foo//edit', endpoint='nested_edit'), - r.Rule('/users/', endpoint='users', defaults={'page': 1}), - r.Rule('/users/page/', endpoint='users'), - r.Rule('/foox', endpoint='foox'), - r.Rule('//', endpoint='barx_path_path') - ]) - a = m.bind('example.com') - - assert a.match('/') == ('index', {}) - assert a.match('/42') == ('an_int', {'blub': 42}) - assert a.match('/blub') == ('a_string', {'blub': 'blub'}) - assert a.match('/foo/') == ('nested', {}) - assert a.match('/foobar/') == ('nestedbar', {}) - assert a.match('/foo/1/2/3/') == ('nested_show', {'testing': '1/2/3'}) - assert a.match('/foo/1/2/3/edit') == ('nested_edit', {'testing': '1/2/3'}) - assert a.match('/users/') == ('users', {'page': 1}) - assert a.match('/users/page/2') == ('users', {'page': 2}) - assert a.match('/foox') == ('foox', {}) - assert a.match('/1/2/3') == ('barx_path_path', {'bar': '1', 'blub': '2/3'}) - - assert a.build('index') == '/' - assert a.build('an_int', {'blub': 42}) == '/42' - assert a.build('a_string', {'blub': 'test'}) == '/test' - assert a.build('nested') == '/foo/' - assert a.build('nestedbar') == '/foobar/' - assert a.build('nested_show', {'testing': '1/2/3'}) == '/foo/1/2/3/' - assert a.build('nested_edit', {'testing': '1/2/3'}) == '/foo/1/2/3/edit' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' - assert a.build('foox') == '/foox' - assert a.build('barx_path_path', {'bar': '1', 'blub': '2/3'}) == '/1/2/3' - - def test_default_converters(self): - class MyMap(r.Map): - default_converters = r.Map.default_converters.copy() - default_converters['foo'] = r.UnicodeConverter - assert isinstance(r.Map.default_converters, ImmutableDict) - m = MyMap([ - r.Rule('/a/', endpoint='a'), - r.Rule('/b/', endpoint='b'), - r.Rule('/c/', endpoint='c') - ], converters={'bar': r.UnicodeConverter}) - a = m.bind('example.org', '/') - assert a.match('/a/1') == ('a', {'a': '1'}) - assert a.match('/b/2') == ('b', {'b': '2'}) - assert a.match('/c/3') == ('c', {'c': '3'}) - assert 'foo' not in r.Map.default_converters - - def test_build_append_unknown(self): - map = r.Map([ - r.Rule('/bar/', endpoint='barf') - ]) - adapter = map.bind('example.org', '/', subdomain='blah') - assert adapter.build('barf', {'bazf': 0.815, 'bif' : 1.0}) == \ - 'http://example.org/bar/0.815?bif=1.0' - assert adapter.build('barf', {'bazf': 0.815, 'bif' : 1.0}, - append_unknown=False) == 'http://example.org/bar/0.815' - - def test_method_fallback(self): - map = r.Map([ - r.Rule('/', endpoint='index', methods=['GET']), - r.Rule('/', endpoint='hello_name', methods=['GET']), - r.Rule('/select', endpoint='hello_select', methods=['POST']), - r.Rule('/search_get', endpoint='search', methods=['GET']), - r.Rule('/search_post', endpoint='search', methods=['POST']) - ]) - adapter = map.bind('example.com') - assert adapter.build('index') == '/' - assert adapter.build('index', method='GET') == '/' - assert adapter.build('hello_name', {'name': 'foo'}) == '/foo' - assert adapter.build('hello_select') == '/select' - assert adapter.build('hello_select', method='POST') == '/select' - assert adapter.build('search') == '/search_get' - assert adapter.build('search', method='GET') == '/search_get' - assert adapter.build('search', method='POST') == '/search_post' - - def test_implicit_head(self): - url_map = r.Map([ - r.Rule('/get', methods=['GET'], endpoint='a'), - r.Rule('/post', methods=['POST'], endpoint='b') - ]) - adapter = url_map.bind('example.org') - assert adapter.match('/get', method='HEAD') == ('a', {}) - self.assert_raises(r.MethodNotAllowed, adapter.match, - '/post', method='HEAD') - - def test_protocol_joining_bug(self): - m = r.Map([r.Rule('/', endpoint='x')]) - a = m.bind('example.org') - assert a.build('x', {'foo': 'x:y'}) == '/x:y' - assert a.build('x', {'foo': 'x:y'}, force_external=True) == \ - 'http://example.org/x:y' - - def test_allowed_methods_querying(self): - m = r.Map([r.Rule('/', methods=['GET', 'HEAD']), - r.Rule('/foo', methods=['POST'])]) - a = m.bind('example.org') - assert sorted(a.allowed_methods('/foo')) == ['GET', 'HEAD', 'POST'] - - def test_external_building_with_port(self): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - adapter = map.bind('example.org:5000', '/') - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url - - def test_external_building_with_port_bind_to_environ(self): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - adapter = map.bind_to_environ( - create_environ('/', 'http://example.org:5000/'), - server_name="example.org:5000" - ) - built_url = adapter.build('index', {}, force_external=True) - assert built_url == 'http://example.org:5000/', built_url - - def test_external_building_with_port_bind_to_environ_wrong_servername(self): - map = r.Map([ - r.Rule('/', endpoint='index'), - ]) - environ = create_environ('/', 'http://example.org:5000/') - adapter = map.bind_to_environ(environ, server_name="example.org") - assert adapter.subdomain == '' - - def test_converter_parser(self): - args, kwargs = r.parse_converter_args(u'test, a=1, b=3.0') - - assert args == ('test',) - assert kwargs == {'a': 1, 'b': 3.0 } - - args, kwargs = r.parse_converter_args('') - assert not args and not kwargs - - args, kwargs = r.parse_converter_args('a, b, c,') - assert args == ('a', 'b', 'c') - assert not kwargs - - args, kwargs = r.parse_converter_args('True, False, None') - assert args == (True, False, None) - - args, kwargs = r.parse_converter_args('"foo", u"bar"') - assert args == ('foo', 'bar') - - def test_alias_redirects(self): - m = r.Map([ - r.Rule('/', endpoint='index'), - r.Rule('/index.html', endpoint='index', alias=True), - r.Rule('/users/', defaults={'page': 1}, endpoint='users'), - r.Rule('/users/index.html', defaults={'page': 1}, alias=True, - endpoint='users'), - r.Rule('/users/page/', endpoint='users'), - r.Rule('/users/page-.html', alias=True, endpoint='users'), - ]) - a = m.bind('example.com') - - def ensure_redirect(path, new_url, args=None): - try: - a.match(path, query_args=args) - except r.RequestRedirect as e: - assert e.new_url == 'http://example.com' + new_url - else: - assert False, 'expected redirect' - - ensure_redirect('/index.html', '/') - ensure_redirect('/users/index.html', '/users/') - ensure_redirect('/users/page-2.html', '/users/page/2') - ensure_redirect('/users/page-1.html', '/users/') - ensure_redirect('/users/page-1.html', '/users/?foo=bar', {'foo': 'bar'}) - - assert a.build('index') == '/' - assert a.build('users', {'page': 1}) == '/users/' - assert a.build('users', {'page': 2}) == '/users/page/2' - - def test_double_defaults(self): - for prefix in '', '/aaa': - m = r.Map([ - r.Rule(prefix + '/', defaults={'foo': 1, 'bar': False}, endpoint='x'), - r.Rule(prefix + '/', defaults={'bar': False}, endpoint='x'), - r.Rule(prefix + '/bar/', defaults={'foo': 1, 'bar': True}, endpoint='x'), - r.Rule(prefix + '/bar/', defaults={'bar': True}, endpoint='x') - ]) - a = m.bind('example.com') - - assert a.match(prefix + '/') == ('x', {'foo': 1, 'bar': False}) - assert a.match(prefix + '/2') == ('x', {'foo': 2, 'bar': False}) - assert a.match(prefix + '/bar/') == ('x', {'foo': 1, 'bar': True}) - assert a.match(prefix + '/bar/2') == ('x', {'foo': 2, 'bar': True}) - - assert a.build('x', {'foo': 1, 'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 2, 'bar': False}) == prefix + '/2' - assert a.build('x', {'bar': False}) == prefix + '/' - assert a.build('x', {'foo': 1, 'bar': True}) == prefix + '/bar/' - assert a.build('x', {'foo': 2, 'bar': True}) == prefix + '/bar/2' - assert a.build('x', {'bar': True}) == prefix + '/bar/' - - def test_host_matching(self): - m = r.Map([ - r.Rule('/', endpoint='index', host='www.'), - r.Rule('/', endpoint='files', host='files.'), - r.Rule('/foo/', defaults={'page': 1}, host='www.', endpoint='x'), - r.Rule('/', host='files.', endpoint='x') - ], host_matching=True) - - a = m.bind('www.example.com') - assert a.match('/') == ('index', {'domain': 'example.com'}) - assert a.match('/foo/') == ('x', {'domain': 'example.com', 'page': 1}) - try: - a.match('/foo') - except r.RequestRedirect as e: - assert e.new_url == 'http://www.example.com/foo/' - else: - assert False, 'expected redirect' - - a = m.bind('files.example.com') - assert a.match('/') == ('files', {'domain': 'example.com'}) - assert a.match('/2') == ('x', {'domain': 'example.com', 'page': 2}) - try: - a.match('/1') - except r.RequestRedirect as e: - assert e.new_url == 'http://www.example.com/foo/' - else: - assert False, 'expected redirect' - - def test_server_name_casing(self): - m = r.Map([ - r.Rule('/', endpoint='index', subdomain='foo') - ]) - - env = create_environ() - env['SERVER_NAME'] = env['HTTP_HOST'] = 'FOO.EXAMPLE.COM' - a = m.bind_to_environ(env, server_name='example.com') - assert a.match('/') == ('index', {}) - - env = create_environ() - env['SERVER_NAME'] = '127.0.0.1' - env['SERVER_PORT'] = '5000' - del env['HTTP_HOST'] - a = m.bind_to_environ(env, server_name='example.com') - try: - a.match() - except r.NotFound: - pass - else: - assert False, 'Expected not found exception' - - def test_redirect_request_exception_code(self): - exc = r.RequestRedirect('http://www.google.com/') - exc.code = 307 - env = create_environ() - self.assert_strict_equal(exc.get_response(env).status_code, exc.code) - - def test_unicode_rules(self): - m = r.Map([ - r.Rule(u'/войти/', endpoint='enter'), - r.Rule(u'/foo+bar/', endpoint='foobar') - ]) - a = m.bind(u'☃.example.com') - try: - a.match(u'/войти') - except r.RequestRedirect as e: - self.assert_strict_equal(e.new_url, 'http://xn--n3h.example.com/' - '%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') - endpoint, values = a.match(u'/войти/') - self.assert_strict_equal(endpoint, 'enter') - self.assert_strict_equal(values, {}) - - try: - a.match(u'/foo+bar') - except r.RequestRedirect as e: - self.assert_strict_equal(e.new_url, 'http://xn--n3h.example.com/' - 'foo+bar/') - endpoint, values = a.match(u'/foo+bar/') - self.assert_strict_equal(endpoint, 'foobar') - self.assert_strict_equal(values, {}) - - url = a.build('enter', {}, force_external=True) - self.assert_strict_equal(url, 'http://xn--n3h.example.com/%D0%B2%D0%BE%D0%B9%D1%82%D0%B8/') - - url = a.build('foobar', {}, force_external=True) - self.assert_strict_equal(url, 'http://xn--n3h.example.com/foo+bar/') - - def test_map_repr(self): - m = r.Map([ - r.Rule(u'/wat', endpoint='enter'), - r.Rule(u'/woop', endpoint='foobar') - ]) - rv = repr(m) - self.assert_strict_equal(rv, - "Map([ foobar>, enter>])") - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(RoutingTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/security.py b/vendor/werkzeug/testsuite/security.py deleted file mode 100644 index 482b7aac..00000000 --- a/vendor/werkzeug/testsuite/security.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.security - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the security helpers. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import os -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.security import check_password_hash, generate_password_hash, \ - safe_join, pbkdf2_hex - - -class SecurityTestCase(WerkzeugTestCase): - - def test_password_hashing(self): - hash0 = generate_password_hash('default') - assert check_password_hash(hash0, 'default') - assert hash0.startswith('pbkdf2:sha1:1000$') - - hash1 = generate_password_hash('default', 'sha1') - hash2 = generate_password_hash(u'default', method='sha1') - assert hash1 != hash2 - assert check_password_hash(hash1, 'default') - assert check_password_hash(hash2, 'default') - assert hash1.startswith('sha1$') - assert hash2.startswith('sha1$') - - fakehash = generate_password_hash('default', method='plain') - assert fakehash == 'plain$$default' - assert check_password_hash(fakehash, 'default') - - mhash = generate_password_hash(u'default', method='md5') - assert mhash.startswith('md5$') - assert check_password_hash(mhash, 'default') - - legacy = 'md5$$c21f969b5f03d33d43e04f8f136e7682' - assert check_password_hash(legacy, 'default') - - legacy = u'md5$$c21f969b5f03d33d43e04f8f136e7682' - assert check_password_hash(legacy, 'default') - - def test_safe_join(self): - assert safe_join('foo', 'bar/baz') == os.path.join('foo', 'bar/baz') - assert safe_join('foo', '../bar/baz') is None - if os.name == 'nt': - assert safe_join('foo', 'foo\\bar') is None - - def test_pbkdf2(self): - def check(data, salt, iterations, keylen, expected): - rv = pbkdf2_hex(data, salt, iterations, keylen) - self.assert_equal(rv, expected) - - # From RFC 6070 - check('password', 'salt', 1, None, - '0c60c80f961f0e71f3a9b524af6012062fe037a6') - check('password', 'salt', 1, 20, - '0c60c80f961f0e71f3a9b524af6012062fe037a6') - check('password', 'salt', 2, 20, - 'ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957') - check('password', 'salt', 4096, 20, - '4b007901b765489abead49d926f721d065a429c1') - check('passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', - 4096, 25, '3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038') - check('pass\x00word', 'sa\x00lt', 4096, 16, - '56fa6aa75548099dcc37d7f03425e0c3') - # This one is from the RFC but it just takes for ages - ##check('password', 'salt', 16777216, 20, - ## 'eefe3d61cd4da4e4e9945b3d6ba2158c2634e984') - - # From Crypt-PBKDF2 - check('password', 'ATHENA.MIT.EDUraeburn', 1, 16, - 'cdedb5281bb2f801565a1122b2563515') - check('password', 'ATHENA.MIT.EDUraeburn', 1, 32, - 'cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837') - check('password', 'ATHENA.MIT.EDUraeburn', 2, 16, - '01dbee7f4a9e243e988b62c73cda935d') - check('password', 'ATHENA.MIT.EDUraeburn', 2, 32, - '01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86') - check('password', 'ATHENA.MIT.EDUraeburn', 1200, 32, - '5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13') - check('X' * 64, 'pass phrase equals block size', 1200, 32, - '139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1') - check('X' * 65, 'pass phrase exceeds block size', 1200, 32, - '9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(SecurityTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/serving.py b/vendor/werkzeug/testsuite/serving.py deleted file mode 100644 index ca39af98..00000000 --- a/vendor/werkzeug/testsuite/serving.py +++ /dev/null @@ -1,117 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.serving - ~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Added serving tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import sys -import time -try: - import httplib -except ImportError: - from http import client as httplib -try: - from urllib2 import urlopen, HTTPError -except ImportError: # pragma: no cover - from urllib.request import urlopen - from urllib.error import HTTPError - -import unittest -from functools import update_wrapper - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import __version__ as version, serving -from werkzeug.testapp import test_app -from werkzeug._compat import StringIO -from threading import Thread - - - -real_make_server = serving.make_server - - -def silencestderr(f): - def new_func(*args, **kwargs): - old_stderr = sys.stderr - sys.stderr = StringIO() - try: - return f(*args, **kwargs) - finally: - sys.stderr = old_stderr - return update_wrapper(new_func, f) - - -def run_dev_server(application): - servers = [] - - def tracking_make_server(*args, **kwargs): - srv = real_make_server(*args, **kwargs) - servers.append(srv) - return srv - serving.make_server = tracking_make_server - try: - t = Thread(target=serving.run_simple, - args=('localhost', 0, application)) - t.setDaemon(True) - t.start() - time.sleep(0.25) - finally: - serving.make_server = real_make_server - if not servers: - return None, None - server, = servers - ip, port = server.socket.getsockname()[:2] - if ':' in ip: - ip = '[%s]' % ip - return server, '%s:%d' % (ip, port) - - -class ServingTestCase(WerkzeugTestCase): - - @silencestderr - def test_serving(self): - server, addr = run_dev_server(test_app) - rv = urlopen('http://%s/?foo=bar&baz=blah' % addr).read() - self.assert_in(b'WSGI Information', rv) - self.assert_in(b'foo=bar&baz=blah', rv) - self.assert_in(b'Werkzeug/' + version.encode('ascii'), rv) - - @silencestderr - def test_broken_app(self): - def broken_app(environ, start_response): - 1 // 0 - server, addr = run_dev_server(broken_app) - try: - urlopen('http://%s/?foo=bar&baz=blah' % addr).read() - except HTTPError as e: - # In Python3 a 500 response causes an exception - rv = e.read() - assert b'Internal Server Error' in rv - else: - assert False, 'expected internal server error' - - @silencestderr - def test_absolute_requests(self): - def asserting_app(environ, start_response): - assert environ['HTTP_HOST'] == 'surelynotexisting.example.com:1337' - assert environ['PATH_INFO'] == '/index.htm' - assert environ['SERVER_PORT'] == addr.split(':')[1] - start_response('200 OK', [('Content-Type', 'text/html')]) - return [b'YES'] - - server, addr = run_dev_server(asserting_app) - conn = httplib.HTTPConnection(addr) - conn.request('GET', 'http://surelynotexisting.example.com:1337/index.htm') - res = conn.getresponse() - assert res.read() == b'YES' - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(ServingTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/test.py b/vendor/werkzeug/testsuite/test.py deleted file mode 100644 index 693fc828..00000000 --- a/vendor/werkzeug/testsuite/test.py +++ /dev/null @@ -1,401 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.test - ~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the testing tools. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import sys -import unittest -from io import BytesIO -from werkzeug._compat import iteritems, to_bytes - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.wrappers import Request, Response, BaseResponse -from werkzeug.test import Client, EnvironBuilder, create_environ, \ - ClientRedirectError, stream_encode_multipart, run_wsgi_app -from werkzeug.utils import redirect -from werkzeug.formparser import parse_form_data -from werkzeug.datastructures import MultiDict - - -def cookie_app(environ, start_response): - """A WSGI application which sets a cookie, and returns as a ersponse any - cookie which exists. - """ - response = Response(environ.get('HTTP_COOKIE', 'No Cookie'), - mimetype='text/plain') - response.set_cookie('test', 'test') - return response(environ, start_response) - - -def redirect_loop_app(environ, start_response): - response = redirect('http://localhost/some/redirect/') - return response(environ, start_response) - - -def redirect_with_get_app(environ, start_response): - req = Request(environ) - if req.url not in ('http://localhost/', - 'http://localhost/first/request', - 'http://localhost/some/redirect/'): - assert False, 'redirect_demo_app() did not expect URL "%s"' % req.url - if '/some/redirect' not in req.url: - response = redirect('http://localhost/some/redirect/') - else: - response = Response('current url: %s' % req.url) - return response(environ, start_response) - - -def redirect_with_post_app(environ, start_response): - req = Request(environ) - if req.url == 'http://localhost/some/redirect/': - assert req.method == 'GET', 'request should be GET' - assert not req.form, 'request should not have data' - response = Response('current url: %s' % req.url) - else: - response = redirect('http://localhost/some/redirect/') - return response(environ, start_response) - - -def external_redirect_demo_app(environ, start_response): - response = redirect('http://example.com/') - return response(environ, start_response) - - -def external_subdomain_redirect_demo_app(environ, start_response): - if 'test.example.com' in environ['HTTP_HOST']: - response = Response('redirected successfully to subdomain') - else: - response = redirect('http://test.example.com/login') - return response(environ, start_response) - - -def multi_value_post_app(environ, start_response): - req = Request(environ) - assert req.form['field'] == 'val1', req.form['field'] - assert req.form.getlist('field') == ['val1', 'val2'], req.form.getlist('field') - response = Response('ok') - return response(environ, start_response) - - -class TestTestCase(WerkzeugTestCase): - - def test_cookie_forging(self): - c = Client(cookie_app) - c.set_cookie('localhost', 'foo', 'bar') - appiter, code, headers = c.open() - self.assert_strict_equal(list(appiter), [b'foo=bar']) - - def test_set_cookie_app(self): - c = Client(cookie_app) - appiter, code, headers = c.open() - self.assert_in('Set-Cookie', dict(headers)) - - def test_cookiejar_stores_cookie(self): - c = Client(cookie_app) - appiter, code, headers = c.open() - self.assert_in('test', c.cookie_jar._cookies['localhost.local']['/']) - - def test_no_initial_cookie(self): - c = Client(cookie_app) - appiter, code, headers = c.open() - self.assert_strict_equal(b''.join(appiter), b'No Cookie') - - def test_resent_cookie(self): - c = Client(cookie_app) - c.open() - appiter, code, headers = c.open() - self.assert_strict_equal(b''.join(appiter), b'test=test') - - def test_disable_cookies(self): - c = Client(cookie_app, use_cookies=False) - c.open() - appiter, code, headers = c.open() - self.assert_strict_equal(b''.join(appiter), b'No Cookie') - - def test_cookie_for_different_path(self): - c = Client(cookie_app) - c.open('/path1') - appiter, code, headers = c.open('/path2') - self.assert_strict_equal(b''.join(appiter), b'test=test') - - def test_environ_builder_basics(self): - b = EnvironBuilder() - self.assert_is_none(b.content_type) - b.method = 'POST' - self.assert_equal(b.content_type, 'application/x-www-form-urlencoded') - b.files.add_file('test', BytesIO(b'test contents'), 'test.txt') - self.assert_equal(b.files['test'].content_type, 'text/plain') - self.assert_equal(b.content_type, 'multipart/form-data') - b.form['test'] = 'normal value' - - req = b.get_request() - b.close() - - self.assert_strict_equal(req.url, u'http://localhost/') - self.assert_strict_equal(req.method, 'POST') - self.assert_strict_equal(req.form['test'], u'normal value') - self.assert_equal(req.files['test'].content_type, 'text/plain') - self.assert_strict_equal(req.files['test'].filename, u'test.txt') - self.assert_strict_equal(req.files['test'].read(), b'test contents') - - def test_environ_builder_headers(self): - b = EnvironBuilder(environ_base={'HTTP_USER_AGENT': 'Foo/0.1'}, - environ_overrides={'wsgi.version': (1, 1)}) - b.headers['X-Suck-My-Dick'] = 'very well sir' - env = b.get_environ() - self.assert_strict_equal(env['HTTP_USER_AGENT'], 'Foo/0.1') - self.assert_strict_equal(env['HTTP_X_SUCK_MY_DICK'], 'very well sir') - self.assert_strict_equal(env['wsgi.version'], (1, 1)) - - b.headers['User-Agent'] = 'Bar/1.0' - env = b.get_environ() - self.assert_strict_equal(env['HTTP_USER_AGENT'], 'Bar/1.0') - - def test_environ_builder_paths(self): - b = EnvironBuilder(path='/foo', base_url='http://example.com/') - self.assert_strict_equal(b.base_url, 'http://example.com/') - self.assert_strict_equal(b.path, '/foo') - self.assert_strict_equal(b.script_root, '') - self.assert_strict_equal(b.host, 'example.com') - - b = EnvironBuilder(path='/foo', base_url='http://example.com/bar') - self.assert_strict_equal(b.base_url, 'http://example.com/bar/') - self.assert_strict_equal(b.path, '/foo') - self.assert_strict_equal(b.script_root, '/bar') - self.assert_strict_equal(b.host, 'example.com') - - b.host = 'localhost' - self.assert_strict_equal(b.base_url, 'http://localhost/bar/') - b.base_url = 'http://localhost:8080/' - self.assert_strict_equal(b.host, 'localhost:8080') - self.assert_strict_equal(b.server_name, 'localhost') - self.assert_strict_equal(b.server_port, 8080) - - b.host = 'foo.invalid' - b.url_scheme = 'https' - b.script_root = '/test' - env = b.get_environ() - self.assert_strict_equal(env['SERVER_NAME'], 'foo.invalid') - self.assert_strict_equal(env['SERVER_PORT'], '443') - self.assert_strict_equal(env['SCRIPT_NAME'], '/test') - self.assert_strict_equal(env['PATH_INFO'], '/foo') - self.assert_strict_equal(env['HTTP_HOST'], 'foo.invalid') - self.assert_strict_equal(env['wsgi.url_scheme'], 'https') - self.assert_strict_equal(b.base_url, 'https://foo.invalid/test/') - - def test_environ_builder_content_type(self): - builder = EnvironBuilder() - self.assert_is_none(builder.content_type) - builder.method = 'POST' - self.assert_equal(builder.content_type, 'application/x-www-form-urlencoded') - builder.form['foo'] = 'bar' - self.assert_equal(builder.content_type, 'application/x-www-form-urlencoded') - builder.files.add_file('blafasel', BytesIO(b'foo'), 'test.txt') - self.assert_equal(builder.content_type, 'multipart/form-data') - req = builder.get_request() - self.assert_strict_equal(req.form['foo'], u'bar') - self.assert_strict_equal(req.files['blafasel'].read(), b'foo') - - def test_environ_builder_stream_switch(self): - d = MultiDict(dict(foo=u'bar', blub=u'blah', hu=u'hum')) - for use_tempfile in False, True: - stream, length, boundary = stream_encode_multipart( - d, use_tempfile, threshold=150) - self.assert_true(isinstance(stream, BytesIO) != use_tempfile) - - form = parse_form_data({'wsgi.input': stream, 'CONTENT_LENGTH': str(length), - 'CONTENT_TYPE': 'multipart/form-data; boundary="%s"' % - boundary})[1] - self.assert_strict_equal(form, d) - stream.close() - - def test_create_environ(self): - env = create_environ('/foo?bar=baz', 'http://example.org/') - expected = { - 'wsgi.multiprocess': False, - 'wsgi.version': (1, 0), - 'wsgi.run_once': False, - 'wsgi.errors': sys.stderr, - 'wsgi.multithread': False, - 'wsgi.url_scheme': 'http', - 'SCRIPT_NAME': '', - 'CONTENT_TYPE': '', - 'CONTENT_LENGTH': '0', - 'SERVER_NAME': 'example.org', - 'REQUEST_METHOD': 'GET', - 'HTTP_HOST': 'example.org', - 'PATH_INFO': '/foo', - 'SERVER_PORT': '80', - 'SERVER_PROTOCOL': 'HTTP/1.1', - 'QUERY_STRING': 'bar=baz' - } - for key, value in iteritems(expected): - self.assert_equal(env[key], value) - self.assert_strict_equal(env['wsgi.input'].read(0), b'') - self.assert_strict_equal(create_environ('/foo', 'http://example.com/')['SCRIPT_NAME'], '') - - def test_file_closing(self): - closed = [] - class SpecialInput(object): - def read(self): - return '' - def close(self): - closed.append(self) - - env = create_environ(data={'foo': SpecialInput()}) - self.assert_strict_equal(len(closed), 1) - builder = EnvironBuilder() - builder.files.add_file('blah', SpecialInput()) - builder.close() - self.assert_strict_equal(len(closed), 2) - - def test_follow_redirect(self): - env = create_environ('/', base_url='http://localhost') - c = Client(redirect_with_get_app) - appiter, code, headers = c.open(environ_overrides=env, follow_redirects=True) - self.assert_strict_equal(code, '200 OK') - self.assert_strict_equal(b''.join(appiter), b'current url: http://localhost/some/redirect/') - - # Test that the :cls:`Client` is aware of user defined response wrappers - c = Client(redirect_with_get_app, response_wrapper=BaseResponse) - resp = c.get('/', follow_redirects=True) - self.assert_strict_equal(resp.status_code, 200) - self.assert_strict_equal(resp.data, b'current url: http://localhost/some/redirect/') - - # test with URL other than '/' to make sure redirected URL's are correct - c = Client(redirect_with_get_app, response_wrapper=BaseResponse) - resp = c.get('/first/request', follow_redirects=True) - self.assert_strict_equal(resp.status_code, 200) - self.assert_strict_equal(resp.data, b'current url: http://localhost/some/redirect/') - - def test_follow_external_redirect(self): - env = create_environ('/', base_url='http://localhost') - c = Client(external_redirect_demo_app) - self.assert_raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - def test_follow_external_redirect_on_same_subdomain(self): - env = create_environ('/', base_url='http://example.com') - c = Client(external_subdomain_redirect_demo_app, allow_subdomain_redirects=True) - c.get(environ_overrides=env, follow_redirects=True) - - # check that this does not work for real external domains - env = create_environ('/', base_url='http://localhost') - self.assert_raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - # check that subdomain redirects fail if no `allow_subdomain_redirects` is applied - c = Client(external_subdomain_redirect_demo_app) - self.assert_raises(RuntimeError, lambda: - c.get(environ_overrides=env, follow_redirects=True)) - - def test_follow_redirect_loop(self): - c = Client(redirect_loop_app, response_wrapper=BaseResponse) - with self.assert_raises(ClientRedirectError): - resp = c.get('/', follow_redirects=True) - - def test_follow_redirect_with_post(self): - c = Client(redirect_with_post_app, response_wrapper=BaseResponse) - resp = c.post('/', follow_redirects=True, data='foo=blub+hehe&blah=42') - self.assert_strict_equal(resp.status_code, 200) - self.assert_strict_equal(resp.data, b'current url: http://localhost/some/redirect/') - - def test_path_info_script_name_unquoting(self): - def test_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [environ['PATH_INFO'] + '\n' + environ['SCRIPT_NAME']] - c = Client(test_app, response_wrapper=BaseResponse) - resp = c.get('/foo%40bar') - self.assert_strict_equal(resp.data, b'/foo@bar\n') - c = Client(test_app, response_wrapper=BaseResponse) - resp = c.get('/foo%40bar', 'http://localhost/bar%40baz') - self.assert_strict_equal(resp.data, b'/foo@bar\n/bar@baz') - - def test_multi_value_submit(self): - c = Client(multi_value_post_app, response_wrapper=BaseResponse) - data = { - 'field': ['val1','val2'] - } - resp = c.post('/', data=data) - self.assert_strict_equal(resp.status_code, 200) - c = Client(multi_value_post_app, response_wrapper=BaseResponse) - data = MultiDict({ - 'field': ['val1', 'val2'] - }) - resp = c.post('/', data=data) - self.assert_strict_equal(resp.status_code, 200) - - def test_iri_support(self): - b = EnvironBuilder(u'/föö-bar', base_url=u'http://☃.net/') - self.assert_strict_equal(b.path, '/f%C3%B6%C3%B6-bar') - self.assert_strict_equal(b.base_url, 'http://xn--n3h.net/') - - def test_run_wsgi_apps(self): - def simple_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return ['Hello World!'] - app_iter, status, headers = run_wsgi_app(simple_app, {}) - self.assert_strict_equal(status, '200 OK') - self.assert_strict_equal(list(headers), [('Content-Type', 'text/html')]) - self.assert_strict_equal(app_iter, ['Hello World!']) - - def yielding_app(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - yield 'Hello ' - yield 'World!' - app_iter, status, headers = run_wsgi_app(yielding_app, {}) - self.assert_strict_equal(status, '200 OK') - self.assert_strict_equal(list(headers), [('Content-Type', 'text/html')]) - self.assert_strict_equal(list(app_iter), ['Hello ', 'World!']) - - def test_multiple_cookies(self): - @Request.application - def test_app(request): - response = Response(repr(sorted(request.cookies.items()))) - response.set_cookie(u'test1', b'foo') - response.set_cookie(u'test2', b'bar') - return response - client = Client(test_app, Response) - resp = client.get('/') - self.assert_strict_equal(resp.data, b'[]') - resp = client.get('/') - self.assert_strict_equal(resp.data, - to_bytes(repr([('test1', u'foo'), ('test2', u'bar')]), 'ascii')) - - def test_correct_open_invocation_on_redirect(self): - class MyClient(Client): - counter = 0 - def open(self, *args, **kwargs): - self.counter += 1 - env = kwargs.setdefault('environ_overrides', {}) - env['werkzeug._foo'] = self.counter - return Client.open(self, *args, **kwargs) - - @Request.application - def test_app(request): - return Response(str(request.environ['werkzeug._foo'])) - - c = MyClient(test_app, response_wrapper=Response) - self.assert_strict_equal(c.get('/').data, b'1') - self.assert_strict_equal(c.get('/').data, b'2') - self.assert_strict_equal(c.get('/').data, b'3') - - def test_correct_encoding(self): - req = Request.from_values(u'/\N{SNOWMAN}', u'http://example.com/foo') - self.assert_strict_equal(req.script_root, u'/foo') - self.assert_strict_equal(req.path, u'/\N{SNOWMAN}') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/urls.py b/vendor/werkzeug/testsuite/urls.py deleted file mode 100644 index 07f17ae5..00000000 --- a/vendor/werkzeug/testsuite/urls.py +++ /dev/null @@ -1,300 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.urls - ~~~~~~~~~~~~~~~~~~~~~~~ - - URL helper tests. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug.datastructures import OrderedMultiDict -from werkzeug import urls -from werkzeug._compat import text_type, NativeStringIO, BytesIO - - -class URLsTestCase(WerkzeugTestCase): - - def test_replace(self): - url = urls.url_parse('http://de.wikipedia.org/wiki/Troll') - self.assert_strict_equal(url.replace(query='foo=bar'), - urls.url_parse('http://de.wikipedia.org/wiki/Troll?foo=bar')) - self.assert_strict_equal(url.replace(scheme='https'), - urls.url_parse('https://de.wikipedia.org/wiki/Troll')) - - def test_quoting(self): - self.assert_strict_equal(urls.url_quote(u'\xf6\xe4\xfc'), '%C3%B6%C3%A4%C3%BC') - self.assert_strict_equal(urls.url_unquote(urls.url_quote(u'#%="\xf6')), u'#%="\xf6') - self.assert_strict_equal(urls.url_quote_plus('foo bar'), 'foo+bar') - self.assert_strict_equal(urls.url_unquote_plus('foo+bar'), u'foo bar') - self.assert_strict_equal(urls.url_encode({b'a': None, b'b': b'foo bar'}), 'b=foo+bar') - self.assert_strict_equal(urls.url_encode({u'a': None, u'b': u'foo bar'}), 'b=foo+bar') - self.assert_strict_equal(urls.url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffsklärung)'), - 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)') - self.assert_strict_equal(urls.url_quote_plus(42), '42') - self.assert_strict_equal(urls.url_quote(b'\xff'), '%FF') - - def test_bytes_unquoting(self): - self.assert_strict_equal(urls.url_unquote(urls.url_quote( - u'#%="\xf6', charset='latin1'), charset=None), b'#%="\xf6') - - def test_url_decoding(self): - x = urls.url_decode(b'foo=42&bar=23&uni=H%C3%A4nsel') - self.assert_strict_equal(x['foo'], u'42') - self.assert_strict_equal(x['bar'], u'23') - self.assert_strict_equal(x['uni'], u'Hänsel') - - x = urls.url_decode(b'foo=42;bar=23;uni=H%C3%A4nsel', separator=b';') - self.assert_strict_equal(x['foo'], u'42') - self.assert_strict_equal(x['bar'], u'23') - self.assert_strict_equal(x['uni'], u'Hänsel') - - x = urls.url_decode(b'%C3%9Ch=H%C3%A4nsel', decode_keys=True) - self.assert_strict_equal(x[u'Üh'], u'Hänsel') - - def test_url_bytes_decoding(self): - x = urls.url_decode(b'foo=42&bar=23&uni=H%C3%A4nsel', charset=None) - self.assert_strict_equal(x[b'foo'], b'42') - self.assert_strict_equal(x[b'bar'], b'23') - self.assert_strict_equal(x[b'uni'], u'Hänsel'.encode('utf-8')) - - def test_streamed_url_decoding(self): - item1 = u'a' * 100000 - item2 = u'b' * 400 - string = ('a=%s&b=%s&c=%s' % (item1, item2, item2)).encode('ascii') - gen = urls.url_decode_stream(BytesIO(string), limit=len(string), - return_iterator=True) - self.assert_strict_equal(next(gen), ('a', item1)) - self.assert_strict_equal(next(gen), ('b', item2)) - self.assert_strict_equal(next(gen), ('c', item2)) - self.assert_raises(StopIteration, lambda: next(gen)) - - def test_stream_decoding_string_fails(self): - self.assert_raises(TypeError, urls.url_decode_stream, 'testing') - - def test_url_encoding(self): - self.assert_strict_equal(urls.url_encode({'foo': 'bar 45'}), 'foo=bar+45') - d = {'foo': 1, 'bar': 23, 'blah': u'Hänsel'} - self.assert_strict_equal(urls.url_encode(d, sort=True), 'bar=23&blah=H%C3%A4nsel&foo=1') - self.assert_strict_equal(urls.url_encode(d, sort=True, separator=u';'), 'bar=23;blah=H%C3%A4nsel;foo=1') - - def test_sorted_url_encode(self): - self.assert_strict_equal(urls.url_encode({u"a": 42, u"b": 23, 1: 1, 2: 2}, - sort=True, key=lambda i: text_type(i[0])), '1=1&2=2&a=42&b=23') - self.assert_strict_equal(urls.url_encode({u'A': 1, u'a': 2, u'B': 3, 'b': 4}, sort=True, - key=lambda x: x[0].lower() + x[0]), 'A=1&a=2&B=3&b=4') - - def test_streamed_url_encoding(self): - out = NativeStringIO() - urls.url_encode_stream({'foo': 'bar 45'}, out) - self.assert_strict_equal(out.getvalue(), 'foo=bar+45') - - d = {'foo': 1, 'bar': 23, 'blah': u'Hänsel'} - out = NativeStringIO() - urls.url_encode_stream(d, out, sort=True) - self.assert_strict_equal(out.getvalue(), 'bar=23&blah=H%C3%A4nsel&foo=1') - out = NativeStringIO() - urls.url_encode_stream(d, out, sort=True, separator=u';') - self.assert_strict_equal(out.getvalue(), 'bar=23;blah=H%C3%A4nsel;foo=1') - - gen = urls.url_encode_stream(d, sort=True) - self.assert_strict_equal(next(gen), 'bar=23') - self.assert_strict_equal(next(gen), 'blah=H%C3%A4nsel') - self.assert_strict_equal(next(gen), 'foo=1') - self.assert_raises(StopIteration, lambda: next(gen)) - - def test_url_fixing(self): - x = urls.url_fix(u'http://de.wikipedia.org/wiki/Elf (Begriffskl\xe4rung)') - self.assert_line_equal(x, 'http://de.wikipedia.org/wiki/Elf%20(Begriffskl%C3%A4rung)') - - x = urls.url_fix("http://just.a.test/$-_.+!*'(),") - self.assert_equal(x, "http://just.a.test/$-_.+!*'(),") - - def test_url_fixing_qs(self): - x = urls.url_fix(b'http://example.com/?foo=%2f%2f') - self.assert_line_equal(x, 'http://example.com/?foo=%2f%2f') - - x = urls.url_fix('http://acronyms.thefreedictionary.com/Algebraic+Methods+of+Solving+the+Schr%C3%B6dinger+Equation') - self.assert_equal(x, 'http://acronyms.thefreedictionary.com/Algebraic+Methods+of+Solving+the+Schr%C3%B6dinger+Equation') - - def test_iri_support(self): - self.assert_strict_equal(urls.uri_to_iri('http://xn--n3h.net/'), - u'http://\u2603.net/') - self.assert_strict_equal( - urls.uri_to_iri(b'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th'), - u'http://\xfcser:p\xe4ssword@\u2603.net/p\xe5th') - self.assert_strict_equal(urls.iri_to_uri(u'http://☃.net/'), 'http://xn--n3h.net/') - self.assert_strict_equal( - urls.iri_to_uri(u'http://üser:pässword@☃.net/påth'), - 'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th') - - self.assert_strict_equal(urls.uri_to_iri('http://test.com/%3Fmeh?foo=%26%2F'), - u'http://test.com/%3Fmeh?foo=%26%2F') - - # this should work as well, might break on 2.4 because of a broken - # idna codec - self.assert_strict_equal(urls.uri_to_iri(b'/foo'), u'/foo') - self.assert_strict_equal(urls.iri_to_uri(u'/foo'), '/foo') - - self.assert_strict_equal(urls.iri_to_uri(u'http://föö.com:8080/bam/baz'), - 'http://xn--f-1gaa.com:8080/bam/baz') - - def test_ordered_multidict_encoding(self): - d = OrderedMultiDict() - d.add('foo', 1) - d.add('foo', 2) - d.add('foo', 3) - d.add('bar', 0) - d.add('foo', 4) - self.assert_equal(urls.url_encode(d), 'foo=1&foo=2&foo=3&bar=0&foo=4') - - def test_href(self): - x = urls.Href('http://www.example.com/') - self.assert_strict_equal(x(u'foo'), 'http://www.example.com/foo') - self.assert_strict_equal(x.foo(u'bar'), 'http://www.example.com/foo/bar') - self.assert_strict_equal(x.foo(u'bar', x=42), 'http://www.example.com/foo/bar?x=42') - self.assert_strict_equal(x.foo(u'bar', class_=42), 'http://www.example.com/foo/bar?class=42') - self.assert_strict_equal(x.foo(u'bar', {u'class': 42}), 'http://www.example.com/foo/bar?class=42') - self.assert_raises(AttributeError, lambda: x.__blah__) - - x = urls.Href('blah') - self.assert_strict_equal(x.foo(u'bar'), 'blah/foo/bar') - - self.assert_raises(TypeError, x.foo, {u"foo": 23}, x=42) - - x = urls.Href('') - self.assert_strict_equal(x('foo'), 'foo') - - def test_href_url_join(self): - x = urls.Href(u'test') - self.assert_line_equal(x(u'foo:bar'), u'test/foo:bar') - self.assert_line_equal(x(u'http://example.com/'), u'test/http://example.com/') - self.assert_line_equal(x.a(), u'test/a') - - def test_href_past_root(self): - base_href = urls.Href('http://www.blagga.com/1/2/3') - self.assert_strict_equal(base_href('../foo'), 'http://www.blagga.com/1/2/foo') - self.assert_strict_equal(base_href('../../foo'), 'http://www.blagga.com/1/foo') - self.assert_strict_equal(base_href('../../../foo'), 'http://www.blagga.com/foo') - self.assert_strict_equal(base_href('../../../../foo'), 'http://www.blagga.com/foo') - self.assert_strict_equal(base_href('../../../../../foo'), 'http://www.blagga.com/foo') - self.assert_strict_equal(base_href('../../../../../../foo'), 'http://www.blagga.com/foo') - - def test_url_unquote_plus_unicode(self): - # was broken in 0.6 - self.assert_strict_equal(urls.url_unquote_plus(u'\x6d'), u'\x6d') - self.assert_is(type(urls.url_unquote_plus(u'\x6d')), text_type) - - def test_quoting_of_local_urls(self): - rv = urls.iri_to_uri(u'/foo\x8f') - self.assert_strict_equal(rv, '/foo%C2%8F') - self.assert_is(type(rv), str) - - def test_url_attributes(self): - rv = urls.url_parse('http://foo%3a:bar%3a@[::1]:80/123?x=y#frag') - self.assert_strict_equal(rv.scheme, 'http') - self.assert_strict_equal(rv.auth, 'foo%3a:bar%3a') - self.assert_strict_equal(rv.username, u'foo:') - self.assert_strict_equal(rv.password, u'bar:') - self.assert_strict_equal(rv.raw_username, 'foo%3a') - self.assert_strict_equal(rv.raw_password, 'bar%3a') - self.assert_strict_equal(rv.host, '::1') - self.assert_equal(rv.port, 80) - self.assert_strict_equal(rv.path, '/123') - self.assert_strict_equal(rv.query, 'x=y') - self.assert_strict_equal(rv.fragment, 'frag') - - rv = urls.url_parse(u'http://\N{SNOWMAN}.com/') - self.assert_strict_equal(rv.host, u'\N{SNOWMAN}.com') - self.assert_strict_equal(rv.ascii_host, 'xn--n3h.com') - - def test_url_attributes_bytes(self): - rv = urls.url_parse(b'http://foo%3a:bar%3a@[::1]:80/123?x=y#frag') - self.assert_strict_equal(rv.scheme, b'http') - self.assert_strict_equal(rv.auth, b'foo%3a:bar%3a') - self.assert_strict_equal(rv.username, u'foo:') - self.assert_strict_equal(rv.password, u'bar:') - self.assert_strict_equal(rv.raw_username, b'foo%3a') - self.assert_strict_equal(rv.raw_password, b'bar%3a') - self.assert_strict_equal(rv.host, b'::1') - self.assert_equal(rv.port, 80) - self.assert_strict_equal(rv.path, b'/123') - self.assert_strict_equal(rv.query, b'x=y') - self.assert_strict_equal(rv.fragment, b'frag') - - def test_url_joining(self): - self.assert_strict_equal(urls.url_join('/foo', '/bar'), '/bar') - self.assert_strict_equal(urls.url_join('http://example.com/foo', '/bar'), - 'http://example.com/bar') - self.assert_strict_equal(urls.url_join('file:///tmp/', 'test.html'), - 'file:///tmp/test.html') - self.assert_strict_equal(urls.url_join('file:///tmp/x', 'test.html'), - 'file:///tmp/test.html') - self.assert_strict_equal(urls.url_join('file:///tmp/x', '../../../x.html'), - 'file:///x.html') - - def test_partial_unencoded_decode(self): - ref = u'foo=정상처리'.encode('euc-kr') - x = urls.url_decode(ref, charset='euc-kr') - self.assert_strict_equal(x['foo'], u'정상처리') - - def test_iri_to_uri_idempotence_ascii_only(self): - uri = u'http://www.idempoten.ce' - uri = urls.iri_to_uri(uri) - self.assert_equal(urls.iri_to_uri(uri), uri) - - def test_iri_to_uri_idempotence_non_ascii(self): - uri = u'http://\N{SNOWMAN}/\N{SNOWMAN}' - uri = urls.iri_to_uri(uri) - self.assert_equal(urls.iri_to_uri(uri), uri) - - def test_uri_to_iri_idempotence_ascii_only(self): - uri = 'http://www.idempoten.ce' - uri = urls.uri_to_iri(uri) - self.assert_equal(urls.uri_to_iri(uri), uri) - - def test_uri_to_iri_idempotence_non_ascii(self): - uri = 'http://xn--n3h/%E2%98%83' - uri = urls.uri_to_iri(uri) - self.assert_equal(urls.uri_to_iri(uri), uri) - - def test_iri_to_uri_to_iri(self): - iri = u'http://föö.com/' - uri = urls.iri_to_uri(iri) - self.assert_equal(urls.uri_to_iri(uri), iri) - - def test_uri_to_iri_to_uri(self): - uri = 'http://xn--f-rgao.com/%C3%9E' - iri = urls.uri_to_iri(uri) - self.assert_equal(urls.iri_to_uri(iri), uri) - - def test_uri_iri_normalization(self): - uri = 'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93' - iri = u'http://föñ.com/\N{BALLOT BOX}/fred?utf8=\u2713' - - tests = [ - u'http://föñ.com/\N{BALLOT BOX}/fred?utf8=\u2713', - u'http://xn--f-rgao.com/\u2610/fred?utf8=\N{CHECK MARK}', - b'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93', - u'http://xn--f-rgao.com/%E2%98%90/fred?utf8=%E2%9C%93', - u'http://föñ.com/\u2610/fred?utf8=%E2%9C%93', - b'http://xn--f-rgao.com/\xe2\x98\x90/fred?utf8=\xe2\x9c\x93', - ] - - for test in tests: - self.assert_equal(urls.uri_to_iri(test), iri) - self.assert_equal(urls.iri_to_uri(test), uri) - self.assert_equal(urls.uri_to_iri(urls.iri_to_uri(test)), iri) - self.assert_equal(urls.iri_to_uri(urls.uri_to_iri(test)), uri) - self.assert_equal(urls.uri_to_iri(urls.uri_to_iri(test)), iri) - self.assert_equal(urls.iri_to_uri(urls.iri_to_uri(test)), uri) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(URLsTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/utils.py b/vendor/werkzeug/testsuite/utils.py deleted file mode 100644 index a766d92a..00000000 --- a/vendor/werkzeug/testsuite/utils.py +++ /dev/null @@ -1,284 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.utils - ~~~~~~~~~~~~~~~~~~~~~~~~ - - General utilities. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" - -from __future__ import with_statement - -import unittest -from datetime import datetime -from functools import partial - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import utils -from werkzeug.datastructures import Headers -from werkzeug.http import parse_date, http_date -from werkzeug.wrappers import BaseResponse -from werkzeug.test import Client, run_wsgi_app -from werkzeug._compat import text_type, implements_iterator - - -class GeneralUtilityTestCase(WerkzeugTestCase): - - def test_redirect(self): - resp = utils.redirect(u'/füübär') - self.assert_in(b'/f%C3%BC%C3%BCb%C3%A4r', resp.get_data()) - self.assert_equal(resp.headers['Location'], '/f%C3%BC%C3%BCb%C3%A4r') - self.assert_equal(resp.status_code, 302) - - resp = utils.redirect(u'http://☃.net/', 307) - self.assert_in(b'http://xn--n3h.net/', resp.get_data()) - self.assert_equal(resp.headers['Location'], 'http://xn--n3h.net/') - self.assert_equal(resp.status_code, 307) - - resp = utils.redirect('http://example.com/', 305) - self.assert_equal(resp.headers['Location'], 'http://example.com/') - self.assert_equal(resp.status_code, 305) - - def test_redirect_no_unicode_header_keys(self): - # Make sure all headers are native keys. This was a bug at one point - # due to an incorrect conversion. - resp = utils.redirect('http://example.com/', 305) - for key, value in resp.headers.items(): - self.assert_equal(type(key), str) - self.assert_equal(type(value), text_type) - self.assert_equal(resp.headers['Location'], 'http://example.com/') - self.assert_equal(resp.status_code, 305) - - def test_redirect_xss(self): - location = 'http://example.com/?xss=">' - resp = utils.redirect(location) - self.assert_not_in(b'', resp.get_data()) - - location = 'http://example.com/?xss="onmouseover="alert(1)' - resp = utils.redirect(location) - self.assert_not_in(b'href="http://example.com/?xss="onmouseover="alert(1)"', resp.get_data()) - - def test_cached_property(self): - foo = [] - class A(object): - def prop(self): - foo.append(42) - return 42 - prop = utils.cached_property(prop) - - a = A() - p = a.prop - q = a.prop - self.assert_true(p == q == 42) - self.assert_equal(foo, [42]) - - foo = [] - class A(object): - def _prop(self): - foo.append(42) - return 42 - prop = utils.cached_property(_prop, name='prop') - del _prop - - a = A() - p = a.prop - q = a.prop - self.assert_true(p == q == 42) - self.assert_equal(foo, [42]) - - def test_environ_property(self): - class A(object): - environ = {'string': 'abc', 'number': '42'} - - string = utils.environ_property('string') - missing = utils.environ_property('missing', 'spam') - read_only = utils.environ_property('number') - number = utils.environ_property('number', load_func=int) - broken_number = utils.environ_property('broken_number', load_func=int) - date = utils.environ_property('date', None, parse_date, http_date, - read_only=False) - foo = utils.environ_property('foo') - - a = A() - self.assert_equal(a.string, 'abc') - self.assert_equal(a.missing, 'spam') - def test_assign(): - a.read_only = 'something' - self.assert_raises(AttributeError, test_assign) - self.assert_equal(a.number, 42) - self.assert_equal(a.broken_number, None) - self.assert_is_none(a.date) - a.date = datetime(2008, 1, 22, 10, 0, 0, 0) - self.assert_equal(a.environ['date'], 'Tue, 22 Jan 2008 10:00:00 GMT') - - def test_escape(self): - class Foo(str): - def __html__(self): - return text_type(self) - self.assert_equal(utils.escape(None), '') - self.assert_equal(utils.escape(42), '42') - self.assert_equal(utils.escape('<>'), '<>') - self.assert_equal(utils.escape('"foo"'), '"foo"') - self.assert_equal(utils.escape(Foo('')), '') - - def test_unescape(self): - self.assert_equal(utils.unescape('<ä>'), u'<ä>') - - def test_run_wsgi_app(self): - def foo(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - yield '1' - yield '2' - yield '3' - - app_iter, status, headers = run_wsgi_app(foo, {}) - self.assert_equal(status, '200 OK') - self.assert_equal(list(headers), [('Content-Type', 'text/plain')]) - self.assert_equal(next(app_iter), '1') - self.assert_equal(next(app_iter), '2') - self.assert_equal(next(app_iter), '3') - self.assert_raises(StopIteration, partial(next, app_iter)) - - got_close = [] - @implements_iterator - class CloseIter(object): - def __init__(self): - self.iterated = False - def __iter__(self): - return self - def close(self): - got_close.append(None) - def __next__(self): - if self.iterated: - raise StopIteration() - self.iterated = True - return 'bar' - - def bar(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/plain')]) - return CloseIter() - - app_iter, status, headers = run_wsgi_app(bar, {}) - self.assert_equal(status, '200 OK') - self.assert_equal(list(headers), [('Content-Type', 'text/plain')]) - self.assert_equal(next(app_iter), 'bar') - self.assert_raises(StopIteration, partial(next, app_iter)) - app_iter.close() - - self.assert_equal(run_wsgi_app(bar, {}, True)[0], ['bar']) - - self.assert_equal(len(got_close), 2) - - def test_import_string(self): - import cgi - from werkzeug.debug import DebuggedApplication - self.assert_is(utils.import_string('cgi.escape'), cgi.escape) - self.assert_is(utils.import_string(u'cgi.escape'), cgi.escape) - self.assert_is(utils.import_string('cgi:escape'), cgi.escape) - self.assert_is_none(utils.import_string('XXXXXXXXXXXX', True)) - self.assert_is_none(utils.import_string('cgi.XXXXXXXXXXXX', True)) - self.assert_is(utils.import_string(u'cgi.escape'), cgi.escape) - self.assert_is(utils.import_string(u'werkzeug.debug.DebuggedApplication'), DebuggedApplication) - self.assert_raises(ImportError, utils.import_string, 'XXXXXXXXXXXXXXXX') - self.assert_raises(ImportError, utils.import_string, 'cgi.XXXXXXXXXX') - - def test_find_modules(self): - self.assert_equal(list(utils.find_modules('werkzeug.debug')), \ - ['werkzeug.debug.console', 'werkzeug.debug.repr', - 'werkzeug.debug.tbtools']) - - def test_html_builder(self): - html = utils.html - xhtml = utils.xhtml - self.assert_equal(html.p('Hello World'), '

    Hello World

    ') - self.assert_equal(html.a('Test', href='#'), 'Test') - self.assert_equal(html.br(), '
    ') - self.assert_equal(xhtml.br(), '
    ') - self.assert_equal(html.img(src='foo'), '') - self.assert_equal(xhtml.img(src='foo'), '') - self.assert_equal(html.html( - html.head( - html.title('foo'), - html.script(type='text/javascript') - ) - ), 'foo') - self.assert_equal(html(''), '<foo>') - self.assert_equal(html.input(disabled=True), '') - self.assert_equal(xhtml.input(disabled=True), '') - self.assert_equal(html.input(disabled=''), '') - self.assert_equal(xhtml.input(disabled=''), '') - self.assert_equal(html.input(disabled=None), '') - self.assert_equal(xhtml.input(disabled=None), '') - self.assert_equal(html.script('alert("Hello World");'), '') - self.assert_equal(xhtml.script('alert("Hello World");'), '') - - def test_validate_arguments(self): - take_none = lambda: None - take_two = lambda a, b: None - take_two_one_default = lambda a, b=0: None - - self.assert_equal(utils.validate_arguments(take_two, (1, 2,), {}), ((1, 2), {})) - self.assert_equal(utils.validate_arguments(take_two, (1,), {'b': 2}), ((1, 2), {})) - self.assert_equal(utils.validate_arguments(take_two_one_default, (1,), {}), ((1, 0), {})) - self.assert_equal(utils.validate_arguments(take_two_one_default, (1, 2), {}), ((1, 2), {})) - - self.assert_raises(utils.ArgumentValidationError, - utils.validate_arguments, take_two, (), {}) - - self.assert_equal(utils.validate_arguments(take_none, (1, 2,), {'c': 3}), ((), {})) - self.assert_raises(utils.ArgumentValidationError, - utils.validate_arguments, take_none, (1,), {}, drop_extra=False) - self.assert_raises(utils.ArgumentValidationError, - utils.validate_arguments, take_none, (), {'a': 1}, drop_extra=False) - - def test_header_set_duplication_bug(self): - headers = Headers([ - ('Content-Type', 'text/html'), - ('Foo', 'bar'), - ('Blub', 'blah') - ]) - headers['blub'] = 'hehe' - headers['blafasel'] = 'humm' - self.assert_equal(headers, Headers([ - ('Content-Type', 'text/html'), - ('Foo', 'bar'), - ('blub', 'hehe'), - ('blafasel', 'humm') - ])) - - def test_append_slash_redirect(self): - def app(env, sr): - return utils.append_slash_redirect(env)(env, sr) - client = Client(app, BaseResponse) - response = client.get('foo', base_url='http://example.org/app') - self.assert_equal(response.status_code, 301) - self.assert_equal(response.headers['Location'], 'http://example.org/app/foo/') - - def test_cached_property_doc(self): - @utils.cached_property - def foo(): - """testing""" - return 42 - self.assert_equal(foo.__doc__, 'testing') - self.assert_equal(foo.__name__, 'foo') - self.assert_equal(foo.__module__, __name__) - - def test_secure_filename(self): - self.assert_equal(utils.secure_filename('My cool movie.mov'), - 'My_cool_movie.mov') - self.assert_equal(utils.secure_filename('../../../etc/passwd'), - 'etc_passwd') - self.assert_equal(utils.secure_filename(u'i contain cool \xfcml\xe4uts.txt'), - 'i_contain_cool_umlauts.txt') - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(GeneralUtilityTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/wrappers.py b/vendor/werkzeug/testsuite/wrappers.py deleted file mode 100644 index eb746921..00000000 --- a/vendor/werkzeug/testsuite/wrappers.py +++ /dev/null @@ -1,795 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.wrappers - ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - Tests for the response and request objects. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -import pickle -from io import BytesIO -from datetime import datetime -from werkzeug._compat import iteritems - -from werkzeug.testsuite import WerkzeugTestCase - -from werkzeug import wrappers -from werkzeug.exceptions import SecurityError -from werkzeug.wsgi import LimitedStream -from werkzeug.datastructures import MultiDict, ImmutableOrderedMultiDict, \ - ImmutableList, ImmutableTypeConversionDict, CharsetAccept, \ - MIMEAccept, LanguageAccept, Accept, CombinedMultiDict -from werkzeug.test import Client, create_environ, run_wsgi_app -from werkzeug._compat import implements_iterator, text_type - - -class RequestTestResponse(wrappers.BaseResponse): - """Subclass of the normal response class we use to test response - and base classes. Has some methods to test if things in the - response match. - """ - - def __init__(self, response, status, headers): - wrappers.BaseResponse.__init__(self, response, status, headers) - self.body_data = pickle.loads(self.get_data()) - - def __getitem__(self, key): - return self.body_data[key] - - -def request_demo_app(environ, start_response): - request = wrappers.BaseRequest(environ) - assert 'werkzeug.request' in environ - start_response('200 OK', [('Content-Type', 'text/plain')]) - return [pickle.dumps({ - 'args': request.args, - 'args_as_list': list(request.args.lists()), - 'form': request.form, - 'form_as_list': list(request.form.lists()), - 'environ': prepare_environ_pickle(request.environ), - 'data': request.get_data() - })] - - -def prepare_environ_pickle(environ): - result = {} - for key, value in iteritems(environ): - try: - pickle.dumps((key, value)) - except Exception: - continue - result[key] = value - return result - - -class WrappersTestCase(WerkzeugTestCase): - - def assert_environ(self, environ, method): - self.assert_strict_equal(environ['REQUEST_METHOD'], method) - self.assert_strict_equal(environ['PATH_INFO'], '/') - self.assert_strict_equal(environ['SCRIPT_NAME'], '') - self.assert_strict_equal(environ['SERVER_NAME'], 'localhost') - self.assert_strict_equal(environ['wsgi.version'], (1, 0)) - self.assert_strict_equal(environ['wsgi.url_scheme'], 'http') - - def test_base_request(self): - client = Client(request_demo_app, RequestTestResponse) - - # get requests - response = client.get('/?foo=bar&foo=hehe') - self.assert_strict_equal(response['args'], MultiDict([('foo', u'bar'), ('foo', u'hehe')])) - self.assert_strict_equal(response['args_as_list'], [('foo', [u'bar', u'hehe'])]) - self.assert_strict_equal(response['form'], MultiDict()) - self.assert_strict_equal(response['form_as_list'], []) - self.assert_strict_equal(response['data'], b'') - self.assert_environ(response['environ'], 'GET') - - # post requests with form data - response = client.post('/?blub=blah', data='foo=blub+hehe&blah=42', - content_type='application/x-www-form-urlencoded') - self.assert_strict_equal(response['args'], MultiDict([('blub', u'blah')])) - self.assert_strict_equal(response['args_as_list'], [('blub', [u'blah'])]) - self.assert_strict_equal(response['form'], MultiDict([('foo', u'blub hehe'), ('blah', u'42')])) - self.assert_strict_equal(response['data'], b'') - # currently we do not guarantee that the values are ordered correctly - # for post data. - ## self.assert_strict_equal(response['form_as_list'], [('foo', ['blub hehe']), ('blah', ['42'])]) - self.assert_environ(response['environ'], 'POST') - - # patch requests with form data - response = client.patch('/?blub=blah', data='foo=blub+hehe&blah=42', - content_type='application/x-www-form-urlencoded') - self.assert_strict_equal(response['args'], MultiDict([('blub', u'blah')])) - self.assert_strict_equal(response['args_as_list'], [('blub', [u'blah'])]) - self.assert_strict_equal(response['form'], - MultiDict([('foo', u'blub hehe'), ('blah', u'42')])) - self.assert_strict_equal(response['data'], b'') - self.assert_environ(response['environ'], 'PATCH') - - # post requests with json data - json = b'{"foo": "bar", "blub": "blah"}' - response = client.post('/?a=b', data=json, content_type='application/json') - self.assert_strict_equal(response['data'], json) - self.assert_strict_equal(response['args'], MultiDict([('a', u'b')])) - self.assert_strict_equal(response['form'], MultiDict()) - - def test_query_string_is_bytes(self): - req = wrappers.Request.from_values(u'/?foo=%2f') - self.assert_strict_equal(req.query_string, b'foo=%2f') - - def test_access_route(self): - req = wrappers.Request.from_values(headers={ - 'X-Forwarded-For': '192.168.1.2, 192.168.1.1' - }) - req.environ['REMOTE_ADDR'] = '192.168.1.3' - self.assert_equal(req.access_route, ['192.168.1.2', '192.168.1.1']) - self.assert_strict_equal(req.remote_addr, '192.168.1.3') - - req = wrappers.Request.from_values() - req.environ['REMOTE_ADDR'] = '192.168.1.3' - self.assert_strict_equal(list(req.access_route), ['192.168.1.3']) - - def test_url_request_descriptors(self): - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - self.assert_strict_equal(req.path, u'/bar') - self.assert_strict_equal(req.full_path, u'/bar?foo=baz') - self.assert_strict_equal(req.script_root, u'/test') - self.assert_strict_equal(req.url, u'http://example.com/test/bar?foo=baz') - self.assert_strict_equal(req.base_url, u'http://example.com/test/bar') - self.assert_strict_equal(req.url_root, u'http://example.com/test/') - self.assert_strict_equal(req.host_url, u'http://example.com/') - self.assert_strict_equal(req.host, 'example.com') - self.assert_strict_equal(req.scheme, 'http') - - req = wrappers.Request.from_values('/bar?foo=baz', 'https://example.com/test') - self.assert_strict_equal(req.scheme, 'https') - - def test_url_request_descriptors_hosts(self): - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - req.trusted_hosts = ['example.com'] - self.assert_strict_equal(req.path, u'/bar') - self.assert_strict_equal(req.full_path, u'/bar?foo=baz') - self.assert_strict_equal(req.script_root, u'/test') - self.assert_strict_equal(req.url, u'http://example.com/test/bar?foo=baz') - self.assert_strict_equal(req.base_url, u'http://example.com/test/bar') - self.assert_strict_equal(req.url_root, u'http://example.com/test/') - self.assert_strict_equal(req.host_url, u'http://example.com/') - self.assert_strict_equal(req.host, 'example.com') - self.assert_strict_equal(req.scheme, 'http') - - req = wrappers.Request.from_values('/bar?foo=baz', 'https://example.com/test') - self.assert_strict_equal(req.scheme, 'https') - - req = wrappers.Request.from_values('/bar?foo=baz', 'http://example.com/test') - req.trusted_hosts = ['example.org'] - self.assert_raises(SecurityError, lambda: req.url) - self.assert_raises(SecurityError, lambda: req.base_url) - self.assert_raises(SecurityError, lambda: req.url_root) - self.assert_raises(SecurityError, lambda: req.host_url) - self.assert_raises(SecurityError, lambda: req.host) - - def test_authorization_mixin(self): - request = wrappers.Request.from_values(headers={ - 'Authorization': 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' - }) - a = request.authorization - self.assert_strict_equal(a.type, 'basic') - self.assert_strict_equal(a.username, 'Aladdin') - self.assert_strict_equal(a.password, 'open sesame') - - def test_stream_only_mixing(self): - request = wrappers.PlainRequest.from_values( - data=b'foo=blub+hehe', - content_type='application/x-www-form-urlencoded' - ) - self.assert_equal(list(request.files.items()), []) - self.assert_equal(list(request.form.items()), []) - self.assert_raises(AttributeError, lambda: request.data) - self.assert_strict_equal(request.stream.read(), b'foo=blub+hehe') - - def test_base_response(self): - # unicode - response = wrappers.BaseResponse(u'öäü') - self.assert_strict_equal(response.get_data(), u'öäü'.encode('utf-8')) - - # writing - response = wrappers.Response('foo') - response.stream.write('bar') - self.assert_strict_equal(response.get_data(), b'foobar') - - # set cookie - response = wrappers.BaseResponse() - response.set_cookie('foo', 'bar', 60, 0, '/blub', 'example.org') - self.assert_strict_equal(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=bar; Domain=example.org; Expires=Thu, ' - '01-Jan-1970 00:00:00 GMT; Max-Age=60; Path=/blub') - ]) - - # delete cookie - response = wrappers.BaseResponse() - response.delete_cookie('foo') - self.assert_strict_equal(response.headers.to_wsgi_list(), [ - ('Content-Type', 'text/plain; charset=utf-8'), - ('Set-Cookie', 'foo=; Expires=Thu, 01-Jan-1970 00:00:00 GMT; Max-Age=0; Path=/') - ]) - - # close call forwarding - closed = [] - @implements_iterator - class Iterable(object): - def __next__(self): - raise StopIteration() - def __iter__(self): - return self - def close(self): - closed.append(True) - response = wrappers.BaseResponse(Iterable()) - response.call_on_close(lambda: closed.append(True)) - app_iter, status, headers = run_wsgi_app(response, - create_environ(), - buffered=True) - self.assert_strict_equal(status, '200 OK') - self.assert_strict_equal(''.join(app_iter), '') - self.assert_strict_equal(len(closed), 2) - - # with statement - del closed[:] - response = wrappers.BaseResponse(Iterable()) - with response: - pass - self.assert_equal(len(closed), 1) - - def test_response_status_codes(self): - response = wrappers.BaseResponse() - response.status_code = 404 - self.assert_strict_equal(response.status, '404 NOT FOUND') - response.status = '200 OK' - self.assert_strict_equal(response.status_code, 200) - response.status = '999 WTF' - self.assert_strict_equal(response.status_code, 999) - response.status_code = 588 - self.assert_strict_equal(response.status_code, 588) - self.assert_strict_equal(response.status, '588 UNKNOWN') - response.status = 'wtf' - self.assert_strict_equal(response.status_code, 0) - self.assert_strict_equal(response.status, '0 wtf') - - def test_type_forcing(self): - def wsgi_application(environ, start_response): - start_response('200 OK', [('Content-Type', 'text/html')]) - return ['Hello World!'] - base_response = wrappers.BaseResponse('Hello World!', content_type='text/html') - - class SpecialResponse(wrappers.Response): - def foo(self): - return 42 - - # good enough for this simple application, but don't ever use that in - # real world examples! - fake_env = {} - - for orig_resp in wsgi_application, base_response: - response = SpecialResponse.force_type(orig_resp, fake_env) - assert response.__class__ is SpecialResponse - self.assert_strict_equal(response.foo(), 42) - self.assert_strict_equal(response.get_data(), b'Hello World!') - self.assert_equal(response.content_type, 'text/html') - - # without env, no arbitrary conversion - self.assert_raises(TypeError, SpecialResponse.force_type, wsgi_application) - - def test_accept_mixin(self): - request = wrappers.Request({ - 'HTTP_ACCEPT': 'text/xml,application/xml,application/xhtml+xml,' - 'text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', - 'HTTP_ACCEPT_CHARSET': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', - 'HTTP_ACCEPT_ENCODING': 'gzip,deflate', - 'HTTP_ACCEPT_LANGUAGE': 'en-us,en;q=0.5' - }) - self.assert_equal(request.accept_mimetypes, MIMEAccept([ - ('text/xml', 1), ('image/png', 1), ('application/xml', 1), - ('application/xhtml+xml', 1), ('text/html', 0.9), - ('text/plain', 0.8), ('*/*', 0.5) - ])) - self.assert_strict_equal(request.accept_charsets, CharsetAccept([ - ('ISO-8859-1', 1), ('utf-8', 0.7), ('*', 0.7) - ])) - self.assert_strict_equal(request.accept_encodings, Accept([ - ('gzip', 1), ('deflate', 1)])) - self.assert_strict_equal(request.accept_languages, LanguageAccept([ - ('en-us', 1), ('en', 0.5)])) - - request = wrappers.Request({'HTTP_ACCEPT': ''}) - self.assert_strict_equal(request.accept_mimetypes, MIMEAccept()) - - def test_etag_request_mixin(self): - request = wrappers.Request({ - 'HTTP_CACHE_CONTROL': 'no-store, no-cache', - 'HTTP_IF_MATCH': 'w/"foo", bar, "baz"', - 'HTTP_IF_NONE_MATCH': 'w/"foo", bar, "baz"', - 'HTTP_IF_MODIFIED_SINCE': 'Tue, 22 Jan 2008 11:18:44 GMT', - 'HTTP_IF_UNMODIFIED_SINCE': 'Tue, 22 Jan 2008 11:18:44 GMT' - }) - assert request.cache_control.no_store - assert request.cache_control.no_cache - - for etags in request.if_match, request.if_none_match: - assert etags('bar') - assert etags.contains_raw('w/"foo"') - assert etags.contains_weak('foo') - assert not etags.contains('foo') - - self.assert_equal(request.if_modified_since, datetime(2008, 1, 22, 11, 18, 44)) - self.assert_equal(request.if_unmodified_since, datetime(2008, 1, 22, 11, 18, 44)) - - def test_user_agent_mixin(self): - user_agents = [ - ('Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US; rv:1.8.1.11) ' - 'Gecko/20071127 Firefox/2.0.0.11', 'firefox', 'macos', '2.0.0.11', - 'en-US'), - ('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; de-DE) Opera 8.54', - 'opera', 'windows', '8.54', 'de-DE'), - ('Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 ' - '(KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3', - 'safari', 'iphone', '419.3', 'en'), - ('Bot Googlebot/2.1 ( http://www.googlebot.com/bot.html)', - 'google', None, '2.1', None) - ] - for ua, browser, platform, version, lang in user_agents: - request = wrappers.Request({'HTTP_USER_AGENT': ua}) - self.assert_strict_equal(request.user_agent.browser, browser) - self.assert_strict_equal(request.user_agent.platform, platform) - self.assert_strict_equal(request.user_agent.version, version) - self.assert_strict_equal(request.user_agent.language, lang) - assert bool(request.user_agent) - self.assert_strict_equal(request.user_agent.to_header(), ua) - self.assert_strict_equal(str(request.user_agent), ua) - - request = wrappers.Request({'HTTP_USER_AGENT': 'foo'}) - assert not request.user_agent - - def test_stream_wrapping(self): - class LowercasingStream(object): - def __init__(self, stream): - self._stream = stream - def read(self, size=-1): - return self._stream.read(size).lower() - def readline(self, size=-1): - return self._stream.readline(size).lower() - - data = b'foo=Hello+World' - req = wrappers.Request.from_values('/', method='POST', data=data, - content_type='application/x-www-form-urlencoded') - req.stream = LowercasingStream(req.stream) - self.assert_equal(req.form['foo'], 'hello world') - - def test_etag_response_mixin(self): - response = wrappers.Response('Hello World') - self.assert_equal(response.get_etag(), (None, None)) - response.add_etag() - self.assert_equal(response.get_etag(), ('b10a8db164e0754105b7a99be72e3fe5', False)) - assert not response.cache_control - response.cache_control.must_revalidate = True - response.cache_control.max_age = 60 - response.headers['Content-Length'] = len(response.get_data()) - assert response.headers['Cache-Control'] in ('must-revalidate, max-age=60', - 'max-age=60, must-revalidate') - - assert 'date' not in response.headers - env = create_environ() - env.update({ - 'REQUEST_METHOD': 'GET', - 'HTTP_IF_NONE_MATCH': response.get_etag()[0] - }) - response.make_conditional(env) - assert 'date' in response.headers - - # after the thing is invoked by the server as wsgi application - # (we're emulating this here), there must not be any entity - # headers left and the status code would have to be 304 - resp = wrappers.Response.from_app(response, env) - self.assert_equal(resp.status_code, 304) - assert not 'content-length' in resp.headers - - # make sure date is not overriden - response = wrappers.Response('Hello World') - response.date = 1337 - d = response.date - response.make_conditional(env) - self.assert_equal(response.date, d) - - # make sure content length is only set if missing - response = wrappers.Response('Hello World') - response.content_length = 999 - response.make_conditional(env) - self.assert_equal(response.content_length, 999) - - def test_etag_response_mixin_freezing(self): - class WithFreeze(wrappers.ETagResponseMixin, wrappers.BaseResponse): - pass - class WithoutFreeze(wrappers.BaseResponse, wrappers.ETagResponseMixin): - pass - - response = WithFreeze('Hello World') - response.freeze() - self.assert_strict_equal(response.get_etag(), - (text_type(wrappers.generate_etag(b'Hello World')), False)) - response = WithoutFreeze('Hello World') - response.freeze() - self.assert_equal(response.get_etag(), (None, None)) - response = wrappers.Response('Hello World') - response.freeze() - self.assert_equal(response.get_etag(), (None, None)) - - def test_authenticate_mixin(self): - resp = wrappers.Response() - resp.www_authenticate.type = 'basic' - resp.www_authenticate.realm = 'Testing' - self.assert_strict_equal(resp.headers['WWW-Authenticate'], u'Basic realm="Testing"') - resp.www_authenticate.realm = None - resp.www_authenticate.type = None - assert 'WWW-Authenticate' not in resp.headers - - def test_response_stream_mixin(self): - response = wrappers.Response() - response.stream.write('Hello ') - response.stream.write('World!') - self.assert_equal(response.response, ['Hello ', 'World!']) - self.assert_equal(response.get_data(), b'Hello World!') - - def test_common_response_descriptors_mixin(self): - response = wrappers.Response() - response.mimetype = 'text/html' - self.assert_equal(response.mimetype, 'text/html') - self.assert_equal(response.content_type, 'text/html; charset=utf-8') - self.assert_equal(response.mimetype_params, {'charset': 'utf-8'}) - response.mimetype_params['x-foo'] = 'yep' - del response.mimetype_params['charset'] - self.assert_equal(response.content_type, 'text/html; x-foo=yep') - - now = datetime.utcnow().replace(microsecond=0) - - assert response.content_length is None - response.content_length = '42' - self.assert_equal(response.content_length, 42) - - for attr in 'date', 'age', 'expires': - assert getattr(response, attr) is None - setattr(response, attr, now) - self.assert_equal(getattr(response, attr), now) - - assert response.retry_after is None - response.retry_after = now - self.assert_equal(response.retry_after, now) - - assert not response.vary - response.vary.add('Cookie') - response.vary.add('Content-Language') - assert 'cookie' in response.vary - self.assert_equal(response.vary.to_header(), 'Cookie, Content-Language') - response.headers['Vary'] = 'Content-Encoding' - self.assert_equal(response.vary.as_set(), set(['content-encoding'])) - - response.allow.update(['GET', 'POST']) - self.assert_equal(response.headers['Allow'], 'GET, POST') - - response.content_language.add('en-US') - response.content_language.add('fr') - self.assert_equal(response.headers['Content-Language'], 'en-US, fr') - - def test_common_request_descriptors_mixin(self): - request = wrappers.Request.from_values(content_type='text/html; charset=utf-8', - content_length='23', - headers={ - 'Referer': 'http://www.example.com/', - 'Date': 'Sat, 28 Feb 2009 19:04:35 GMT', - 'Max-Forwards': '10', - 'Pragma': 'no-cache', - 'Content-Encoding': 'gzip', - 'Content-MD5': '9a3bc6dbc47a70db25b84c6e5867a072' - }) - - self.assert_equal(request.content_type, 'text/html; charset=utf-8') - self.assert_equal(request.mimetype, 'text/html') - self.assert_equal(request.mimetype_params, {'charset': 'utf-8'}) - self.assert_equal(request.content_length, 23) - self.assert_equal(request.referrer, 'http://www.example.com/') - self.assert_equal(request.date, datetime(2009, 2, 28, 19, 4, 35)) - self.assert_equal(request.max_forwards, 10) - self.assert_true('no-cache' in request.pragma) - self.assert_equal(request.content_encoding, 'gzip') - self.assert_equal(request.content_md5, '9a3bc6dbc47a70db25b84c6e5867a072') - - def test_shallow_mode(self): - request = wrappers.Request({'QUERY_STRING': 'foo=bar'}, shallow=True) - self.assert_equal(request.args['foo'], 'bar') - self.assert_raises(RuntimeError, lambda: request.form['foo']) - - def test_form_parsing_failed(self): - data = ( - b'--blah\r\n' - ) - data = wrappers.Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST') - assert not data.files - assert not data.form - - def test_file_closing(self): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST' - ) - foo = req.files['foo'] - self.assert_equal(foo.mimetype, 'text/plain') - self.assert_equal(foo.filename, 'foo.txt') - - self.assert_equal(foo.closed, False) - req.close() - self.assert_equal(foo.closed, True) - - def test_file_closing_with(self): - data = (b'--foo\r\n' - b'Content-Disposition: form-data; name="foo"; filename="foo.txt"\r\n' - b'Content-Type: text/plain; charset=utf-8\r\n\r\n' - b'file contents, just the contents\r\n' - b'--foo--') - req = wrappers.Request.from_values( - input_stream=BytesIO(data), - content_length=len(data), - content_type='multipart/form-data; boundary=foo', - method='POST' - ) - with req: - foo = req.files['foo'] - self.assert_equal(foo.mimetype, 'text/plain') - self.assert_equal(foo.filename, 'foo.txt') - - self.assert_equal(foo.closed, True) - - def test_url_charset_reflection(self): - req = wrappers.Request.from_values() - req.charset = 'utf-7' - self.assert_equal(req.url_charset, 'utf-7') - - def test_response_streamed(self): - r = wrappers.Response() - assert not r.is_streamed - r = wrappers.Response("Hello World") - assert not r.is_streamed - r = wrappers.Response(["foo", "bar"]) - assert not r.is_streamed - def gen(): - if 0: - yield None - r = wrappers.Response(gen()) - assert r.is_streamed - - def test_response_iter_wrapping(self): - def uppercasing(iterator): - for item in iterator: - yield item.upper() - def generator(): - yield 'foo' - yield 'bar' - req = wrappers.Request.from_values() - resp = wrappers.Response(generator()) - del resp.headers['Content-Length'] - resp.response = uppercasing(resp.iter_encoded()) - actual_resp = wrappers.Response.from_app(resp, req.environ, buffered=True) - self.assertEqual(actual_resp.get_data(), b'FOOBAR') - - def test_response_freeze(self): - def generate(): - yield "foo" - yield "bar" - resp = wrappers.Response(generate()) - resp.freeze() - self.assert_equal(resp.response, [b'foo', b'bar']) - self.assert_equal(resp.headers['content-length'], '6') - - def test_other_method_payload(self): - data = b'Hello World' - req = wrappers.Request.from_values(input_stream=BytesIO(data), - content_length=len(data), - content_type='text/plain', - method='WHAT_THE_FUCK') - self.assert_equal(req.get_data(), data) - self.assert_is_instance(req.stream, LimitedStream) - - def test_urlfication(self): - resp = wrappers.Response() - resp.headers['Location'] = u'http://üser:pässword@☃.net/påth' - resp.headers['Content-Location'] = u'http://☃.net/' - headers = resp.get_wsgi_headers(create_environ()) - self.assert_equal(headers['location'], \ - 'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th') - self.assert_equal(headers['content-location'], 'http://xn--n3h.net/') - - def test_new_response_iterator_behavior(self): - req = wrappers.Request.from_values() - resp = wrappers.Response(u'Hello Wörld!') - - def get_content_length(resp): - headers = resp.get_wsgi_headers(req.environ) - return headers.get('content-length', type=int) - - def generate_items(): - yield "Hello " - yield u"Wörld!" - - # werkzeug encodes when set to `data` now, which happens - # if a string is passed to the response object. - self.assert_equal(resp.response, [u'Hello Wörld!'.encode('utf-8')]) - self.assert_equal(resp.get_data(), u'Hello Wörld!'.encode('utf-8')) - self.assert_equal(get_content_length(resp), 13) - assert not resp.is_streamed - assert resp.is_sequence - - # try the same for manual assignment - resp.set_data(u'Wörd') - self.assert_equal(resp.response, [u'Wörd'.encode('utf-8')]) - self.assert_equal(resp.get_data(), u'Wörd'.encode('utf-8')) - self.assert_equal(get_content_length(resp), 5) - assert not resp.is_streamed - assert resp.is_sequence - - # automatic generator sequence conversion - resp.response = generate_items() - assert resp.is_streamed - assert not resp.is_sequence - self.assert_equal(resp.get_data(), u'Hello Wörld!'.encode('utf-8')) - self.assert_equal(resp.response, [b'Hello ', u'Wörld!'.encode('utf-8')]) - assert not resp.is_streamed - assert resp.is_sequence - - # automatic generator sequence conversion - resp.response = generate_items() - resp.implicit_sequence_conversion = False - assert resp.is_streamed - assert not resp.is_sequence - self.assert_raises(RuntimeError, lambda: resp.get_data()) - resp.make_sequence() - self.assert_equal(resp.get_data(), u'Hello Wörld!'.encode('utf-8')) - self.assert_equal(resp.response, [b'Hello ', u'Wörld!'.encode('utf-8')]) - assert not resp.is_streamed - assert resp.is_sequence - - # stream makes it a list no matter how the conversion is set - for val in True, False: - resp.implicit_sequence_conversion = val - resp.response = ("foo", "bar") - assert resp.is_sequence - resp.stream.write('baz') - self.assert_equal(resp.response, ['foo', 'bar', 'baz']) - - def test_form_data_ordering(self): - class MyRequest(wrappers.Request): - parameter_storage_class = ImmutableOrderedMultiDict - - req = MyRequest.from_values('/?foo=1&bar=0&foo=3') - self.assert_equal(list(req.args), ['foo', 'bar']) - self.assert_equal(list(req.args.items(multi=True)), [ - ('foo', '1'), - ('bar', '0'), - ('foo', '3') - ]) - self.assert_is_instance(req.args, ImmutableOrderedMultiDict) - self.assert_is_instance(req.values, CombinedMultiDict) - self.assert_equal(req.values['foo'], '1') - self.assert_equal(req.values.getlist('foo'), ['1', '3']) - - def test_storage_classes(self): - class MyRequest(wrappers.Request): - dict_storage_class = dict - list_storage_class = list - parameter_storage_class = dict - req = MyRequest.from_values('/?foo=baz', headers={ - 'Cookie': 'foo=bar' - }) - assert type(req.cookies) is dict - self.assert_equal(req.cookies, {'foo': 'bar'}) - assert type(req.access_route) is list - - assert type(req.args) is dict - assert type(req.values) is CombinedMultiDict - self.assert_equal(req.values['foo'], u'baz') - - req = wrappers.Request.from_values(headers={ - 'Cookie': 'foo=bar' - }) - assert type(req.cookies) is ImmutableTypeConversionDict - self.assert_equal(req.cookies, {'foo': 'bar'}) - assert type(req.access_route) is ImmutableList - - MyRequest.list_storage_class = tuple - req = MyRequest.from_values() - assert type(req.access_route) is tuple - - def test_response_headers_passthrough(self): - headers = wrappers.Headers() - resp = wrappers.Response(headers=headers) - assert resp.headers is headers - - def test_response_304_no_content_length(self): - resp = wrappers.Response('Test', status=304) - env = create_environ() - assert 'content-length' not in resp.get_wsgi_headers(env) - - def test_ranges(self): - # basic range stuff - req = wrappers.Request.from_values() - assert req.range is None - req = wrappers.Request.from_values(headers={'Range': 'bytes=0-499'}) - self.assert_equal(req.range.ranges, [(0, 500)]) - - resp = wrappers.Response() - resp.content_range = req.range.make_content_range(1000) - self.assert_equal(resp.content_range.units, 'bytes') - self.assert_equal(resp.content_range.start, 0) - self.assert_equal(resp.content_range.stop, 500) - self.assert_equal(resp.content_range.length, 1000) - self.assert_equal(resp.headers['Content-Range'], 'bytes 0-499/1000') - - resp.content_range.unset() - assert 'Content-Range' not in resp.headers - - resp.headers['Content-Range'] = 'bytes 0-499/1000' - self.assert_equal(resp.content_range.units, 'bytes') - self.assert_equal(resp.content_range.start, 0) - self.assert_equal(resp.content_range.stop, 500) - self.assert_equal(resp.content_range.length, 1000) - - def test_auto_content_length(self): - resp = wrappers.Response('Hello World!') - self.assert_equal(resp.content_length, 12) - - resp = wrappers.Response(['Hello World!']) - assert resp.content_length is None - self.assert_equal(resp.get_wsgi_headers({})['Content-Length'], '12') - - def test_disabled_auto_content_length(self): - class MyResponse(wrappers.Response): - automatically_set_content_length = False - resp = MyResponse('Hello World!') - self.assert_is_none(resp.content_length) - - resp = MyResponse(['Hello World!']) - self.assert_is_none(resp.content_length) - self.assert_not_in('Content-Length', resp.get_wsgi_headers({})) - - def test_location_header_autocorrect(self): - env = create_environ() - class MyResponse(wrappers.Response): - autocorrect_location_header = False - resp = MyResponse('Hello World!') - resp.headers['Location'] = '/test' - self.assert_equal(resp.get_wsgi_headers(env)['Location'], '/test') - - resp = wrappers.Response('Hello World!') - resp.headers['Location'] = '/test' - self.assert_equal(resp.get_wsgi_headers(env)['Location'], 'http://localhost/test') - - def test_modified_url_encoding(self): - class ModifiedRequest(wrappers.Request): - url_charset = 'euc-kr' - - req = ModifiedRequest.from_values(u'/?foo=정상처리'.encode('euc-kr')) - self.assert_strict_equal(req.args['foo'], u'정상처리') - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(WrappersTestCase)) - return suite diff --git a/vendor/werkzeug/testsuite/wsgi.py b/vendor/werkzeug/testsuite/wsgi.py deleted file mode 100644 index 7d55ba0c..00000000 --- a/vendor/werkzeug/testsuite/wsgi.py +++ /dev/null @@ -1,352 +0,0 @@ -# -*- coding: utf-8 -*- -""" - werkzeug.testsuite.wsgi - ~~~~~~~~~~~~~~~~~~~~~~~ - - Tests the WSGI utilities. - - :copyright: (c) 2013 by Armin Ronacher. - :license: BSD, see LICENSE for more details. -""" -import unittest -from os import path -from contextlib import closing - -from werkzeug.testsuite import WerkzeugTestCase, get_temporary_directory - -from werkzeug.wrappers import BaseResponse -from werkzeug.exceptions import BadRequest, ClientDisconnected -from werkzeug.test import Client, create_environ, run_wsgi_app -from werkzeug import wsgi -from werkzeug._compat import StringIO, BytesIO, NativeStringIO, to_native - - -class WSGIUtilsTestCase(WerkzeugTestCase): - - def test_shareddatamiddleware_get_file_loader(self): - app = wsgi.SharedDataMiddleware(None, {}) - assert callable(app.get_file_loader('foo')) - - def test_shared_data_middleware(self): - def null_application(environ, start_response): - start_response('404 NOT FOUND', [('Content-Type', 'text/plain')]) - yield b'NOT FOUND' - - test_dir = get_temporary_directory() - with open(path.join(test_dir, to_native(u'äöü', 'utf-8')), 'w') as test_file: - test_file.write(u'FOUND') - - app = wsgi.SharedDataMiddleware(null_application, { - '/': path.join(path.dirname(__file__), 'res'), - '/sources': path.join(path.dirname(__file__), 'res'), - '/pkg': ('werkzeug.debug', 'shared'), - '/foo': test_dir - }) - - for p in '/test.txt', '/sources/test.txt', '/foo/äöü': - app_iter, status, headers = run_wsgi_app(app, create_environ(p)) - self.assert_equal(status, '200 OK') - with closing(app_iter) as app_iter: - data = b''.join(app_iter).strip() - self.assert_equal(data, b'FOUND') - - app_iter, status, headers = run_wsgi_app( - app, create_environ('/pkg/debugger.js')) - with closing(app_iter) as app_iter: - contents = b''.join(app_iter) - self.assert_in(b'$(function() {', contents) - - app_iter, status, headers = run_wsgi_app( - app, create_environ('/missing')) - self.assert_equal(status, '404 NOT FOUND') - self.assert_equal(b''.join(app_iter).strip(), b'NOT FOUND') - - - def test_get_host(self): - env = {'HTTP_X_FORWARDED_HOST': 'example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - self.assert_equal(wsgi.get_host(env), 'example.org') - self.assert_equal( - wsgi.get_host(create_environ('/', 'http://example.org')), - 'example.org') - - def test_get_host_multiple_forwarded(self): - env = {'HTTP_X_FORWARDED_HOST': 'example.com, example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - self.assert_equal(wsgi.get_host(env), 'example.com') - self.assert_equal( - wsgi.get_host(create_environ('/', 'http://example.com')), - 'example.com') - - def test_get_host_validation(self): - env = {'HTTP_X_FORWARDED_HOST': 'example.org', - 'SERVER_NAME': 'bullshit', 'HOST_NAME': 'ignore me dammit'} - self.assert_equal(wsgi.get_host(env, trusted_hosts=['.example.org']), - 'example.org') - self.assert_raises(BadRequest, wsgi.get_host, env, - trusted_hosts=['example.com']) - - def test_responder(self): - def foo(environ, start_response): - return BaseResponse(b'Test') - client = Client(wsgi.responder(foo), BaseResponse) - response = client.get('/') - self.assert_equal(response.status_code, 200) - self.assert_equal(response.data, b'Test') - - def test_pop_path_info(self): - original_env = {'SCRIPT_NAME': '/foo', 'PATH_INFO': '/a/b///c'} - - # regular path info popping - def assert_tuple(script_name, path_info): - self.assert_equal(env.get('SCRIPT_NAME'), script_name) - self.assert_equal(env.get('PATH_INFO'), path_info) - env = original_env.copy() - pop = lambda: wsgi.pop_path_info(env) - - assert_tuple('/foo', '/a/b///c') - self.assert_equal(pop(), 'a') - assert_tuple('/foo/a', '/b///c') - self.assert_equal(pop(), 'b') - assert_tuple('/foo/a/b', '///c') - self.assert_equal(pop(), 'c') - assert_tuple('/foo/a/b///c', '') - self.assert_is_none(pop()) - - def test_peek_path_info(self): - env = { - 'SCRIPT_NAME': '/foo', - 'PATH_INFO': '/aaa/b///c' - } - - self.assert_equal(wsgi.peek_path_info(env), 'aaa') - self.assert_equal(wsgi.peek_path_info(env), 'aaa') - self.assert_equal(wsgi.peek_path_info(env, charset=None), b'aaa') - self.assert_equal(wsgi.peek_path_info(env, charset=None), b'aaa') - - def test_path_info_and_script_name_fetching(self): - env = create_environ(u'/\N{SNOWMAN}', u'http://example.com/\N{COMET}/') - self.assert_equal(wsgi.get_path_info(env), u'/\N{SNOWMAN}') - self.assert_equal(wsgi.get_path_info(env, charset=None), u'/\N{SNOWMAN}'.encode('utf-8')) - self.assert_equal(wsgi.get_script_name(env), u'/\N{COMET}') - self.assert_equal(wsgi.get_script_name(env, charset=None), u'/\N{COMET}'.encode('utf-8')) - - def test_query_string_fetching(self): - env = create_environ(u'/?\N{SNOWMAN}=\N{COMET}') - qs = wsgi.get_query_string(env) - self.assert_strict_equal(qs, '%E2%98%83=%E2%98%84') - - def test_limited_stream(self): - class RaisingLimitedStream(wsgi.LimitedStream): - def on_exhausted(self): - raise BadRequest('input stream exhausted') - - io = BytesIO(b'123456') - stream = RaisingLimitedStream(io, 3) - self.assert_strict_equal(stream.read(), b'123') - self.assert_raises(BadRequest, stream.read) - - io = BytesIO(b'123456') - stream = RaisingLimitedStream(io, 3) - self.assert_strict_equal(stream.tell(), 0) - self.assert_strict_equal(stream.read(1), b'1') - self.assert_strict_equal(stream.tell(), 1) - self.assert_strict_equal(stream.read(1), b'2') - self.assert_strict_equal(stream.tell(), 2) - self.assert_strict_equal(stream.read(1), b'3') - self.assert_strict_equal(stream.tell(), 3) - self.assert_raises(BadRequest, stream.read) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - self.assert_strict_equal(stream.readline(), b'123456\n') - self.assert_strict_equal(stream.readline(), b'ab') - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - self.assert_strict_equal(stream.readlines(), [b'123456\n', b'ab']) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - self.assert_strict_equal(stream.readlines(2), [b'12']) - self.assert_strict_equal(stream.readlines(2), [b'34']) - self.assert_strict_equal(stream.readlines(), [b'56\n', b'ab']) - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - self.assert_strict_equal(stream.readline(100), b'123456\n') - - io = BytesIO(b'123456\nabcdefg') - stream = wsgi.LimitedStream(io, 9) - self.assert_strict_equal(stream.readlines(100), [b'123456\n', b'ab']) - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 3) - self.assert_strict_equal(stream.read(1), b'1') - self.assert_strict_equal(stream.read(1), b'2') - self.assert_strict_equal(stream.read(), b'3') - self.assert_strict_equal(stream.read(), b'') - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 3) - self.assert_strict_equal(stream.read(-1), b'123') - - io = BytesIO(b'123456') - stream = wsgi.LimitedStream(io, 0) - self.assert_strict_equal(stream.read(-1), b'') - - io = StringIO(u'123456') - stream = wsgi.LimitedStream(io, 0) - self.assert_strict_equal(stream.read(-1), u'') - - io = StringIO(u'123\n456\n') - stream = wsgi.LimitedStream(io, 8) - self.assert_strict_equal(list(stream), [u'123\n', u'456\n']) - - def test_limited_stream_disconnection(self): - io = BytesIO(b'A bit of content') - - # disconnect detection on out of bytes - stream = wsgi.LimitedStream(io, 255) - with self.assert_raises(ClientDisconnected): - stream.read() - - # disconnect detection because file close - io = BytesIO(b'x' * 255) - io.close() - stream = wsgi.LimitedStream(io, 255) - with self.assert_raises(ClientDisconnected): - stream.read() - - def test_path_info_extraction(self): - x = wsgi.extract_path_info('http://example.com/app', '/app/hello') - self.assert_equal(x, u'/hello') - x = wsgi.extract_path_info('http://example.com/app', - 'https://example.com/app/hello') - self.assert_equal(x, u'/hello') - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app/hello') - self.assert_equal(x, u'/hello') - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app') - self.assert_equal(x, u'/') - x = wsgi.extract_path_info(u'http://☃.net/', u'/fööbär') - self.assert_equal(x, u'/fööbär') - x = wsgi.extract_path_info(u'http://☃.net/x', u'http://☃.net/x/fööbär') - self.assert_equal(x, u'/fööbär') - - env = create_environ(u'/fööbär', u'http://☃.net/x/') - x = wsgi.extract_path_info(env, u'http://☃.net/x/fööbär') - self.assert_equal(x, u'/fööbär') - - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/a/hello') - self.assert_is_none(x) - x = wsgi.extract_path_info('http://example.com/app/', - 'https://example.com/app/hello', - collapse_http_schemes=False) - self.assert_is_none(x) - - def test_get_host_fallback(self): - self.assert_equal(wsgi.get_host({ - 'SERVER_NAME': 'foobar.example.com', - 'wsgi.url_scheme': 'http', - 'SERVER_PORT': '80' - }), 'foobar.example.com') - self.assert_equal(wsgi.get_host({ - 'SERVER_NAME': 'foobar.example.com', - 'wsgi.url_scheme': 'http', - 'SERVER_PORT': '81' - }), 'foobar.example.com:81') - - def test_get_current_url_unicode(self): - env = create_environ() - env['QUERY_STRING'] = 'foo=bar&baz=blah&meh=\xcf' - rv = wsgi.get_current_url(env) - self.assert_strict_equal(rv, - u'http://localhost/?foo=bar&baz=blah&meh=\ufffd') - - def test_multi_part_line_breaks(self): - data = 'abcdef\r\nghijkl\r\nmnopqrstuvwxyz\r\nABCDEFGHIJK' - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=16)) - self.assert_equal(lines, ['abcdef\r\n', 'ghijkl\r\n', - 'mnopqrstuvwxyz\r\n', 'ABCDEFGHIJK']) - - data = 'abc\r\nThis line is broken by the buffer length.' \ - '\r\nFoo bar baz' - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=24)) - self.assert_equal(lines, ['abc\r\n', 'This line is broken by the ' - 'buffer length.\r\n', 'Foo bar baz']) - - def test_multi_part_line_breaks_bytes(self): - data = b'abcdef\r\nghijkl\r\nmnopqrstuvwxyz\r\nABCDEFGHIJK' - test_stream = BytesIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=16)) - self.assert_equal(lines, [b'abcdef\r\n', b'ghijkl\r\n', - b'mnopqrstuvwxyz\r\n', b'ABCDEFGHIJK']) - - data = b'abc\r\nThis line is broken by the buffer length.' \ - b'\r\nFoo bar baz' - test_stream = BytesIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=24)) - self.assert_equal(lines, [b'abc\r\n', b'This line is broken by the ' - b'buffer length.\r\n', b'Foo bar baz']) - - def test_multi_part_line_breaks_problematic(self): - data = 'abc\rdef\r\nghi' - for x in range(1, 10): - test_stream = NativeStringIO(data) - lines = list(wsgi.make_line_iter(test_stream, limit=len(data), - buffer_size=4)) - self.assert_equal(lines, ['abc\r', 'def\r\n', 'ghi']) - - def test_iter_functions_support_iterators(self): - data = ['abcdef\r\nghi', 'jkl\r\nmnopqrstuvwxyz\r', '\nABCDEFGHIJK'] - lines = list(wsgi.make_line_iter(data)) - self.assert_equal(lines, ['abcdef\r\n', 'ghijkl\r\n', - 'mnopqrstuvwxyz\r\n', 'ABCDEFGHIJK']) - - def test_make_chunk_iter(self): - data = [u'abcdefXghi', u'jklXmnopqrstuvwxyzX', u'ABCDEFGHIJK'] - rv = list(wsgi.make_chunk_iter(data, 'X')) - self.assert_equal(rv, [u'abcdef', u'ghijkl', u'mnopqrstuvwxyz', - u'ABCDEFGHIJK']) - - data = u'abcdefXghijklXmnopqrstuvwxyzXABCDEFGHIJK' - test_stream = StringIO(data) - rv = list(wsgi.make_chunk_iter(test_stream, 'X', limit=len(data), - buffer_size=4)) - self.assert_equal(rv, [u'abcdef', u'ghijkl', u'mnopqrstuvwxyz', - u'ABCDEFGHIJK']) - - def test_make_chunk_iter_bytes(self): - data = [b'abcdefXghi', b'jklXmnopqrstuvwxyzX', b'ABCDEFGHIJK'] - rv = list(wsgi.make_chunk_iter(data, 'X')) - self.assert_equal(rv, [b'abcdef', b'ghijkl', b'mnopqrstuvwxyz', - b'ABCDEFGHIJK']) - - data = b'abcdefXghijklXmnopqrstuvwxyzXABCDEFGHIJK' - test_stream = BytesIO(data) - rv = list(wsgi.make_chunk_iter(test_stream, 'X', limit=len(data), - buffer_size=4)) - self.assert_equal(rv, [b'abcdef', b'ghijkl', b'mnopqrstuvwxyz', - b'ABCDEFGHIJK']) - - def test_lines_longer_buffer_size(self): - data = '1234567890\n1234567890\n' - for bufsize in range(1, 15): - lines = list(wsgi.make_line_iter(NativeStringIO(data), limit=len(data), - buffer_size=4)) - self.assert_equal(lines, ['1234567890\n', '1234567890\n']) - - -def suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(WSGIUtilsTestCase)) - return suite diff --git a/vendor/werkzeug/urls.py b/vendor/werkzeug/urls.py index 856045df..9d04a107 100644 --- a/vendor/werkzeug/urls.py +++ b/vendor/werkzeug/urls.py @@ -3,16 +3,24 @@ werkzeug.urls ~~~~~~~~~~~~~ - This module implements various URL related functions. + ``werkzeug.urls`` used to provide several wrapper functions for Python 2 + urlparse, whose main purpose were to work around the behavior of the Py2 + stdlib and its lack of unicode support. While this was already a somewhat + inconvenient situation, it got even more complicated because Python 3's + ``urllib.parse`` actually does handle unicode properly. In other words, + this module would wrap two libraries with completely different behavior. So + now this module contains a 2-and-3-compatible backport of Python 3's + ``urllib.parse``, which is mostly API-compatible. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ +import os import re from werkzeug._compat import text_type, PY2, to_unicode, \ - to_native, implements_to_string, try_coerce_native, \ - normalize_string_tuple, make_literal_wrapper, \ - fix_tuple_repr + to_native, implements_to_string, try_coerce_native, \ + normalize_string_tuple, make_literal_wrapper, \ + fix_tuple_repr from werkzeug._internal import _encode_idna, _decode_idna from werkzeug.datastructures import MultiDict, iter_multi_items from collections import namedtuple @@ -32,11 +40,15 @@ _hextobyte = dict( ) -_URLTuple = fix_tuple_repr(namedtuple('_URLTuple', - ['scheme', 'netloc', 'path', 'query', 'fragment'])) +_URLTuple = fix_tuple_repr(namedtuple( + '_URLTuple', + ['scheme', 'netloc', 'path', 'query', 'fragment'] +)) -class _URLMixin(object): +class BaseURL(_URLTuple): + + '''Superclass of :py:class:`URL` and :py:class:`BytesURL`.''' __slots__ = () def replace(self, **kwargs): @@ -61,7 +73,10 @@ class _URLMixin(object): """ rv = self.host if rv is not None and isinstance(rv, text_type): - rv = _encode_idna(rv) + try: + rv = _encode_idna(rv) + except UnicodeError: + rv = rv.encode('ascii', 'ignore') return to_native(rv, 'ascii', 'ignore') @property @@ -174,6 +189,64 @@ class _URLMixin(object): """ return url_parse(uri_to_iri(self)) + def get_file_location(self, pathformat=None): + """Returns a tuple with the location of the file in the form + ``(server, location)``. If the netloc is empty in the URL or + points to localhost, it's represented as ``None``. + + The `pathformat` by default is autodetection but needs to be set + when working with URLs of a specific system. The supported values + are ``'windows'`` when working with Windows or DOS paths and + ``'posix'`` when working with posix paths. + + If the URL does not point to to a local file, the server and location + are both represented as ``None``. + + :param pathformat: The expected format of the path component. + Currently ``'windows'`` and ``'posix'`` are + supported. Defaults to ``None`` which is + autodetect. + """ + if self.scheme != 'file': + return None, None + + path = url_unquote(self.path) + host = self.netloc or None + + if pathformat is None: + if os.name == 'nt': + pathformat = 'windows' + else: + pathformat = 'posix' + + if pathformat == 'windows': + if path[:1] == '/' and path[1:2].isalpha() and path[2:3] in '|:': + path = path[1:2] + ':' + path[3:] + windows_share = path[:3] in ('\\' * 3, '/' * 3) + import ntpath + path = ntpath.normpath(path) + # Windows shared drives are represented as ``\\host\\directory``. + # That results in a URL like ``file://///host/directory``, and a + # path like ``///host/directory``. We need to special-case this + # because the path contains the hostname. + if windows_share and host is None: + parts = path.lstrip('\\').split('\\', 1) + if len(parts) == 2: + host, path = parts + else: + host = parts[0] + path = '' + elif pathformat == 'posix': + import posixpath + path = posixpath.normpath(path) + else: + raise TypeError('Invalid path format %s' % repr(pathformat)) + + if host in ('127.0.0.1', '::1', 'localhost'): + host = None + + return host, path + def _split_netloc(self): if self._at in self.netloc: return self.netloc.split(self._at, 1) @@ -209,7 +282,8 @@ class _URLMixin(object): @implements_to_string -class URL(_URLTuple, _URLMixin): +class URL(BaseURL): + """Represents a parsed URL. This behaves like a regular tuple but also has some extra attributes that give further insight into the URL. @@ -237,7 +311,7 @@ class URL(_URLTuple, _URLMixin): ])) if auth: rv = '%s@%s' % (auth, rv) - return rv.encode('ascii') + return to_native(rv) def encode(self, charset='utf-8', errors='replace'): """Encodes the URL to a tuple made out of bytes. The charset is @@ -252,7 +326,8 @@ class URL(_URLTuple, _URLMixin): ) -class BytesURL(_URLTuple, _URLMixin): +class BytesURL(BaseURL): + """Represents a parsed URL in bytes.""" __slots__ = () _at = b'@' @@ -312,7 +387,7 @@ def _url_encode_impl(obj, charset, encode_keys, sort, key): key = text_type(key).encode(charset) if not isinstance(value, bytes): value = text_type(value).encode(charset) - yield url_quote(key) + '=' + url_quote_plus(value) + yield url_quote_plus(key) + '=' + url_quote_plus(value) def _url_unquote_legacy(value, unsafe=''): @@ -358,8 +433,8 @@ def url_parse(url, scheme=None, allow_fragments=True): if wdelim >= 0: delim = min(delim, wdelim) netloc, url = url[2:delim], url[delim:] - if ((s('[') in netloc and s(']') not in netloc) or - (s(']') in netloc and s('[') not in netloc)): + if (s('[') in netloc and s(']') not in netloc) or \ + (s(']') in netloc and s('[') not in netloc): raise ValueError('Invalid IPv6 URL') if allow_fragments and s('#') in url: @@ -371,12 +446,16 @@ def url_parse(url, scheme=None, allow_fragments=True): return result_type(scheme, netloc, url, query, fragment) -def url_quote(string, charset='utf-8', errors='strict', safe='/:'): +def url_quote(string, charset='utf-8', errors='strict', safe='/:', unsafe=''): """URL encode a single string with a given encoding. :param s: the string to quote. :param charset: the charset to be used. :param safe: an optional sequence of safe characters. + :param unsafe: an optional sequence of unsafe characters. + + .. versionadded:: 0.9.2 + The `unsafe` parameter was added. """ if not isinstance(string, (text_type, bytes, bytearray)): string = text_type(string) @@ -384,7 +463,9 @@ def url_quote(string, charset='utf-8', errors='strict', safe='/:'): string = string.encode(charset, errors) if isinstance(safe, text_type): safe = safe.encode(charset, errors) - safe = frozenset(bytearray(safe) + _always_safe) + if isinstance(unsafe, text_type): + unsafe = unsafe.encode(charset, errors) + safe = frozenset(bytearray(safe) + _always_safe) - frozenset(bytearray(unsafe)) rv = bytearray() for char in bytearray(string): if char in safe: @@ -402,7 +483,7 @@ def url_quote_plus(string, charset='utf-8', errors='strict', safe=''): :param charset: The charset to be used. :param safe: An optional sequence of safe characters. """ - return url_quote(string, charset, errors, safe + ' ').replace(' ', '+') + return url_quote(string, charset, errors, safe + ' ', '+').replace(' ', '+') def url_unparse(components): @@ -485,10 +566,22 @@ def url_fix(s, charset='utf-8'): :param charset: The target charset for the URL if the url was given as unicode string. """ - scheme, netloc, path, qs, anchor = url_parse(to_unicode(s, charset, 'replace')) - path = url_quote(path, charset, safe='/%+$!*\'(),') - qs = url_quote_plus(qs, charset, safe=':&%=+$!*\'(),') - return to_native(url_unparse((scheme, netloc, path, qs, anchor))) + # First step is to switch to unicode processing and to convert + # backslashes (which are invalid in URLs anyways) to slashes. This is + # consistent with what Chrome does. + s = to_unicode(s, charset, 'replace').replace('\\', '/') + + # For the specific case that we look like a malformed windows URL + # we want to fix this up manually: + if s.startswith('file://') and s[7:8].isalpha() and s[8:10] in (':/', '|/'): + s = 'file:///' + s[7:] + + url = url_parse(s) + path = url_quote(url.path, charset, safe='/%+$!*\'(),') + qs = url_quote_plus(url.query, charset, safe=':&%=+$!*\'(),') + anchor = url_quote_plus(url.fragment, charset, safe=':&%=+$!*\'(),') + return to_native(url_unparse((url.scheme, url.encode_netloc(), + path, qs, anchor))) def uri_to_iri(uri, charset='utf-8', errors='replace'): @@ -516,14 +609,14 @@ def uri_to_iri(uri, charset='utf-8', errors='replace'): if isinstance(uri, tuple): uri = url_unparse(uri) uri = url_parse(to_unicode(uri, charset)) - path = url_unquote(uri.path, charset, errors, '/;?') - query = url_unquote(uri.query, charset, errors, ';/?:@&=+,$') - fragment = url_unquote(uri.fragment, charset, errors, ';/?:@&=+,$') + path = url_unquote(uri.path, charset, errors, '%/;?') + query = url_unquote(uri.query, charset, errors, '%;/?:@&=+,$#') + fragment = url_unquote(uri.fragment, charset, errors, '%;/?:@&=+,$#') return url_unparse((uri.scheme, uri.decode_netloc(), path, query, fragment)) -def iri_to_uri(iri, charset='utf-8', errors='strict'): +def iri_to_uri(iri, charset='utf-8', errors='strict', safe_conversion=False): r""" Converts any unicode based IRI to an acceptable ASCII URI. Werkzeug always uses utf-8 URLs internally because this is what browsers and HTTP do as @@ -537,16 +630,49 @@ def iri_to_uri(iri, charset='utf-8', errors='strict'): >>> iri_to_uri(u'http://üser:pässword@☃.net/påth') 'http://%C3%BCser:p%C3%A4ssword@xn--n3h.net/p%C3%A5th' + There is a general problem with IRI and URI conversion with some + protocols that appear in the wild that are in violation of the URI + specification. In places where Werkzeug goes through a forced IRI to + URI conversion it will set the `safe_conversion` flag which will + not perform a conversion if the end result is already ASCII. This + can mean that the return value is not an entirely correct URI but + it will not destroy such invalid URLs in the process. + + As an example consider the following two IRIs:: + + magnet:?xt=uri:whatever + itms-services://?action=download-manifest + + The internal representation after parsing of those URLs is the same + and there is no way to reconstruct the original one. If safe + conversion is enabled however this function becomes a noop for both of + those strings as they both can be considered URIs. + .. versionadded:: 0.6 + .. versionchanged:: 0.9.6 + The `safe_conversion` parameter was added. + :param iri: The IRI to convert. :param charset: The charset for the URI. + :param safe_conversion: indicates if a safe conversion should take place. + For more information see the explanation above. """ if isinstance(iri, tuple): iri = url_unparse(iri) + + if safe_conversion: + try: + native_iri = to_native(iri) + ascii_iri = to_native(iri).encode('ascii') + if ascii_iri.split() == [ascii_iri]: + return native_iri + except UnicodeError: + pass + iri = url_parse(to_unicode(iri, charset, errors)) - netloc = iri.encode_netloc().decode('ascii') + netloc = iri.encode_netloc() path = url_quote(iri.path, charset, errors, '/:~+%') query = url_quote(iri.query, charset, errors, '%&[]:;$*()+,!?*/=') fragment = url_quote(iri.fragment, charset, errors, '=%&[]:;$()+,!?*/') @@ -789,6 +915,7 @@ def url_join(base, url, allow_fragments=True): class Href(object): + """Implements a callable that constructs URLs with the given base. The function can be called with any number of positional and keyword arguments which than are used to assemble the URL. Works with URLs @@ -865,7 +992,7 @@ class Href(object): query = dict([(k.endswith('_') and k[:-1] or k, v) for k, v in query.items()]) path = '/'.join([to_unicode(url_quote(x, self.charset), 'ascii') - for x in path if x is not None]).lstrip('/') + for x in path if x is not None]).lstrip('/') rv = self.base if path: if not rv.endswith('/'): diff --git a/vendor/werkzeug/useragents.py b/vendor/werkzeug/useragents.py index 90e0909c..df427441 100644 --- a/vendor/werkzeug/useragents.py +++ b/vendor/werkzeug/useragents.py @@ -8,16 +8,18 @@ browsers. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import re class UserAgentParser(object): + """A simple user agent parser. Used by the `UserAgent`.""" platforms = ( + ('cros', 'chromeos'), ('iphone|ios', 'iphone'), ('ipad', 'ipad'), (r'darwin|mac|os\s*x', 'macos'), @@ -32,7 +34,8 @@ class UserAgentParser(object): ('sco|unix_sv', 'sco'), ('bsd', 'bsd'), ('amiga', 'amiga'), - ('blackberry|playbook', 'blackberry') + ('blackberry|playbook', 'blackberry'), + ('symbian', 'symbian') ) browsers = ( ('googlebot', 'google'), @@ -44,13 +47,13 @@ class UserAgentParser(object): ('chrome', 'chrome'), ('firefox|firebird|phoenix|iceweasel', 'firefox'), ('galeon', 'galeon'), - ('safari', 'safari'), + ('safari|version', 'safari'), ('webkit', 'webkit'), ('camino', 'camino'), ('konqueror', 'konqueror'), ('k-meleon', 'kmeleon'), ('netscape', 'netscape'), - (r'msie|microsoft\s+internet\s+explorer', 'msie'), + (r'msie|microsoft\s+internet\s+explorer|trident/.+? rv:', 'msie'), ('lynx', 'lynx'), ('links', 'links'), ('seamonkey|mozilla', 'seamonkey') @@ -90,6 +93,7 @@ class UserAgentParser(object): class UserAgent(object): + """Represents a user agent. Pass it a WSGI environment or a user agent string and you can inspect some of the details from the user agent string via the attributes. The following attributes exist: @@ -107,6 +111,7 @@ class UserAgent(object): - `amiga` - `android` - `bsd` + - `chromeos` - `hpux` - `iphone` - `ipad` @@ -187,4 +192,4 @@ class UserAgent(object): # it afterwards. The class itself has the module set to this module so # pickle, inspect and similar modules treat the object as if it was really # implemented here. -from werkzeug.wrappers import UserAgentMixin +from werkzeug.wrappers import UserAgentMixin # noqa diff --git a/vendor/werkzeug/utils.py b/vendor/werkzeug/utils.py index e1b70c9a..935029e8 100644 --- a/vendor/werkzeug/utils.py +++ b/vendor/werkzeug/utils.py @@ -7,7 +7,7 @@ them are used by the request and response wrappers but especially for middleware development it makes sense to use them without the wrappers. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import re @@ -22,7 +22,7 @@ except ImportError: from werkzeug._compat import unichr, text_type, string_types, iteritems, \ reraise, PY2 from werkzeug._internal import _DictAccessorProperty, \ - _parse_signature, _missing + _parse_signature, _missing _format_re = re.compile(r'\$(?:(%s)|\{(%s)\})' % (('[a-zA-Z_][a-zA-Z0-9_]*',) * 2)) @@ -32,7 +32,8 @@ _windows_device_files = ('CON', 'AUX', 'COM1', 'COM2', 'COM3', 'COM4', 'LPT1', 'LPT2', 'LPT3', 'PRN', 'NUL') -class cached_property(object): +class cached_property(property): + """A decorator that converts a function into a lazy property. The function wrapped is called the first time to retrieve the result and then that calculated result is used the next time you access @@ -49,13 +50,11 @@ class cached_property(object): work. """ - # implementation detail: this property is implemented as non-data - # descriptor. non-data descriptors are only invoked if there is - # no entry with the same name in the instance's __dict__. - # this allows us to completely get rid of the access function call - # overhead. If one choses to invoke __get__ by hand the property - # will still work as expected because the lookup logic is replicated - # in __get__ for manual invocation. + # implementation detail: A subclass of python's builtin property + # decorator, we override __get__ to check for a cached value. If one + # choses to invoke __get__ by hand the property will still work as + # expected because the lookup logic is replicated in __get__ for + # manual invocation. def __init__(self, func, name=None, doc=None): self.__name__ = name or func.__name__ @@ -63,6 +62,9 @@ class cached_property(object): self.__doc__ = doc or func.__doc__ self.func = func + def __set__(self, obj, value): + obj.__dict__[self.__name__] = value + def __get__(self, obj, type=None): if obj is None: return self @@ -74,6 +76,7 @@ class cached_property(object): class environ_property(_DictAccessorProperty): + """Maps request attributes to environment variables. This works not only for the Werzeug request object, but also any other class with an environ attribute: @@ -101,6 +104,7 @@ class environ_property(_DictAccessorProperty): class header_property(_DictAccessorProperty): + """Like `environ_property` but for headers.""" def lookup(self, obj): @@ -108,6 +112,7 @@ class header_property(_DictAccessorProperty): class HTMLBuilder(object): + """Helper object for HTML generation. Per default there are two instances of that class. The `html` one, and @@ -157,6 +162,7 @@ class HTMLBuilder(object): def __getattr__(self, tag): if tag[:2] == '__': raise AttributeError(tag) + def proxy(*children, **arguments): buffer = '<' + tag for key, value in iteritems(arguments): @@ -183,7 +189,7 @@ class HTMLBuilder(object): buffer += '>' children_as_string = ''.join([text_type(x) for x in children - if x is not None]) + if x is not None]) if children_as_string: if tag in self._plaintext_elements: @@ -207,7 +213,7 @@ xhtml = HTMLBuilder('xhtml') def get_content_type(mimetype, charset): - """Return the full content type string with charset for a mimetype. + """Returns the full content type string with charset for a mimetype. If the mimetype represents text the charset will be appended as charset parameter, otherwise the mimetype is returned unchanged. @@ -219,7 +225,7 @@ def get_content_type(mimetype, charset): if mimetype.startswith('text/') or \ mimetype == 'application/xml' or \ (mimetype.startswith('application/') and - mimetype.endswith('+xml')): + mimetype.endswith('+xml')): mimetype += '; charset=' + charset return mimetype @@ -250,7 +256,7 @@ def secure_filename(filename): to :func:`os.path.join`. The filename returned is an ASCII only string for maximum portability. - On windows system the function also makes sure that the file is not + On windows systems the function also makes sure that the file is not named after one of the special device files. >>> secure_filename("My cool movie.mov") @@ -335,8 +341,8 @@ def unescape(s): return _entity_re.sub(handle_match, s) -def redirect(location, code=302): - """Return a response object (a WSGI application) that, if called, +def redirect(location, code=302, Response=None): + """Returns a response object (a WSGI application) that, if called, redirects the client to the target location. Supported codes are 301, 302, 303, 305, and 307. 300 is not supported because it's not a real redirect and 304 because it's the answer for a request with a request @@ -346,14 +352,24 @@ def redirect(location, code=302): The location can now be a unicode string that is encoded using the :func:`iri_to_uri` function. + .. versionadded:: 0.10 + The class used for the Response object can now be passed in. + :param location: the location the response should redirect to. :param code: the redirect status code. defaults to 302. + :param class Response: a Response class to use when instantiating a + response. The default is :class:`werkzeug.wrappers.Response` if + unspecified. """ - from werkzeug.wrappers import Response + if Response is None: + from werkzeug.wrappers import Response + display_location = escape(location) if isinstance(location, text_type): + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). from werkzeug.urls import iri_to_uri - location = iri_to_uri(location) + location = iri_to_uri(location, safe_conversion=True) response = Response( '\n' 'Redirecting...\n' @@ -366,7 +382,7 @@ def redirect(location, code=302): def append_slash_redirect(environ, code=301): - """Redirect to the same URL but with a slash appended. The behavior + """Redirects to the same URL but with a slash appended. The behavior of this function is undefined if the path ends with a slash already. :param environ: the WSGI environment for the request that triggers @@ -393,29 +409,32 @@ def import_string(import_name, silent=False): `None` is returned instead. :return: imported object """ - #XXX: py3 review needed - assert isinstance(import_name, string_types) # force the import name to automatically convert to strings - import_name = str(import_name) + # __import__ is not able to handle unicode strings in the fromlist + # if the module is a package + import_name = str(import_name).replace(':', '.') try: - if ':' in import_name: - module, obj = import_name.split(':', 1) - elif '.' in import_name: - module, obj = import_name.rsplit('.', 1) - else: - return __import__(import_name) - # __import__ is not able to handle unicode strings in the fromlist - # if the module is a package - if PY2 and isinstance(obj, unicode): - obj = obj.encode('utf-8') try: - return getattr(__import__(module, None, None, [obj]), obj) - except (ImportError, AttributeError): + __import__(import_name) + except ImportError: + if '.' not in import_name: + raise + else: + return sys.modules[import_name] + + module_name, obj_name = import_name.rsplit('.', 1) + try: + module = __import__(module_name, None, None, [obj_name]) + except ImportError: # support importing modules not yet set up by the parent module # (or package for that matter) - modname = module + '.' + obj - __import__(modname) - return sys.modules[modname] + module = import_string(module_name) + + try: + return getattr(module, obj_name) + except AttributeError as e: + raise ImportError(e) + except ImportError as e: if not silent: reraise( @@ -425,7 +444,7 @@ def import_string(import_name, silent=False): def find_modules(import_path, include_packages=False, recursive=False): - """Find all the modules below a package. This can be useful to + """Finds all the modules below a package. This can be useful to automatically import all views / controllers so that their metaclasses / function decorators have a chance to register themselves on the application. @@ -457,7 +476,7 @@ def find_modules(import_path, include_packages=False, recursive=False): def validate_arguments(func, args, kwargs, drop_extra=True): - """Check if the function accepts the arguments and keyword arguments. + """Checks if the function accepts the arguments and keyword arguments. Returns a new ``(args, kwargs)`` tuple that can safely be passed to the function without causing a `TypeError` because the function signature is incompatible. If `drop_extra` is set to `True` (which is the default) @@ -543,6 +562,7 @@ def bind_arguments(func, args, kwargs): class ArgumentValidationError(ValueError): + """Raised if :func:`validate_arguments` fails to validate""" def __init__(self, missing=None, extra=None, extra_positional=None): @@ -551,12 +571,13 @@ class ArgumentValidationError(ValueError): self.extra_positional = extra_positional or [] ValueError.__init__(self, 'function arguments invalid. (' '%d missing, %d additional)' % ( - len(self.missing), - len(self.extra) + len(self.extra_positional) - )) + len(self.missing), + len(self.extra) + len(self.extra_positional) + )) class ImportStringError(ImportError): + """Provides information about a failed :func:`import_string` attempt.""" #: String in dotted notation that failed to be imported. @@ -599,13 +620,9 @@ class ImportStringError(ImportError): self.exception) -# circular dependencies -from werkzeug.http import quote_header_value, unquote_header_value, \ - cookie_date - # DEPRECATED # these objects were previously in this module as well. we import # them here for backwards compatibility with old pickles. -from werkzeug.datastructures import MultiDict, CombinedMultiDict, \ - Headers, EnvironHeaders -from werkzeug.http import parse_cookie, dump_cookie +from werkzeug.datastructures import ( # noqa + MultiDict, CombinedMultiDict, Headers, EnvironHeaders) +from werkzeug.http import parse_cookie, dump_cookie # noqa diff --git a/vendor/werkzeug/wrappers.py b/vendor/werkzeug/wrappers.py index 7773b77e..2d596693 100644 --- a/vendor/werkzeug/wrappers.py +++ b/vendor/werkzeug/wrappers.py @@ -17,35 +17,35 @@ decoded into an unicode object if possible and if it makes sense. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ from functools import update_wrapper from datetime import datetime, timedelta from werkzeug.http import HTTP_STATUS_CODES, \ - parse_accept_header, parse_cache_control_header, parse_etags, \ - parse_date, generate_etag, is_resource_modified, unquote_etag, \ - quote_etag, parse_set_header, parse_authorization_header, \ - parse_www_authenticate_header, remove_entity_headers, \ - parse_options_header, dump_options_header, http_date, \ - parse_if_range_header, parse_cookie, dump_cookie, \ - parse_range_header, parse_content_range_header, dump_header + parse_accept_header, parse_cache_control_header, parse_etags, \ + parse_date, generate_etag, is_resource_modified, unquote_etag, \ + quote_etag, parse_set_header, parse_authorization_header, \ + parse_www_authenticate_header, remove_entity_headers, \ + parse_options_header, dump_options_header, http_date, \ + parse_if_range_header, parse_cookie, dump_cookie, \ + parse_range_header, parse_content_range_header, dump_header from werkzeug.urls import url_decode, iri_to_uri, url_join from werkzeug.formparser import FormDataParser, default_stream_factory from werkzeug.utils import cached_property, environ_property, \ - header_property, get_content_type + header_property, get_content_type from werkzeug.wsgi import get_current_url, get_host, \ - ClosingIterator, get_input_stream, get_content_length + ClosingIterator, get_input_stream, get_content_length from werkzeug.datastructures import MultiDict, CombinedMultiDict, Headers, \ - EnvironHeaders, ImmutableMultiDict, ImmutableTypeConversionDict, \ - ImmutableList, MIMEAccept, CharsetAccept, LanguageAccept, \ - ResponseCacheControl, RequestCacheControl, CallbackDict, \ - ContentRange, iter_multi_items + EnvironHeaders, ImmutableMultiDict, ImmutableTypeConversionDict, \ + ImmutableList, MIMEAccept, CharsetAccept, LanguageAccept, \ + ResponseCacheControl, RequestCacheControl, CallbackDict, \ + ContentRange, iter_multi_items from werkzeug._internal import _get_environ from werkzeug._compat import to_bytes, string_types, text_type, \ - integer_types, wsgi_decoding_dance, wsgi_get_bytes, \ - to_unicode, to_native + integer_types, wsgi_decoding_dance, wsgi_get_bytes, \ + to_unicode, to_native, BytesIO def _run_wsgi_app(*args): @@ -86,6 +86,7 @@ def _iter_encoded(iterable, charset): class BaseRequest(object): + """Very basic request object. This does not implement advanced stuff like entity tag parsing or cache controls. The request object is created with the WSGI environment as first argument and will add itself to the WSGI @@ -190,13 +191,17 @@ class BaseRequest(object): #: Optionally a list of hosts that is trusted by this request. By default #: all hosts are trusted which means that whatever the client sends the - #: host is will be accepted. This is the recommended setup as a webserver - #: should manually be set up to not route invalid hosts to the application. + #: host is will be accepted. + #: + #: This is the recommended setup as a webserver should manually be set up + #: to only route correct hosts to the application, and remove the + #: `X-Forwarded-Host` header if it is not being used (see + #: :func:`werkzeug.wsgi.get_host`). #: #: .. versionadded:: 0.9 trusted_hosts = None - #: Indicates weather the data descriptor should be allowed to read and + #: Indicates whether the data descriptor should be allowed to read and #: buffer up the input stream. By default it's enabled. #: #: .. versionadded:: 0.9 @@ -214,7 +219,7 @@ class BaseRequest(object): # in a debug session we don't want the repr to blow up. args = [] try: - args.append("'%s'" % self.url) + args.append("'%s'" % to_native(self.url, self.url_charset)) args.append('[%s]' % self.method) except Exception: args.append('(invalid WSGI environ)') @@ -254,6 +259,7 @@ class BaseRequest(object): """ from werkzeug.test import EnvironBuilder charset = kwargs.pop('charset', cls.charset) + kwargs['charset'] = charset builder = EnvironBuilder(*args, **kwargs) try: return builder.get_request(cls) @@ -286,7 +292,7 @@ class BaseRequest(object): return update_wrapper(application, f) def _get_file_stream(self, total_content_length, content_type, filename=None, - content_length=None): + content_length=None): """Called to get a stream for the file upload. This must provide a file-like class with `read()`, `readline()` @@ -335,7 +341,8 @@ class BaseRequest(object): """Method used internally to retrieve submitted data. After calling this sets `form` and `files` on the request object to multi dicts filled with the incoming form data. As a matter of fact the input - stream will be empty afterwards. + stream will be empty afterwards. You can also call this method to + force the parsing of the form data. .. versionadded:: 0.8 """ @@ -350,8 +357,8 @@ class BaseRequest(object): content_length = get_content_length(self.environ) mimetype, options = parse_options_header(content_type) parser = self.make_form_data_parser() - data = parser.parse(self.stream, mimetype, - content_length, options) + data = parser.parse(self._get_stream_for_parsing(), + mimetype, content_length, options) else: data = (self.stream, self.parameter_storage_class(), self.parameter_storage_class()) @@ -361,10 +368,22 @@ class BaseRequest(object): d = self.__dict__ d['stream'], d['form'], d['files'] = data + def _get_stream_for_parsing(self): + """This is the same as accessing :attr:`stream` with the difference + that if it finds cached data from calling :meth:`get_data` first it + will create a new stream out of the cached data. + + .. versionadded:: 0.9.3 + """ + cached_data = getattr(self, '_cached_data', None) + if cached_data is not None: + return BytesIO(cached_data) + return self.stream + def close(self): """Closes associated resources of this request object. This closes all file handles explicitly. You can also use the request - object in a with statement with will automatically close it. + object in a with statement which will automatically close it. .. versionadded:: 0.9 """ @@ -394,9 +413,12 @@ class BaseRequest(object): _assert_not_shallow(self) return get_input_stream(self.environ) - input_stream = environ_property('wsgi.input', 'The WSGI input stream.\n' - 'In general it\'s a bad idea to use this one because you can easily ' - 'read past the boundary. Use the :attr:`stream` instead.') + input_stream = environ_property('wsgi.input', """ + The WSGI input stream. + + In general it's a bad idea to use this one because you can easily read past + the boundary. Use the :attr:`stream` instead. + """) @cached_property def args(self): @@ -415,9 +437,15 @@ class BaseRequest(object): if self.disable_data_descriptor: raise AttributeError('data descriptor is disabled') # XXX: this should eventually be deprecated. - return self.get_data() - def get_data(self, cache=True, as_text=False): + # We trigger form data parsing first which means that the descriptor + # will not cache the data that would otherwise be .form or .files + # data. This restores the behavior that was there in Werkzeug + # before 0.9. New code should use :meth:`get_data` explicitly as + # this will make behavior explicit. + return self.get_data(parse_form_data=True) + + def get_data(self, cache=True, as_text=False, parse_form_data=False): """This reads the buffered incoming data from the client into one bytestring. By default this is cached but that behavior can be changed by setting `cache` to `False`. @@ -426,6 +454,17 @@ class BaseRequest(object): content length first as a client could send dozens of megabytes or more to cause memory problems on the server. + Note that if the form data was already parsed this method will not + return anything as form data parsing does not cache the data like + this method does. To implicitly invoke form data parsing function + set `parse_form_data` to `True`. When this is done the return value + of this method will be an empty string if the form parser handles + the data. This generally is not necessary as if the whole data is + cached (which is the default) the form parser will used the cached + data to parse the form data. Please be generally aware of checking + the content length first in any case before calling this method + to avoid exhausting server memory. + If `as_text` is set to `True` the return value will be a decoded unicode string. @@ -433,6 +472,8 @@ class BaseRequest(object): """ rv = getattr(self, '_cached_data', None) if rv is None: + if parse_form_data: + self._load_form_data() rv = self.stream.read() if cache: self._cached_data = rv @@ -517,38 +558,51 @@ class BaseRequest(object): @cached_property def url(self): - """The reconstructed current URL""" + """The reconstructed current URL as IRI. + See also: :attr:`trusted_hosts`. + """ return get_current_url(self.environ, trusted_hosts=self.trusted_hosts) @cached_property def base_url(self): - """Like :attr:`url` but without the querystring""" + """Like :attr:`url` but without the querystring + See also: :attr:`trusted_hosts`. + """ return get_current_url(self.environ, strip_querystring=True, trusted_hosts=self.trusted_hosts) @cached_property def url_root(self): - """The full URL root (with hostname), this is the application root.""" + """The full URL root (with hostname), this is the application + root as IRI. + See also: :attr:`trusted_hosts`. + """ return get_current_url(self.environ, True, trusted_hosts=self.trusted_hosts) @cached_property def host_url(self): - """Just the host with scheme.""" + """Just the host with scheme as IRI. + See also: :attr:`trusted_hosts`. + """ return get_current_url(self.environ, host_only=True, trusted_hosts=self.trusted_hosts) @cached_property def host(self): - """Just the host including the port if available.""" + """Just the host including the port if available. + See also: :attr:`trusted_hosts`. + """ return get_host(self.environ, trusted_hosts=self.trusted_hosts) - query_string = environ_property('QUERY_STRING', '', read_only=True, - load_func=wsgi_get_bytes, doc= - '''The URL parameters as raw bytestring.''') - method = environ_property('REQUEST_METHOD', 'GET', read_only=True, doc= - '''The transmission method. (For example ``'GET'`` or ``'POST'``).''') + query_string = environ_property( + 'QUERY_STRING', '', read_only=True, + load_func=wsgi_get_bytes, doc='The URL parameters as raw bytestring.') + method = environ_property( + 'REQUEST_METHOD', 'GET', read_only=True, + load_func=lambda x: x.upper(), + doc="The transmission method. (For example ``'GET'`` or ``'POST'``).") @cached_property def access_route(self): @@ -594,10 +648,11 @@ class BaseRequest(object): is_run_once = environ_property('wsgi.run_once', doc=''' boolean that is `True` if the application will be executed only once in a process lifetime. This is the case for CGI for example, - but it's not guaranteed that the exeuction only happens one time.''') + but it's not guaranteed that the execution only happens one time.''') class BaseResponse(object): + """Base response class. The most important fact about a response object is that it's a regular WSGI application. It's initialized with a couple of response parameters (headers, body, status code etc.) and will start a @@ -633,7 +688,7 @@ class BaseResponse(object): To enforce a new type of already existing responses you can use the :meth:`force_type` method. This is useful if you're working with different subclasses of response objects and you want to post process them with a - know interface. + known interface. Per default the request object will assume all the text data is `utf-8` encoded. Please refer to `the unicode chapter `_ for more @@ -647,9 +702,9 @@ class BaseResponse(object): Special note for `mimetype` and `content_type`: For most mime types `mimetype` and `content_type` work the same, the difference affects only 'text' mimetypes. If the mimetype passed with `mimetype` is a - mimetype starting with `text/` it becomes a charset parameter defined - with the charset of the response object. In contrast the - `content_type` parameter is always added as header unmodified. + mimetype starting with `text/`, the charset parameter of the response + object is appended to it. In contrast the `content_type` parameter is + always added as header unmodified. .. versionchanged:: 0.5 the `direct_passthrough` parameter was added. @@ -662,7 +717,7 @@ class BaseResponse(object): :param content_type: the content type for the request. See notice above. :param direct_passthrough: if set to `True` :meth:`iter_encoded` is not called before iteration which makes it - possible to pass special iterators though + possible to pass special iterators through unchanged (see :func:`wrap_file` for more details.) """ @@ -749,7 +804,7 @@ class BaseResponse(object): if self.is_sequence: body_info = '%d bytes' % sum(map(len, self.iter_encoded())) else: - body_info = self.is_streamed and 'streamed' or 'likely-streamed' + body_info = 'streamed' if self.is_streamed else 'likely-streamed' return '<%s %s [%s]>' % ( self.__class__.__name__, body_info, @@ -811,6 +866,7 @@ class BaseResponse(object): def _get_status_code(self): return self._status_code + def _set_status_code(self, code): self._status_code = code try: @@ -823,6 +879,7 @@ class BaseResponse(object): def _get_status(self): return self._status + def _set_status(self, value): self._status = to_native(value) try: @@ -928,7 +985,6 @@ class BaseResponse(object): value of this method is used as application iterator unless :attr:`direct_passthrough` was activated. """ - charset = self.charset if __debug__: _warn_if_string(self.response) # Encode in a separate function so that self.response is fetched @@ -956,8 +1012,8 @@ class BaseResponse(object): span the whole domain. """ self.headers.add('Set-Cookie', dump_cookie(key, value, max_age, - expires, path, domain, secure, httponly, - self.charset)) + expires, path, domain, secure, httponly, + self.charset)) def delete_cookie(self, key, path='/', domain=None): """Delete a cookie. Fails silently if key doesn't exist. @@ -982,7 +1038,7 @@ class BaseResponse(object): """ try: len(self.response) - except TypeError: + except (TypeError, AttributeError): return True return False @@ -1073,7 +1129,10 @@ class BaseResponse(object): if location is not None: old_location = location if isinstance(location, text_type): - location = iri_to_uri(location) + # Safe conversion is necessary here as we might redirect + # to a broken URI scheme (for instance itms-services). + location = iri_to_uri(location, safe_conversion=True) + if self.autocorrect_location_header: current_url = get_current_url(environ, root_only=True) if isinstance(current_url, text_type): @@ -1104,7 +1163,8 @@ class BaseResponse(object): if self.automatically_set_content_length and \ self.is_sequence and content_length is None and status != 304: try: - content_length = sum(len(to_bytes(x, 'ascii')) for x in self.response) + content_length = sum(len(to_bytes(x, 'ascii')) + for x in self.response) except UnicodeError: # aha, something non-bytestringy in there, too bad, we # can't safely figure out the length of the response. @@ -1171,6 +1231,7 @@ class BaseResponse(object): class AcceptMixin(object): + """A mixin for classes with an :attr:`~BaseResponse.environ` attribute to get all the HTTP accept headers as :class:`~werkzeug.datastructures.Accept` objects (or subclasses @@ -1214,6 +1275,7 @@ class AcceptMixin(object): class ETagRequestMixin(object): + """Add entity tag and cache descriptors to a request object or object with a WSGI environment available as :attr:`~BaseRequest.environ`. This not only provides access to etags but also to the cache control header. @@ -1276,6 +1338,7 @@ class ETagRequestMixin(object): class UserAgentMixin(object): + """Adds a `user_agent` attribute to the request object which contains the parsed user agent of the browser that triggered the request as a :class:`~werkzeug.useragents.UserAgent` object. @@ -1289,6 +1352,7 @@ class UserAgentMixin(object): class AuthorizationMixin(object): + """Adds an :attr:`authorization` property that represents the parsed value of the `Authorization` header as :class:`~werkzeug.datastructures.Authorization` object. @@ -1302,6 +1366,7 @@ class AuthorizationMixin(object): class StreamOnlyMixin(object): + """If mixed in before the request object this will change the bahavior of it to disable handling of form parsing. This disables the :attr:`files`, :attr:`form` attributes and will just provide a @@ -1315,6 +1380,7 @@ class StreamOnlyMixin(object): class ETagResponseMixin(object): + """Adds extra functionality to a response object for etag and cache handling. This mixin requires an object with at least a `headers` object that implements a dict like interface similar to @@ -1367,7 +1433,7 @@ class ETagResponseMixin(object): # wsgiref. if 'date' not in self.headers: self.headers['Date'] = http_date() - if 'content-length' not in self.headers: + if self.automatically_set_content_length and 'content-length' not in self.headers: length = self.calculate_content_length() if length is not None: self.headers['Content-Length'] = length @@ -1422,6 +1488,7 @@ class ETagResponseMixin(object): if rv is None: rv = ContentRange(None, None, None, on_update=on_update) return rv + def _set_content_range(self, value): if not value: del self.headers['content-range'] @@ -1440,6 +1507,7 @@ class ETagResponseMixin(object): class ResponseStream(object): + """A file descriptor like object used by the :class:`ResponseStreamMixin` to represent the body of the stream. It directly pushes into the response iterable of the response object. @@ -1456,6 +1524,7 @@ class ResponseStream(object): raise ValueError('I/O operation on closed file') self.response._ensure_sequence(mutable=True) self.response.response.append(value) + self.response.headers.pop('Content-Length', None) def writelines(self, seq): for item in seq: @@ -1479,6 +1548,7 @@ class ResponseStream(object): class ResponseStreamMixin(object): + """Mixin for :class:`BaseRequest` subclasses. Classes that inherit from this mixin will automatically get a :attr:`stream` property that provides a write-only interface to the response iterable. @@ -1491,6 +1561,7 @@ class ResponseStreamMixin(object): class CommonRequestDescriptorsMixin(object): + """A mixin for :class:`BaseRequest` subclasses. Request objects that mix this class in will automatically get descriptors for a couple of HTTP headers with automatic type conversion. @@ -1550,13 +1621,13 @@ class CommonRequestDescriptorsMixin(object): @property def mimetype(self): - """Like :attr:`content_type` but without parameters (eg, without - charset, type etc.). For example if the content - type is ``text/html; charset=utf-8`` the mimetype would be + """Like :attr:`content_type`, but without parameters (eg, without + charset, type etc.) and always lowercase. For example if the content + type is ``text/HTML; charset=utf-8`` the mimetype would be ``'text/html'``. """ self._parse_content_type() - return self._parsed_content_type[0] + return self._parsed_content_type[0].lower() @property def mimetype_params(self): @@ -1579,6 +1650,7 @@ class CommonRequestDescriptorsMixin(object): class CommonResponseDescriptorsMixin(object): + """A mixin for :class:`BaseResponse` subclasses. Response objects that mix this class in will automatically get descriptors for a couple of HTTP headers with automatic type conversion. @@ -1667,6 +1739,7 @@ class CommonResponseDescriptorsMixin(object): elif value.isdigit(): return datetime.utcnow() + timedelta(seconds=int(value)) return parse_date(value) + def _set_retry_after(self, value): if value is None: if 'retry-after' in self.headers: @@ -1693,6 +1766,7 @@ class CommonResponseDescriptorsMixin(object): elif header_set: self.headers[name] = header_set.to_header() return parse_set_header(self.headers.get(name), on_update) + def fset(self, value): if not value: del self.headers[name] @@ -1724,6 +1798,7 @@ class CommonResponseDescriptorsMixin(object): class WWWAuthenticateMixin(object): + """Adds a :attr:`www_authenticate` property to a response object.""" @property @@ -1741,6 +1816,7 @@ class WWWAuthenticateMixin(object): class Request(BaseRequest, AcceptMixin, ETagRequestMixin, UserAgentMixin, AuthorizationMixin, CommonRequestDescriptorsMixin): + """Full featured request object implementing the following mixins: - :class:`AcceptMixin` for accept header parsing @@ -1752,6 +1828,7 @@ class Request(BaseRequest, AcceptMixin, ETagRequestMixin, class PlainRequest(StreamOnlyMixin, Request): + """A request object without special form parsing capabilities. .. versionadded:: 0.9 @@ -1761,6 +1838,7 @@ class PlainRequest(StreamOnlyMixin, Request): class Response(BaseResponse, ETagResponseMixin, ResponseStreamMixin, CommonResponseDescriptorsMixin, WWWAuthenticateMixin): + """Full featured response object implementing the following mixins: - :class:`ETagResponseMixin` for etag and cache control handling diff --git a/vendor/werkzeug/wsgi.py b/vendor/werkzeug/wsgi.py index 5db7d412..2e1c5845 100644 --- a/vendor/werkzeug/wsgi.py +++ b/vendor/werkzeug/wsgi.py @@ -5,12 +5,11 @@ This module implements WSGI related helpers. - :copyright: (c) 2013 by the Werkzeug Team, see AUTHORS for more details. + :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. """ import re import os -import sys import posixpath import mimetypes from itertools import chain @@ -20,11 +19,12 @@ from datetime import datetime from functools import partial, update_wrapper from werkzeug._compat import iteritems, text_type, string_types, \ - implements_iterator, make_literal_wrapper, to_unicode, to_bytes, \ - wsgi_get_bytes, try_coerce_native, PY2 + implements_iterator, make_literal_wrapper, to_unicode, to_bytes, \ + wsgi_get_bytes, try_coerce_native, PY2 from werkzeug._internal import _empty_stream, _encode_idna from werkzeug.http import is_resource_modified, http_date from werkzeug.urls import uri_to_iri, url_quote, url_parse, url_join +from werkzeug.filesystem import get_filesystem_encoding def responder(f): @@ -42,8 +42,8 @@ def responder(f): def get_current_url(environ, root_only=False, strip_querystring=False, host_only=False, trusted_hosts=None): - """A handy helper function that recreates the full URL for the current - request or parts of it. Here an example: + """A handy helper function that recreates the full URL as IRI for the + current request or parts of it. Here an example: >>> from werkzeug.test import create_environ >>> env = create_environ("/?param=foo", "http://localhost/script") @@ -60,6 +60,15 @@ def get_current_url(environ, root_only=False, strip_querystring=False, If the host is not in there it will raise a :exc:`~werkzeug.exceptions.SecurityError`. + Note that the string returned might contain unicode characters as the + representation is an IRI not an URI. If you need an ASCII only + representation you can use the :func:`~werkzeug.urls.iri_to_uri` + function: + + >>> from werkzeug.urls import iri_to_uri + >>> iri_to_uri(get_current_url(env)) + 'http://localhost/script/?param=foo' + :param environ: the WSGI environment to get the current URL from. :param root_only: set `True` if you only want the root URL. :param strip_querystring: set to `True` if you don't want the querystring. @@ -104,14 +113,20 @@ def host_is_trusted(hostname, trusted_list): hostname = hostname.rsplit(':', 1)[0] return _encode_idna(hostname) - hostname = _normalize(hostname) + try: + hostname = _normalize(hostname) + except UnicodeError: + return False for ref in trusted_list: if ref.startswith('.'): ref = ref[1:] suffix_match = True else: suffix_match = False - ref = _normalize(ref) + try: + ref = _normalize(ref) + except UnicodeError: + return False if ref == hostname: return True if suffix_match and hostname.endswith('.' + ref): @@ -120,17 +135,20 @@ def host_is_trusted(hostname, trusted_list): def get_host(environ, trusted_hosts=None): - """Return the real host for the given WSGI environment. This takes care - of the `X-Forwarded-Host` header. Optionally it verifies that the host - is in a list of trusted hosts. If the host is not in there it will raise - a :exc:`~werkzeug.exceptions.SecurityError`. + """Return the real host for the given WSGI environment. This first checks + the `X-Forwarded-Host` header, then the normal `Host` header, and finally + the `SERVER_NAME` environment variable (using the first one it finds). + + Optionally it verifies that the host is in a list of trusted hosts. + If the host is not in there it will raise a + :exc:`~werkzeug.exceptions.SecurityError`. :param environ: the WSGI environment to get the host of. :param trusted_hosts: a list of trusted hosts, see :func:`host_is_trusted` for more information. """ if 'HTTP_X_FORWARDED_HOST' in environ: - rv = environ['HTTP_X_FORWARDED_HOST'].split(',')[0].strip() + rv = environ['HTTP_X_FORWARDED_HOST'].split(',', 1)[0].strip() elif 'HTTP_HOST' in environ: rv = environ['HTTP_HOST'] else: @@ -170,7 +188,7 @@ def get_input_stream(environ, safe_fallback=True): .. versionadded:: 0.9 :param environ: the WSGI environ to fetch the stream from. - :param safe: indicates weather the function should use an empty + :param safe: indicates whether the function should use an empty stream as safe fallback or just return the original WSGI input stream if it can't wrap it safely. The default is to return an empty string in those cases. @@ -179,7 +197,7 @@ def get_input_stream(environ, safe_fallback=True): content_length = get_content_length(environ) # A wsgi extension that tells us if the input is terminated. In - # that case we return the stream unchanged as we know we can savely + # that case we return the stream unchanged as we know we can safely # read it until the end. if environ.get('wsgi.input_terminated'): return stream @@ -397,7 +415,7 @@ def extract_path_info(environ_or_baseurl, path_or_url, charset='utf-8', if scheme not in (u'http', u'https'): return None else: - if not (base_scheme in (u'http', u'https') and \ + if not (base_scheme in (u'http', u'https') and base_scheme == cur_scheme): return None @@ -414,6 +432,7 @@ def extract_path_info(environ_or_baseurl, path_or_url, charset='utf-8', class SharedDataMiddleware(object): + """A WSGI middleware that provides static content for development environments or simple server setups. Usage is quite simple:: @@ -466,7 +485,7 @@ class SharedDataMiddleware(object): :param disallow: a list of :func:`~fnmatch.fnmatch` rules. :param fallback_mimetype: the fallback mimetype for unknown files. :param cache: enable or disable caching headers. - :Param cache_timeout: the cache timeout in seconds for the headers. + :param cache_timeout: the cache timeout in seconds for the headers. """ def __init__(self, app, exports, disallow=None, cache=True, @@ -510,11 +529,12 @@ class SharedDataMiddleware(object): def get_package_loader(self, package, package_path): from pkg_resources import DefaultProvider, ResourceManager, \ - get_provider + get_provider loadtime = datetime.utcnow() provider = get_provider(package) manager = ResourceManager() filesystem_bound = isinstance(provider, DefaultProvider) + def loader(path): if path is None: return None, None @@ -545,7 +565,7 @@ class SharedDataMiddleware(object): def generate_etag(self, mtime, file_size, real_filename): if not isinstance(real_filename, bytes): - real_filename = real_filename.encode(sys.getfilesystemencoding()) + real_filename = real_filename.encode(get_filesystem_encoding()) return 'wzsdm-%d-%s-%s' % ( mktime(mtime.timetuple()), file_size, @@ -555,14 +575,14 @@ class SharedDataMiddleware(object): def __call__(self, environ, start_response): cleaned_path = get_path_info(environ) if PY2: - cleaned_path = cleaned_path.encode(sys.getfilesystemencoding()) + cleaned_path = cleaned_path.encode(get_filesystem_encoding()) # sanitize the path for non unix systems cleaned_path = cleaned_path.strip('/') for sep in os.sep, os.altsep: if sep and sep != '/': cleaned_path = cleaned_path.replace(sep, '/') - path = '/'.join([''] + [x for x in cleaned_path.split('/') - if x and x != '..']) + path = '/' + '/'.join(x for x in cleaned_path.split('/') + if x and x != '..') file_loader = None for search_path, loader in iteritems(self.exports): if search_path == path: @@ -608,6 +628,7 @@ class SharedDataMiddleware(object): class DispatcherMiddleware(object): + """Allows one to mount middlewares or applications in a WSGI application. This is useful if you want to combine multiple WSGI applications:: @@ -628,9 +649,8 @@ class DispatcherMiddleware(object): if script in self.mounts: app = self.mounts[script] break - items = script.split('/') - script = '/'.join(items[:-1]) - path_info = '/%s%s' % (items[-1], path_info) + script, last_item = script.rsplit('/', 1) + path_info = '/%s%s' % (last_item, path_info) else: app = self.mounts.get(script, self.app) original_script_name = environ.get('SCRIPT_NAME', '') @@ -641,6 +661,7 @@ class DispatcherMiddleware(object): @implements_iterator class ClosingIterator(object): + """The WSGI specification requires that all middlewares and gateways respect the `close` callback of an iterator. Because it is useful to add another close action to a returned iterator and adding a custom iterator @@ -707,6 +728,7 @@ def wrap_file(environ, file, buffer_size=8192): @implements_iterator class FileWrapper(object): + """This class can be used to convert a :class:`file`-like object into an iterable. It yields `buffer_size` blocks until the file is fully read. @@ -762,7 +784,8 @@ def _make_chunk_iter(stream, limit, buffer_size): yield item -def make_line_iter(stream, limit=None, buffer_size=10 * 1024): +def make_line_iter(stream, limit=None, buffer_size=10 * 1024, + cap_at_buffer=False): """Safely iterates line-based over an input stream. If the input stream is not a :class:`LimitedStream` the `limit` parameter is mandatory. @@ -786,6 +809,12 @@ def make_line_iter(stream, limit=None, buffer_size=10 * 1024): content length. Not necessary if the `stream` is a :class:`LimitedStream`. :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. """ _iter = _make_chunk_iter(stream, limit, buffer_size) @@ -809,11 +838,19 @@ def make_line_iter(stream, limit=None, buffer_size=10 * 1024): if not new_data: break new_buf = [] + buf_size = 0 for item in chain(buffer, new_data.splitlines(True)): new_buf.append(item) + buf_size += len(item) if item and item[-1:] in crlf: yield _join(new_buf) new_buf = [] + elif cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] buffer = new_buf if buffer: yield _join(buffer) @@ -832,7 +869,8 @@ def make_line_iter(stream, limit=None, buffer_size=10 * 1024): yield previous -def make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024): +def make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024, + cap_at_buffer=False): """Works like :func:`make_line_iter` but accepts a separator which divides chunks. If you want newline based processing you should use :func:`make_line_iter` instead as it @@ -843,12 +881,19 @@ def make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024): .. versionadded:: 0.9 added support for iterators as input stream. + .. versionadded:: 0.11.10 + added support for the `cap_at_buffer` parameter. + :param stream: the stream or iterate to iterate over. :param separator: the separator that divides chunks. :param limit: the limit in bytes for the stream. (Usually content length. Not necessary if the `stream` is otherwise already limited). :param buffer_size: The optional buffer size. + :param cap_at_buffer: if this is set chunks are split if they are longer + than the buffer size. Internally this is implemented + that the buffer size might be exhausted by a factor + of two however. """ _iter = _make_chunk_iter(stream, limit, buffer_size) @@ -873,12 +918,24 @@ def make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024): break chunks = _split(new_data) new_buf = [] + buf_size = 0 for item in chain(buffer, chunks): if item == separator: yield _join(new_buf) new_buf = [] + buf_size = 0 else: + buf_size += len(item) new_buf.append(item) + + if cap_at_buffer and buf_size >= buffer_size: + rv = _join(new_buf) + while len(rv) >= buffer_size: + yield rv[:buffer_size] + rv = rv[buffer_size:] + new_buf = [rv] + buf_size = len(rv) + buffer = new_buf if buffer: yield _join(buffer) @@ -886,6 +943,7 @@ def make_chunk_iter(stream, separator, limit=None, buffer_size=10 * 1024): @implements_iterator class LimitedStream(object): + """Wraps a stream so that it doesn't read more than n bytes. If the stream is exhausted and the caller tries to get more bytes from it :func:`on_exhausted` is called which by default returns an empty