ref: refs/heads/jr-yastmodel
commit 8bc8ec72d19a55340b8b15af37d18bb92eaf5f66
Author: Josef Reidinger
Date: Tue Dec 22 16:36:06 2009 +0100
clean systemtime plugin to demonstrate yast model
rewrite test to use http mock
create ntp model
move functionality from lib and controller to time model
TODO: create tests for models
---
.../app/controllers/systemtime_controller.rb | 91 +-
plugins/systemtime/app/models/ntp.rb | 10 +
plugins/systemtime/app/models/stime.rb | 4 -
plugins/systemtime/app/models/systemtime.rb | 34 +
.../systemtime/app/views/systemtime/index.rhtml | 196 +-
plugins/systemtime/lib/systemtime.rb | 16 -
plugins/systemtime/test/fixtures/ntp.xml | 6 +
plugins/systemtime/test/fixtures/success.xml | 2064 ++++++++++++++++++++
.../test/functional/systemtime_controller_test.rb | 129 +--
webclient/lib/yast_model/base.rb | 4 +-
10 files changed, 2258 insertions(+), 296 deletions(-)
diff --git a/plugins/systemtime/app/controllers/systemtime_controller.rb b/plugins/systemtime/app/controllers/systemtime_controller.rb
index 7fff4aa..ffaf698 100644
--- a/plugins/systemtime/app/controllers/systemtime_controller.rb
+++ b/plugins/systemtime/app/controllers/systemtime_controller.rb
@@ -11,40 +11,21 @@ require 'systemtime'
class SystemtimeController < ApplicationController
before_filter :login_required
layout 'main'
- include ProxyLoader
#helpers
private
- # Fills @+valid+ field that represents valid regions with informations from
- # @+timezone+ field.
- def fill_valid_timezones
- @valid = @@timezones.collect { |region| region.name }
- end
-
- # Fills current region name in field @+region+. Requires filled @+timezones+
- # and @+timezone+ fields
- # throws:: Exception if current timezone is not in any known region. @+region+
- # field in this case is +nil+.
- def fill_current_region
- @region = @@timezones.find { |region|
- region.entries.find { |entry| entry.id==@timezone } }
- raise _("Unknown timezone %s on host") % @timezone unless @region
- end
-
- def clear_time(proxy)
- proxy.time = ""
- proxy.date = ""
- end
-
def available_ntp
begin
- ntp = load_proxy 'org.opensuse.yast.modules.yapi.ntp'
+ unless Ntp.permissions[:available] && Ntp.permissions[:synchronize]
+ logger.info "ntp doesn't have permissions available : #{Ntp.permissions[:available]} synchronize: #{Ntp.permissions[:synchronize]}"
+ return false
+ end
+ ntp = Ntp.find :one
rescue Exception => e #available call, so don't show anything, just log
logger.warn e
return false
end
- return false unless ntp
- return ntp.respond_to? :synchronize
+ return ntp.available?
end
public
@@ -64,22 +45,9 @@ class SystemtimeController < ApplicationController
# fields is filled. In case of errors redirect to help page, main page or just
# show flash with partial problem.
def index
- @ntp = available_ntp
- systemtime = Stime.find :one
- @permissions = Stime.permissions
- @@timezones = systemtime.timezones
- @timezone = systemtime.timezone
- @utcstatus = systemtime.utcstatus
- @time = systemtime.time
- @date = systemtime.date
- fill_valid_timezones
- begin
- fill_current_region
- rescue Exception => e
- flash[:warning] = e.message
- logger.warn e
- redirect_to root_path
- end
+ @ntp_available = available_ntp
+ @stime = Systemtime.find :one
+ @permissions = Systemtime.permissions
end
# Update time handler. Sets to backend new timezone and time.
@@ -87,18 +55,16 @@ class SystemtimeController < ApplicationController
# still shows problems. Now it invalidate session for logged user.If
# everything goes fine it redirect to index
def update
- t = Stime.find :one
-
- fill_proxy_with_timezone t, params, t.timezones
- clear_time t #do nothing
+ t = Systemtime.find :one
+ t.load_timezone params
+ t.clear_time #do not set time by default
case params[:timeconfig]
when "manual"
- fill_proxy_with_time t,params
+ t.load_time params
when "ntp_sync"
- ntp = load_proxy 'org.opensuse.yast.modules.yapi.ntp'
- return false unless ntp
- ntp.synchronize = true
- ntp.synchronize_utc = (t.utcstatus=="UTC")
+ ntp = Ntp.find :one
+ ntp.actions.synchronize = true
+ ntp.actions.synchronize_utc = (t.utcstatus=="UTC")
begin
ntp.save #FIXME check return value
rescue Timeout::Error => e
@@ -109,18 +75,17 @@ class SystemtimeController < ApplicationController
else
logger.error "Unknown value for timeconfig #{params[:timeconfig]}"
end
-
t.timezones = [] #save bandwitch
begin
- t.save
+ t.save #TODO check return value
flash[:notice] = _('Time settings have been written.')
rescue Timeout::Error => e
#do nothing as if you move time to future it throws this exception
log.debug "Time moved to future"
flash[:notice] = _('Time settings have been written.')
- end
+ end
redirect_success
end
@@ -129,20 +94,16 @@ class SystemtimeController < ApplicationController
#AJAX function that renders new timezones for selected region. Expected
# initialized values from index call.
def timezones_for_region
- if @@timezones.empty?
- # since while calling this function there is different instance of the class
- # than when calling index, @@timezones were empty; reinitialize them
- # possible FIXME: how does it increase the amount of data transferred?
- systemtime = Stime.find :one
+ #FIXME do not use AJAX use java script instead as reload of data is not needed
+ # since while calling this function there is different instance of the class
+ # than when calling index, @@timezones were empty; reinitialize them
+ # possible FIXME: how does it increase the amount of data transferred?
+ systemtime = Systemtime.find :one
- @@timezones = systemtime.timezones
- end
+ timezones = systemtime.timezones
- region = @@timezones.find { |r| r.name == params[:value] } #possible FIXME later it gets class, not a string
-
- unless region
- return false; #possible FIXME: is returnign false for AJAX correct?
- end
+ region = timezones.find { |r| r.name == params[:value] } #possible FIXME later it gets class, not a string
+ return false unless region #possible FIXME: is returnign false for AJAX correct?
render(:partial => 'timezones',
:locals => {:region => region, :default => region.central,
diff --git a/plugins/systemtime/app/models/ntp.rb b/plugins/systemtime/app/models/ntp.rb
new file mode 100644
index 0000000..5abd214
--- /dev/null
+++ b/plugins/systemtime/app/models/ntp.rb
@@ -0,0 +1,10 @@
+class Ntp < ActiveResource::Base
+ extend YastModel::Base
+ model_interface :"org.opensuse.yast.modules.yapi.ntp"
+
+ def available?
+ ret = actions.respond_to? :synchronize
+ Rails.logger.info "ntp available : #{ret}"
+ return ret
+ end
+end
diff --git a/plugins/systemtime/app/models/stime.rb b/plugins/systemtime/app/models/stime.rb
deleted file mode 100644
index 540b6b5..0000000
--- a/plugins/systemtime/app/models/stime.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-class Stime < ActiveResource::Base
- extend YastModel::Base
- model_interface :"org.opensuse.yast.modules.yapi.time"
-end
diff --git a/plugins/systemtime/app/models/systemtime.rb b/plugins/systemtime/app/models/systemtime.rb
new file mode 100644
index 0000000..4cfbd8e
--- /dev/null
+++ b/plugins/systemtime/app/models/systemtime.rb
@@ -0,0 +1,34 @@
+class Systemtime < ActiveResource::Base
+ extend YastModel::Base
+ model_interface :"org.opensuse.yast.modules.yapi.time"
+
+ def region
+ reg = self.timezones.find { |region|
+ region.entries.find { |entry| entry.id==self.timezone } }
+ raise _("Unknown timezone %s on host") % timezone unless reg
+ return reg
+ end
+
+ def regions
+ return @regions if @regions
+ @regions = self.timezones.collect { |region| region.name }
+ end
+
+ def load_timezone(params)
+ treg = self.timezones.find { |reg| reg.name == params[:region] } || Hash.new
+
+ tmz = treg.entries.find { |e| e.name == params[:timezone]}
+ self.timezone = tmz.id if tmz
+ self.utcstatus = params[:utc] == "true"
+ end
+
+ def load_time(params)
+ self.date = params[:date][:date]
+ self.time = params[:currenttime]
+ end
+
+ def clear_time
+ self.date = nil
+ self.time = nil
+ end
+end
diff --git a/plugins/systemtime/app/views/systemtime/index.rhtml b/plugins/systemtime/app/views/systemtime/index.rhtml
index d2aab05..0038312 100644
--- a/plugins/systemtime/app/views/systemtime/index.rhtml
+++ b/plugins/systemtime/app/views/systemtime/index.rhtml
@@ -1,112 +1,110 @@
-<% if @permissions %>
- <% disabled = ! @permissions[:write] %>
+<% disabled = !@permissions[:write] %>
- <% content_for :head do %>
- <%= javascript_include_tag :defaults %>
- <link rel="stylesheet" href="/inc/smoothness/jquery.ui.custom.css" type="text/css" media="screen" title="default" charset="utf-8" />
+<% content_for :head do %>
+ <%= javascript_include_tag :defaults %>
+ <link rel="stylesheet" href="/inc/smoothness/jquery.ui.custom.css" type="text/css" media="screen" title="default" charset="utf-8" />
- <% javascript_tag do -%>
- $(document).ready( function() {
- $("#date_date").datepicker( { dateFormat: 'dd/mm/yy'} );
- });
- <% end -%>
+ <% javascript_tag do -%>
+ $(document).ready( function() {
+ $("#date_date").datepicker( { dateFormat: 'dd/mm/yy'} );
+ });
+ <% end -%>
- <!-- FIXME move javascript function outside of index -->
- <% javascript_tag do -%>
- function submitTime() {
- if (!$("#timeconfig_manual")[0].checked){
- return true;
- }
- if (!$("#date_date")[0].value.match( /^\d{2}\/\d{2}\/\d{4}$/)){
- alert ("<%= _("Invalid date format. Correct one is dd/mm/yyyy") %>");
- return false;
- }
- if (!$("#currenttime")[0].value.match( /^\d{2}:\d{2}:\d{2}$/)) {
- alert ("<%= _("Invalid time format. Correct one is hh:mm:ss") %>");
- return false;
- }
- $('#progress').show();
+ <!-- FIXME move javascript function outside of index -->
+ <% javascript_tag do -%>
+ function submitTime() {
+ if (!$("#timeconfig_manual")[0].checked){
return true;
- };
- <% end -%>
- <% javascript_tag do -%>
- function enable() {
- if ( !<%= disabled %> ){
- $("#date_date")[0].disabled = false;
- $("#currenttime")[0].disabled = false;
- }
- };
- function disable() {
- $("#date_date")[0].disabled = true;
- $("#currenttime")[0].disabled = true;
+ }
+ if (!$("#date_date")[0].value.match( /^\d{2}\/\d{2}\/\d{4}$/)){
+ alert ("<%= _("Invalid date format. Correct one is dd/mm/yyyy") %>");
+ return false;
+ }
+ if (!$("#currenttime")[0].value.match( /^\d{2}:\d{2}:\d{2}$/)) {
+ alert ("<%= _("Invalid time format. Correct one is hh:mm:ss") %>");
+ return false;
+ }
+ $('#progress').show();
+ return true;
+ };
+ <% end -%>
+ <% javascript_tag do -%>
+ function enable() {
+ if ( !<%= disabled %> ){
+ $("#date_date")[0].disabled = false;
+ $("#currenttime")[0].disabled = false;
}
+ };
+ function disable() {
+ $("#date_date")[0].disabled = true;
+ $("#currenttime")[0].disabled = true;
+ }
- <% end -%>
- <% end %>
-
- <div class='plugin-icon'><img src='/icons/yast-ntp-client.png' alt="time module"/><%=_("Time")%></div>
-
- <div class="plugin-content grid_12">
- <% form_tag '/systemtime/update', {:class => 'container', :onsubmit => "submitTime();"} do %>
- <% #TODO tooltip for form <div> _("Table for settings timezone for target machine.") </div>
- %>
- <fieldset id="" class="">
- <p>
- <label for="region"><%=_("Region")%></label>
- <%= select_tag "region", options_for_select(@valid, @region.name), :disabled => disabled %>
- </p>
- <p>
- <label for="timezone"><%=_("Timezone")%></label>
- <span id="timezones">
- <%= render(:partial => 'timezones',
- :locals => {:region => @region, :default => @timezone,
- :disabled => disabled}) %>
- </span>
- </p>
- <% unless @utcstatus.nil? %>
+ <% end -%>
+<% end %>
+
+<div class='plugin-icon'><img src='/icons/yast-ntp-client.png' alt="time module"/><%=_("Time")%></div>
+
+<div class="plugin-content grid_12">
+ <% form_tag '/systemtime/update', {:class => 'container', :onsubmit => "submitTime();"} do %>
+ <% #TODO tooltip for form <div> _("Table for settings timezone for target machine.") </div>
+ %>
+ <fieldset id="" class="">
<p>
- <% #don't use check_box helper as it generate also hidden opposite value
- %>
-
- <%= "disabled=\"disabled\"" if disabled %> />
- <span class="form-details"><%=_("Hardware clock is set to UTC")%></span>
+ <label for="region"><%=_("Region")%></label>
+ <%= select_tag "region", options_for_select(@stime.regions, @stime.region.name), :disabled => disabled %>
</p>
- <% end %>
- </fieldset>
- <fieldset>
<p>
-
- >
- <%=_("Manually configure time")%>
- </p>
- <% #TODO for tooltip _("Manual time configuration table, where user selects data and time for target machine")
+ <label for="timezone"><%=_("Timezone")%></label>
+ <span id="timezones">
+ <%= render(:partial => 'timezones',
+ :locals => {:region => @stime.region, :default => @stime.timezone,
+ :disabled => disabled}) %>
+ </span>
+ </p>
+ <% unless @stime.utcstatus.nil? %>
+ <p>
+ <% #don't use check_box helper as it generate also hidden opposite value
%>
- <p>
- <label for="date_date"><%= _("Date") %></label>
- <%= text_field "date","date", :disabled=> "true", :value => @date %>
- </p>
- <p>
- <label for="currenttime"><%= _("Time") %></label>
- <%= text_field_tag "currenttime", @time, :disabled=> "true"%>
- </p>
- <p>
-
- > <%=_("Synchronize via Network Time Protocol (NTP)")%>
- </p>
- </fieldset>
- <%= form_send_buttons :disabled => disabled, :class => "button" %>
- <% end %>
- </div>
-
+
+ <%= "disabled=\"disabled\"" if disabled %> />
+ <span class="form-details"><%=_("Hardware clock is set to UTC")%></span>
+ </p>
+ <% end %>
+</fieldset>
+<fieldset>
+ <p>
+
+ >
+ <%=_("Manually configure time")%>
+ </p>
+ <% #TODO for tooltip _("Manual time configuration table, where user selects data and time for target machine")
+ %>
+ <p>
+ <label for="date_date"><%= _("Date") %></label>
+ <%= text_field "date","date", :disabled=> "true", :value => @stime.date %>
+ </p>
+ <p>
+ <label for="currenttime"><%= _("Time") %></label>
+ <%= text_field_tag "currenttime", @stime.time, :disabled=> "true"%>
+ </p>
+ <p>
+
+ > <%=_("Synchronize via Network Time Protocol (NTP)")%>
+ </p>
+</fieldset>
+ <%= form_send_buttons :disabled => disabled, :class => "button" %>
+ <% end %>
+</div>
- <%= observe_field(:region,
- :frequency => 0.25,
- :update => :timezones,
- :url => { :action => :timezones_for_region },
- :with => "'disabled=' + "+ (disabled ? "true":"false")+" + '&value=' +value") %>
-<% end %>
+
+<%= observe_field(:region,
+ :frequency => 0.25,
+ :update => :timezones,
+ :url => { :action => :timezones_for_region },
+ :with => "'disabled=' + "+ (disabled ? "true":"false")+" + '&value=' +value") %>
diff --git a/plugins/systemtime/lib/systemtime.rb b/plugins/systemtime/lib/systemtime.rb
deleted file mode 100644
index 9fe22c3..0000000
--- a/plugins/systemtime/lib/systemtime.rb
+++ /dev/null
@@ -1,16 +0,0 @@
-# Systemtime
-
-#fills proxy with time parameters and set rest parameters to empty value
-def fill_proxy_with_time(proxy,params)
- proxy.date = params[:date][:date]
- proxy.time = params[:currenttime]
-end
-
-#fills proxy with timezone parameters and set rest parameters to empty value
-def fill_proxy_with_timezone(proxy,params,timezones)
- region = timezones.find { |reg| reg.name == params[:region] } || Hash.new
-
- tmz = region.entries.find { |e| e.name == params[:timezone]}
- proxy.timezone = tmz.id if tmz
- proxy.utcstatus = params[:utc] == "true"
-end
diff --git a/plugins/systemtime/test/fixtures/ntp.xml b/plugins/systemtime/test/fixtures/ntp.xml
new file mode 100644
index 0000000..d750e75
--- /dev/null
+++ b/plugins/systemtime/test/fixtures/ntp.xml
@@ -0,0 +1,6 @@
+<ntp>
+ <actions>
+ true
+ <synchronize type="boolean">false</synchronize>
+ </actions>
+</ntp>
diff --git a/plugins/systemtime/test/fixtures/success.xml b/plugins/systemtime/test/fixtures/success.xml
new file mode 100644
index 0000000..6674d4e
--- /dev/null
+++ b/plugins/systemtime/test/fixtures/success.xml
@@ -0,0 +1,2064 @@
+<systemtime>
+ <timezones type="array">
+ <timezones>
+ <name>Africa</name>
+ <entries type="array">
+ <entries>
+ <name>Maputo</name>
+ <id>Africa/Maputo</id>
+ </entries>
+ <entries>
+ <name>Johannesburg</name>
+ <id>Africa/Johannesburg</id>
+ </entries>
+ <entries>
+ <name>Casablanca</name>
+ <id>Africa/Casablanca</id>
+ </entries>
+ <entries>
+ <name>Banjul</name>
+ <id>Africa/Banjul</id>
+ </entries>
+ <entries>
+ <name>Windhoek</name>
+ <id>Africa/Windhoek</id>
+ </entries>
+ <entries>
+ <name>Maseru</name>
+ <id>Africa/Maseru</id>
+ </entries>
+ <entries>
+ <name>Luanda</name>
+ <id>Africa/Luanda</id>
+ </entries>
+ <entries>
+ <name>Lagos</name>
+ <id>Africa/Lagos</id>
+ </entries>
+ <entries>
+ <name>Kigali</name>
+ <id>Africa/Kigali</id>
+ </entries>
+ <entries>
+ <name>Douala</name>
+ <id>Africa/Douala</id>
+ </entries>
+ <entries>
+ <name>Asmara</name>
+ <id>Africa/Asmara</id>
+ </entries>
+ <entries>
+ <name>Malabo</name>
+ <id>Africa/Malabo</id>
+ </entries>
+ <entries>
+ <name>Lusaka</name>
+ <id>Africa/Lusaka</id>
+ </entries>
+ <entries>
+ <name>Kinshasa</name>
+ <id>Africa/Kinshasa</id>
+ </entries>
+ <entries>
+ <name>El Aaiun</name>
+ <id>Africa/El_Aaiun</id>
+ </entries>
+ <entries>
+ <name>Ceuta</name>
+ <id>Africa/Ceuta</id>
+ </entries>
+ <entries>
+ <name>Nouakchott</name>
+ <id>Africa/Nouakchott</id>
+ </entries>
+ <entries>
+ <name>Lubumbashi</name>
+ <id>Africa/Lubumbashi</id>
+ </entries>
+ <entries>
+ <name>Dar es Salaam</name>
+ <id>Africa/Dar_es_Salaam</id>
+ </entries>
+ <entries>
+ <name>Dakar</name>
+ <id>Africa/Dakar</id>
+ </entries>
+ <entries>
+ <name>Reunion</name>
+ <id>Indian/Reunion</id>
+ </entries>
+ <entries>
+ <name>Ndjamena</name>
+ <id>Africa/Ndjamena</id>
+ </entries>
+ <entries>
+ <name>Mbabane</name>
+ <id>Africa/Mbabane</id>
+ </entries>
+ <entries>
+ <name>Khartoum</name>
+ <id>Africa/Khartoum</id>
+ </entries>
+ <entries>
+ <name>Addis Ababa</name>
+ <id>Africa/Addis_Ababa</id>
+ </entries>
+ <entries>
+ <name>Ouagadougou</name>
+ <id>Africa/Ouagadougou</id>
+ </entries>
+ <entries>
+ <name>Harare</name>
+ <id>Africa/Harare</id>
+ </entries>
+ <entries>
+ <name>Bissau</name>
+ <id>Africa/Bissau</id>
+ </entries>
+ <entries>
+ <name>Bangui</name>
+ <id>Africa/Bangui</id>
+ </entries>
+ <entries>
+ <name>Bamako</name>
+ <id>Africa/Bamako</id>
+ </entries>
+ <entries>
+ <name>Tunis</name>
+ <id>Africa/Tunis</id>
+ </entries>
+ <entries>
+ <name>Monrovia</name>
+ <id>Africa/Monrovia</id>
+ </entries>
+ <entries>
+ <name>Djibouti</name>
+ <id>Africa/Djibouti</id>
+ </entries>
+ <entries>
+ <name>Brazzaville</name>
+ <id>Africa/Brazzaville</id>
+ </entries>
+ <entries>
+ <name>Algiers</name>
+ <id>Africa/Algiers</id>
+ </entries>
+ <entries>
+ <name>Abidjan</name>
+ <id>Africa/Abidjan</id>
+ </entries>
+ <entries>
+ <name>Porto-Novo</name>
+ <id>Africa/Porto-Novo</id>
+ </entries>
+ <entries>
+ <name>Nairobi</name>
+ <id>Africa/Nairobi</id>
+ </entries>
+ <entries>
+ <name>Lome</name>
+ <id>Africa/Lome</id>
+ </entries>
+ <entries>
+ <name>Gaborone</name>
+ <id>Africa/Gaborone</id>
+ </entries>
+ <entries>
+ <name>Accra</name>
+ <id>Africa/Accra</id>
+ </entries>
+ <entries>
+ <name>Antananarivo</name>
+ <id>Indian/Antananarivo</id>
+ </entries>
+ <entries>
+ <name>Sao Tome</name>
+ <id>Africa/Sao_Tome</id>
+ </entries>
+ <entries>
+ <name>Libreville</name>
+ <id>Africa/Libreville</id>
+ </entries>
+ <entries>
+ <name>Freetown</name>
+ <id>Africa/Freetown</id>
+ </entries>
+ <entries>
+ <name>Bujumbura</name>
+ <id>Africa/Bujumbura</id>
+ </entries>
+ <entries>
+ <name>Tripoli</name>
+ <id>Africa/Tripoli</id>
+ </entries>
+ <entries>
+ <name>Niamey</name>
+ <id>Africa/Niamey</id>
+ </entries>
+ <entries>
+ <name>Mogadishu</name>
+ <id>Africa/Mogadishu</id>
+ </entries>
+ <entries>
+ <name>Kampala</name>
+ <id>Africa/Kampala</id>
+ </entries>
+ <entries>
+ <name>Conakry</name>
+ <id>Africa/Conakry</id>
+ </entries>
+ <entries>
+ <name>Cairo</name>
+ <id>Africa/Cairo</id>
+ </entries>
+ <entries>
+ <name>Blantyre</name>
+ <id>Africa/Blantyre</id>
+ </entries>
+ </entries>
+ <central>Africa/Kampala</central>
+ </timezones>
+ <timezones>
+ <name>Argentina</name>
+ <entries type="array">
+ <entries>
+ <name>San Juan</name>
+ <id>America/Argentina/San_Juan</id>
+ </entries>
+ <entries>
+ <name>Mendoza</name>
+ <id>America/Argentina/Mendoza</id>
+ </entries>
+ <entries>
+ <name>La Rioja</name>
+ <id>America/Argentina/La_Rioja</id>
+ </entries>
+ <entries>
+ <name>Jujuy</name>
+ <id>America/Argentina/Jujuy</id>
+ </entries>
+ <entries>
+ <name>Buenos Aires</name>
+ <id>America/Argentina/Buenos_Aires</id>
+ </entries>
+ <entries>
+ <name>Rio Gallegos</name>
+ <id>America/Argentina/Rio_Gallegos</id>
+ </entries>
+ <entries>
+ <name>Ushuaia</name>
+ <id>America/Argentina/Ushuaia</id>
+ </entries>
+ <entries>
+ <name>San Luis</name>
+ <id>America/Argentina/San_Luis</id>
+ </entries>
+ <entries>
+ <name>Cordoba</name>
+ <id>America/Argentina/Cordoba</id>
+ </entries>
+ <entries>
+ <name>Tucuman</name>
+ <id>America/Argentina/Tucuman</id>
+ </entries>
+ <entries>
+ <name>Catamarca</name>
+ <id>America/Argentina/Catamarca</id>
+ </entries>
+ </entries>
+ <central>America/Argentina/Buenos_Aires</central>
+ </timezones>
+ <timezones>
+ <name>Asia</name>
+ <entries type="array">
+ <entries>
+ <name>Yerevan</name>
+ <id>Asia/Yerevan</id>
+ </entries>
+ <entries>
+ <name>Ulan Bator</name>
+ <id>Asia/Ulaanbaatar</id>
+ </entries>
+ <entries>
+ <name>Magadan</name>
+ <id>Asia/Magadan</id>
+ </entries>
+ <entries>
+ <name>Choibalsan</name>
+ <id>Asia/Choibalsan</id>
+ </entries>
+ <entries>
+ <name>Baghdad</name>
+ <id>Asia/Baghdad</id>
+ </entries>
+ <entries>
+ <name>Mideast Riyadh87</name>
+ <id>Mideast/Riyadh87</id>
+ </entries>
+ <entries>
+ <name>Yakutsk</name>
+ <id>Asia/Yakutsk</id>
+ </entries>
+ <entries>
+ <name>Pontianak</name>
+ <id>Asia/Pontianak</id>
+ </entries>
+ <entries>
+ <name>Mideast Riyadh88</name>
+ <id>Mideast/Riyadh88</id>
+ </entries>
+ <entries>
+ <name>Dushanbe</name>
+ <id>Asia/Dushanbe</id>
+ </entries>
+ <entries>
+ <name>Singapore</name>
+ <id>Asia/Singapore</id>
+ </entries>
+ <entries>
+ <name>Mideast Riyadh89</name>
+ <id>Mideast/Riyadh89</id>
+ </entries>
+ <entries>
+ <name>Vientiane</name>
+ <id>Asia/Vientiane</id>
+ </entries>
+ <entries>
+ <name>Tehran</name>
+ <id>Asia/Tehran</id>
+ </entries>
+ <entries>
+ <name>Damascus</name>
+ <id>Asia/Damascus</id>
+ </entries>
+ <entries>
+ <name>Karachi</name>
+ <id>Asia/Karachi</id>
+ </entries>
+ <entries>
+ <name>Baku</name>
+ <id>Asia/Baku</id>
+ </entries>
+ <entries>
+ <name>Hongkong</name>
+ <id>Asia/Hong_Kong</id>
+ </entries>
+ <entries>
+ <name>Sakhalin</name>
+ <id>Asia/Sakhalin</id>
+ </entries>
+ <entries>
+ <name>Tashkent</name>
+ <id>Asia/Tashkent</id>
+ </entries>
+ <entries>
+ <name>Qatar</name>
+ <id>Asia/Qatar</id>
+ </entries>
+ <entries>
+ <name>Seoul</name>
+ <id>Asia/Seoul</id>
+ </entries>
+ <entries>
+ <name>Harbin</name>
+ <id>Asia/Harbin</id>
+ </entries>
+ <entries>
+ <name>Oral</name>
+ <id>Asia/Oral</id>
+ </entries>
+ <entries>
+ <name>Jayapura</name>
+ <id>Asia/Jayapura</id>
+ </entries>
+ <entries>
+ <name>Beijing</name>
+ <id>Asia/Beijing</id>
+ </entries>
+ <entries>
+ <name>Shanghai</name>
+ <id>Asia/Shanghai</id>
+ </entries>
+ <entries>
+ <name>Dubai</name>
+ <id>Asia/Dubai</id>
+ </entries>
+ <entries>
+ <name>Urumqi</name>
+ <id>Asia/Urumqi</id>
+ </entries>
+ <entries>
+ <name>Afghanistan</name>
+ <id>Asia/Kabul</id>
+ </entries>
+ <entries>
+ <name>Bangkok</name>
+ <id>Asia/Bangkok</id>
+ </entries>
+ <entries>
+ <name>Samarkand</name>
+ <id>Asia/Samarkand</id>
+ </entries>
+ <entries>
+ <name>Amman</name>
+ <id>Asia/Amman</id>
+ </entries>
+ <entries>
+ <name>Taipei</name>
+ <id>Asia/Taipei</id>
+ </entries>
+ <entries>
+ <name>Krasnoyarsk</name>
+ <id>Asia/Krasnoyarsk</id>
+ </entries>
+ <entries>
+ <name>Vladivostok</name>
+ <id>Asia/Vladivostok</id>
+ </entries>
+ <entries>
+ <name>Kuching</name>
+ <id>Asia/Kuching</id>
+ </entries>
+ <entries>
+ <name>Muscat</name>
+ <id>Asia/Muscat</id>
+ </entries>
+ <entries>
+ <name>Omsk</name>
+ <id>Asia/Omsk</id>
+ </entries>
+ <entries>
+ <name>Aqtau</name>
+ <id>Asia/Aqtau</id>
+ </entries>
+ <entries>
+ <name>Myanmar</name>
+ <id>Asia/Rangoon</id>
+ </entries>
+ <entries>
+ <name>Gaza</name>
+ <id>Asia/Gaza</id>
+ </entries>
+ <entries>
+ <name>Israel</name>
+ <id>Asia/Jerusalem</id>
+ </entries>
+ <entries>
+ <name>Chongqing</name>
+ <id>Asia/Chongqing</id>
+ </entries>
+ <entries>
+ <name>Brunei</name>
+ <id>Asia/Brunei</id>
+ </entries>
+ <entries>
+ <name>Qyzylorda</name>
+ <id>Asia/Qyzylorda</id>
+ </entries>
+ <entries>
+ <name>Aqtobe</name>
+ <id>Asia/Aqtobe</id>
+ </entries>
+ <entries>
+ <name>Kuwait</name>
+ <id>Asia/Kuwait</id>
+ </entries>
+ <entries>
+ <name>Kamchatka</name>
+ <id>Asia/Kamchatka</id>
+ </entries>
+ <entries>
+ <name>Colombo</name>
+ <id>Asia/Colombo</id>
+ </entries>
+ <entries>
+ <name>Riyadh</name>
+ <id>Asia/Riyadh</id>
+ </entries>
+ <entries>
+ <name>Beirut</name>
+ <id>Asia/Beirut</id>
+ </entries>
+ <entries>
+ <name>Kashgar</name>
+ <id>Asia/Kashgar</id>
+ </entries>
+ <entries>
+ <name>Almaty</name>
+ <id>Asia/Almaty</id>
+ </entries>
+ <entries>
+ <name>Thimphu</name>
+ <id>Asia/Thimphu</id>
+ </entries>
+ <entries>
+ <name>Manila</name>
+ <id>Asia/Manila</id>
+ </entries>
+ <entries>
+ <name>Macao</name>
+ <id>Asia/Macau</id>
+ </entries>
+ <entries>
+ <name>Bishkek</name>
+ <id>Asia/Bishkek</id>
+ </entries>
+ <entries>
+ <name>Ashgabat</name>
+ <id>Asia/Ashgabat</id>
+ </entries>
+ <entries>
+ <name>Nicosia</name>
+ <id>Asia/Nicosia</id>
+ </entries>
+ <entries>
+ <name>Jakarta</name>
+ <id>Asia/Jakarta</id>
+ </entries>
+ <entries>
+ <name>Makassar</name>
+ <id>Asia/Makassar</id>
+ </entries>
+ <entries>
+ <name>Phnom Penh</name>
+ <id>Asia/Phnom_Penh</id>
+ </entries>
+ <entries>
+ <name>Aden</name>
+ <id>Asia/Aden</id>
+ </entries>
+ <entries>
+ <name>Anadyr</name>
+ <id>Asia/Anadyr</id>
+ </entries>
+ <entries>
+ <name>Dhaka</name>
+ <id>Asia/Dhaka</id>
+ </entries>
+ <entries>
+ <name>Kuala Lumpur</name>
+ <id>Asia/Kuala_Lumpur</id>
+ </entries>
+ <entries>
+ <name>Irkutsk</name>
+ <id>Asia/Irkutsk</id>
+ </entries>
+ <entries>
+ <name>Tbilisi</name>
+ <id>Asia/Tbilisi</id>
+ </entries>
+ <entries>
+ <name>Yekaterinburg</name>
+ <id>Asia/Yekaterinburg</id>
+ </entries>
+ <entries>
+ <name>Japan</name>
+ <id>Asia/Tokyo</id>
+ </entries>
+ <entries>
+ <name>Katmandu</name>
+ <id>Asia/Katmandu</id>
+ </entries>
+ <entries>
+ <name>Kolkata</name>
+ <id>Asia/Kolkata</id>
+ </entries>
+ <entries>
+ <name>Dili</name>
+ <id>Asia/Dili</id>
+ </entries>
+ <entries>
+ <name>Pyongyang</name>
+ <id>Asia/Pyongyang</id>
+ </entries>
+ <entries>
+ <name>Hovd</name>
+ <id>Asia/Hovd</id>
+ </entries>
+ <entries>
+ <name>Novosibirsk</name>
+ <id>Asia/Novosibirsk</id>
+ </entries>
+ <entries>
+ <name>Saigon</name>
+ <id>Asia/Ho_Chi_Minh</id>
+ </entries>
+ <entries>
+ <name>Bahrain</name>
+ <id>Asia/Bahrain</id>
+ </entries>
+ </entries>
+ <central>Asia/Kolkata</central>
+ </timezones>
+ <timezones>
+ <name>Atlantic</name>
+ <entries type="array">
+ <entries>
+ <name>Stanley</name>
+ <id>Atlantic/Stanley</id>
+ </entries>
+ <entries>
+ <name>St Helena</name>
+ <id>Atlantic/St_Helena</id>
+ </entries>
+ <entries>
+ <name>Jan Mayen</name>
+ <id>Atlantic/Jan_Mayen</id>
+ </entries>
+ <entries>
+ <name>Miquelon</name>
+ <id>America/Miquelon</id>
+ </entries>
+ <entries>
+ <name>Canary Islands</name>
+ <id>Atlantic/Canary</id>
+ </entries>
+ <entries>
+ <name>Bermuda</name>
+ <id>Atlantic/Bermuda</id>
+ </entries>
+ <entries>
+ <name>Iceland</name>
+ <id>Atlantic/Reykjavik</id>
+ </entries>
+ <entries>
+ <name>Greenland (Thule)</name>
+ <id>America/Thule</id>
+ </entries>
+ <entries>
+ <name>Greenland (Nuuk)</name>
+ <id>America/Godthab</id>
+ </entries>
+ <entries>
+ <name>Faroe Islands</name>
+ <id>Atlantic/Faroe</id>
+ </entries>
+ <entries>
+ <name>Greenland (Scoresbysund)</name>
+ <id>America/Scoresbysund</id>
+ </entries>
+ <entries>
+ <name>Madeira</name>
+ <id>Atlantic/Madeira</id>
+ </entries>
+ <entries>
+ <name>Azores</name>
+ <id>Atlantic/Azores</id>
+ </entries>
+ <entries>
+ <name>South Georgia</name>
+ <id>Atlantic/South_Georgia</id>
+ </entries>
+ <entries>
+ <name>Cape Verde</name>
+ <id>Atlantic/Cape_Verde</id>
+ </entries>
+ <entries>
+ <name>Greenland (Danmarkshavn)</name>
+ <id>America/Danmarkshavn</id>
+ </entries>
+ </entries>
+ <central>Atlantic/Madeira</central>
+ </timezones>
+ <timezones>
+ <name>Australia</name>
+ <entries type="array">
+ <entries>
+ <name>New South Wales (Sydney)</name>
+ <id>Australia/Sydney</id>
+ </entries>
+ <entries>
+ <name>Lindeman</name>
+ <id>Australia/Lindeman</id>
+ </entries>
+ <entries>
+ <name>Northern Territory (Darwin)</name>
+ <id>Australia/Darwin</id>
+ </entries>
+ <entries>
+ <name>South Australia (Adelaide)</name>
+ <id>Australia/Adelaide</id>
+ </entries>
+ <entries>
+ <name>Tasmania (Hobart)</name>
+ <id>Australia/Hobart</id>
+ </entries>
+ <entries>
+ <name>Eucla</name>
+ <id>Australia/Eucla</id>
+ </entries>
+ <entries>
+ <name>New South Wales (Broken Hill)</name>
+ <id>Australia/Broken_Hill</id>
+ </entries>
+ <entries>
+ <name>Tasmania (Currie)</name>
+ <id>Australia/Currie</id>
+ </entries>
+ <entries>
+ <name>Western Australia (Perth)</name>
+ <id>Australia/Perth</id>
+ </entries>
+ <entries>
+ <name>Victoria (Melbourne)</name>
+ <id>Australia/Melbourne</id>
+ </entries>
+ <entries>
+ <name>Lord Howe Island</name>
+ <id>Australia/Lord_Howe</id>
+ </entries>
+ <entries>
+ <name>Queensland (Brisbane)</name>
+ <id>Australia/Brisbane</id>
+ </entries>
+ </entries>
+ <central>Australia/Sydney</central>
+ </timezones>
+ <timezones>
+ <name>Brazil</name>
+ <entries type="array">
+ <entries>
+ <name>Porto Velho</name>
+ <id>America/Porto_Velho</id>
+ </entries>
+ <entries>
+ <name>Eirunepe</name>
+ <id>America/Eirunepe</id>
+ </entries>
+ <entries>
+ <name>Bahia</name>
+ <id>America/Bahia</id>
+ </entries>
+ <entries>
+ <name>Fernando de Noronha</name>
+ <id>America/Noronha</id>
+ </entries>
+ <entries>
+ <name>Cuiaba</name>
+ <id>America/Cuiaba</id>
+ </entries>
+ <entries>
+ <name>Campo Grande</name>
+ <id>America/Campo_Grande</id>
+ </entries>
+ <entries>
+ <name>Boa Vista</name>
+ <id>America/Boa_Vista</id>
+ </entries>
+ <entries>
+ <name>Recife</name>
+ <id>America/Recife</id>
+ </entries>
+ <entries>
+ <name>Manaus</name>
+ <id>America/Manaus</id>
+ </entries>
+ <entries>
+ <name>Araguaina</name>
+ <id>America/Araguaina</id>
+ </entries>
+ <entries>
+ <name>Maceio</name>
+ <id>America/Maceio</id>
+ </entries>
+ <entries>
+ <name>Sao Paulo</name>
+ <id>America/Sao_Paulo</id>
+ </entries>
+ <entries>
+ <name>Rio Branco</name>
+ <id>America/Rio_Branco</id>
+ </entries>
+ <entries>
+ <name>Belem</name>
+ <id>America/Belem</id>
+ </entries>
+ <entries>
+ <name>Fortaleza</name>
+ <id>America/Fortaleza</id>
+ </entries>
+ </entries>
+ <central>America/Sao_Paulo</central>
+ </timezones>
+ <timezones>
+ <name>Canada</name>
+ <entries type="array">
+ <entries>
+ <name>Saskatchewan (Regina)</name>
+ <id>America/Regina</id>
+ </entries>
+ <entries>
+ <name>Rankin Inlet</name>
+ <id>America/Rankin_Inlet</id>
+ </entries>
+ <entries>
+ <name>Thunder Bay</name>
+ <id>America/Thunder_Bay</id>
+ </entries>
+ <entries>
+ <name>Resolute</name>
+ <id>America/Resolute</id>
+ </entries>
+ <entries>
+ <name>Goose Bay</name>
+ <id>America/Goose_Bay</id>
+ </entries>
+ <entries>
+ <name>Dawson Creek</name>
+ <id>America/Dawson_Creek</id>
+ </entries>
+ <entries>
+ <name>Atikokan</name>
+ <id>America/Atikokan</id>
+ </entries>
+ <entries>
+ <name>Yukon (Whitehorse)</name>
+ <id>America/Whitehorse</id>
+ </entries>
+ <entries>
+ <name>Swift Current</name>
+ <id>America/Swift_Current</id>
+ </entries>
+ <entries>
+ <name>Newfoundland (St Johns)</name>
+ <id>America/St_Johns</id>
+ </entries>
+ <entries>
+ <name>Iqaluit</name>
+ <id>America/Iqaluit</id>
+ </entries>
+ <entries>
+ <name>Blanc-Sablon</name>
+ <id>America/Blanc-Sablon</id>
+ </entries>
+ <entries>
+ <name>Glace Bay</name>
+ <id>America/Glace_Bay</id>
+ </entries>
+ <entries>
+ <name>Yellowknife</name>
+ <id>America/Yellowknife</id>
+ </entries>
+ <entries>
+ <name>Inuvik</name>
+ <id>America/Inuvik</id>
+ </entries>
+ <entries>
+ <name>Dawson</name>
+ <id>America/Dawson</id>
+ </entries>
+ <entries>
+ <name>Rainy River</name>
+ <id>America/Rainy_River</id>
+ </entries>
+ <entries>
+ <name>Pangnirtung</name>
+ <id>America/Pangnirtung</id>
+ </entries>
+ <entries>
+ <name>Nipigon</name>
+ <id>America/Nipigon</id>
+ </entries>
+ <entries>
+ <name>Eastern (Toronto)</name>
+ <id>America/Toronto</id>
+ </entries>
+ <entries>
+ <name>Montreal</name>
+ <id>America/Montreal</id>
+ </entries>
+ <entries>
+ <name>Moncton</name>
+ <id>America/Moncton</id>
+ </entries>
+ <entries>
+ <name>Mountain (Edmonton)</name>
+ <id>America/Edmonton</id>
+ </entries>
+ <entries>
+ <name>Cambridge Bay</name>
+ <id>America/Cambridge_Bay</id>
+ </entries>
+ <entries>
+ <name>Central (Winnipeg)</name>
+ <id>America/Winnipeg</id>
+ </entries>
+ <entries>
+ <name>Pacific (Vancouver)</name>
+ <id>America/Vancouver</id>
+ </entries>
+ <entries>
+ <name>Atlantic (Halifax)</name>
+ <id>America/Halifax</id>
+ </entries>
+ </entries>
+ <central>America/Winnipeg</central>
+ </timezones>
+ <timezones>
+ <name>Central and South America</name>
+ <entries type="array">
+ <entries>
+ <name>Stanley</name>
+ <id>Atlantic/Stanley</id>
+ </entries>
+ <entries>
+ <name>Uruguay</name>
+ <id>America/Montevideo</id>
+ </entries>
+ <entries>
+ <name>Martinique</name>
+ <id>America/Martinique</id>
+ </entries>
+ <entries>
+ <name>Managua</name>
+ <id>America/Managua</id>
+ </entries>
+ <entries>
+ <name>La Paz</name>
+ <id>America/La_Paz</id>
+ </entries>
+ <entries>
+ <name>Grenada</name>
+ <id>America/Grenada</id>
+ </entries>
+ <entries>
+ <name>Cayman Islands</name>
+ <id>America/Cayman</id>
+ </entries>
+ <entries>
+ <name>Caracas</name>
+ <id>America/Caracas</id>
+ </entries>
+ <entries>
+ <name>Anguilla</name>
+ <id>America/Anguilla</id>
+ </entries>
+ <entries>
+ <name>Saint Lucia</name>
+ <id>America/St_Lucia</id>
+ </entries>
+ <entries>
+ <name>Costa Rica</name>
+ <id>America/Costa_Rica</id>
+ </entries>
+ <entries>
+ <name>Havana</name>
+ <id>America/Havana</id>
+ </entries>
+ <entries>
+ <name>Aruba</name>
+ <id>America/Aruba</id>
+ </entries>
+ <entries>
+ <name>St Thomas</name>
+ <id>America/St_Thomas</id>
+ </entries>
+ <entries>
+ <name>Port-au-Prince</name>
+ <id>America/Port-au-Prince</id>
+ </entries>
+ <entries>
+ <name>Guyana</name>
+ <id>America/Guyana</id>
+ </entries>
+ <entries>
+ <name>Guatemala</name>
+ <id>America/Guatemala</id>
+ </entries>
+ <entries>
+ <name>El Salvador</name>
+ <id>America/El_Salvador</id>
+ </entries>
+ <entries>
+ <name>Dominica</name>
+ <id>America/Dominica</id>
+ </entries>
+ <entries>
+ <name>Paramaribo</name>
+ <id>America/Paramaribo</id>
+ </entries>
+ <entries>
+ <name>Panama</name>
+ <id>America/Panama</id>
+ </entries>
+ <entries>
+ <name>Guayaquil</name>
+ <id>America/Guayaquil</id>
+ </entries>
+ <entries>
+ <name>Grand Turk</name>
+ <id>America/Grand_Turk</id>
+ </entries>
+ <entries>
+ <name>Bogota</name>
+ <id>America/Bogota</id>
+ </entries>
+ <entries>
+ <name>Belize</name>
+ <id>America/Belize</id>
+ </entries>
+ <entries>
+ <name>St Vincent</name>
+ <id>America/St_Vincent</id>
+ </entries>
+ <entries>
+ <name>Saint Kitts and Nevis</name>
+ <id>America/St_Kitts</id>
+ </entries>
+ <entries>
+ <name>Curacao</name>
+ <id>America/Curacao</id>
+ </entries>
+ <entries>
+ <name>Galapagos</name>
+ <id>Pacific/Galapagos</id>
+ </entries>
+ <entries>
+ <name>Puerto Rico</name>
+ <id>America/Puerto_Rico</id>
+ </entries>
+ <entries>
+ <name>Montserrat</name>
+ <id>America/Montserrat</id>
+ </entries>
+ <entries>
+ <name>Jamaica</name>
+ <id>America/Jamaica</id>
+ </entries>
+ <entries>
+ <name>Barbados</name>
+ <id>America/Barbados</id>
+ </entries>
+ <entries>
+ <name>Antigua</name>
+ <id>America/Antigua</id>
+ </entries>
+ <entries>
+ <name>Nassau</name>
+ <id>America/Nassau</id>
+ </entries>
+ <entries>
+ <name>Asuncion</name>
+ <id>America/Asuncion</id>
+ </entries>
+ <entries>
+ <name>Easter Island</name>
+ <id>Pacific/Easter</id>
+ </entries>
+ <entries>
+ <name>Tegucigalpa</name>
+ <id>America/Tegucigalpa</id>
+ </entries>
+ <entries>
+ <name>Lima</name>
+ <id>America/Lima</id>
+ </entries>
+ <entries>
+ <name>Guadeloupe</name>
+ <id>America/Guadeloupe</id>
+ </entries>
+ <entries>
+ <name>Tortola</name>
+ <id>America/Tortola</id>
+ </entries>
+ <entries>
+ <name>Santo Domingo</name>
+ <id>America/Santo_Domingo</id>
+ </entries>
+ <entries>
+ <name>Chile Continental</name>
+ <id>America/Santiago</id>
+ </entries>
+ <entries>
+ <name>Port of Spain</name>
+ <id>America/Port_of_Spain</id>
+ </entries>
+ <entries>
+ <name>Cayenne</name>
+ <id>America/Cayenne</id>
+ </entries>
+ </entries>
+ <central>America/La_Paz</central>
+ </timezones>
+ <timezones>
+ <name>Etc</name>
+ <entries type="array">
+ <entries>
+ <name>Zulu</name>
+ <id>Etc/Zulu</id>
+ </entries>
+ <entries>
+ <name>UTC</name>
+ <id>Etc/UTC</id>
+ </entries>
+ <entries>
+ <name>Greenwich</name>
+ <id>Etc/Greenwich</id>
+ </entries>
+ <entries>
+ <name>GMT-9</name>
+ <id>Etc/GMT-9</id>
+ </entries>
+ <entries>
+ <name>GMT-14</name>
+ <id>Etc/GMT-14</id>
+ </entries>
+ <entries>
+ <name>GMT+7</name>
+ <id>Etc/GMT+7</id>
+ </entries>
+ <entries>
+ <name>UCT</name>
+ <id>Etc/UCT</id>
+ </entries>
+ <entries>
+ <name>GMT-0</name>
+ <id>Etc/GMT-0</id>
+ </entries>
+ <entries>
+ <name>GMT+8</name>
+ <id>Etc/GMT+8</id>
+ </entries>
+ <entries>
+ <name>GMT-1</name>
+ <id>Etc/GMT-1</id>
+ </entries>
+ <entries>
+ <name>GMT+9</name>
+ <id>Etc/GMT+9</id>
+ </entries>
+ <entries>
+ <name>GMT-2</name>
+ <id>Etc/GMT-2</id>
+ </entries>
+ <entries>
+ <name>GMT+0</name>
+ <id>Etc/GMT+0</id>
+ </entries>
+ <entries>
+ <name>GMT-3</name>
+ <id>Etc/GMT-3</id>
+ </entries>
+ <entries>
+ <name>GMT+10</name>
+ <id>Etc/GMT+10</id>
+ </entries>
+ <entries>
+ <name>GMT+1</name>
+ <id>Etc/GMT+1</id>
+ </entries>
+ <entries>
+ <name>GMT-4</name>
+ <id>Etc/GMT-4</id>
+ </entries>
+ <entries>
+ <name>GMT+2</name>
+ <id>Etc/GMT+2</id>
+ </entries>
+ <entries>
+ <name>GMT+11</name>
+ <id>Etc/GMT+11</id>
+ </entries>
+ <entries>
+ <name>Universal</name>
+ <id>Etc/Universal</id>
+ </entries>
+ <entries>
+ <name>GMT0</name>
+ <id>Etc/GMT0</id>
+ </entries>
+ <entries>
+ <name>GMT-5</name>
+ <id>Etc/GMT-5</id>
+ </entries>
+ <entries>
+ <name>GMT-10</name>
+ <id>Etc/GMT-10</id>
+ </entries>
+ <entries>
+ <name>GMT+3</name>
+ <id>Etc/GMT+3</id>
+ </entries>
+ <entries>
+ <name>GMT+12</name>
+ <id>Etc/GMT+12</id>
+ </entries>
+ <entries>
+ <name>GMT-6</name>
+ <id>Etc/GMT-6</id>
+ </entries>
+ <entries>
+ <name>GMT-11</name>
+ <id>Etc/GMT-11</id>
+ </entries>
+ <entries>
+ <name>GMT+4</name>
+ <id>Etc/GMT+4</id>
+ </entries>
+ <entries>
+ <name>GMT-7</name>
+ <id>Etc/GMT-7</id>
+ </entries>
+ <entries>
+ <name>GMT-12</name>
+ <id>Etc/GMT-12</id>
+ </entries>
+ <entries>
+ <name>GMT+5</name>
+ <id>Etc/GMT+5</id>
+ </entries>
+ <entries>
+ <name>GMT-8</name>
+ <id>Etc/GMT-8</id>
+ </entries>
+ <entries>
+ <name>GMT-13</name>
+ <id>Etc/GMT-13</id>
+ </entries>
+ <entries>
+ <name>GMT+6</name>
+ <id>Etc/GMT+6</id>
+ </entries>
+ <entries>
+ <name>GMT</name>
+ <id>Etc/GMT</id>
+ </entries>
+ </entries>
+ <central>Etc/GMT</central>
+ </timezones>
+ <timezones>
+ <name>Europe</name>
+ <entries type="array">
+ <entries>
+ <name>Uzhgorod</name>
+ <id>Europe/Uzhgorod</id>
+ </entries>
+ <entries>
+ <name>Russia (Moscow)</name>
+ <id>Europe/Moscow</id>
+ </entries>
+ <entries>
+ <name>Jersey</name>
+ <id>Europe/Jersey</id>
+ </entries>
+ <entries>
+ <name>Belgium</name>
+ <id>Europe/Brussels</id>
+ </entries>
+ <entries>
+ <name>Netherlands</name>
+ <id>Europe/Amsterdam</id>
+ </entries>
+ <entries>
+ <name>Miquelon</name>
+ <id>America/Miquelon</id>
+ </entries>
+ <entries>
+ <name>Ukraine (Zaporozhye)</name>
+ <id>Europe/Zaporozhye</id>
+ </entries>
+ <entries>
+ <name>France</name>
+ <id>Europe/Paris</id>
+ </entries>
+ <entries>
+ <name>Norway</name>
+ <id>Europe/Oslo</id>
+ </entries>
+ <entries>
+ <name>Malta</name>
+ <id>Europe/Malta</id>
+ </entries>
+ <entries>
+ <name>Finland</name>
+ <id>Europe/Helsinki</id>
+ </entries>
+ <entries>
+ <name>Greece</name>
+ <id>Europe/Athens</id>
+ </entries>
+ <entries>
+ <name>Canary Islands</name>
+ <id>Atlantic/Canary</id>
+ </entries>
+ <entries>
+ <name>Macedonia</name>
+ <id>Europe/Skopje</id>
+ </entries>
+ <entries>
+ <name>Monaco</name>
+ <id>Europe/Monaco</id>
+ </entries>
+ <entries>
+ <name>Iceland</name>
+ <id>Atlantic/Reykjavik</id>
+ </entries>
+ <entries>
+ <name>San Marino</name>
+ <id>Europe/San_Marino</id>
+ </entries>
+ <entries>
+ <name>Italy</name>
+ <id>Europe/Rome</id>
+ </entries>
+ <entries>
+ <name>Portugal</name>
+ <id>Europe/Lisbon</id>
+ </entries>
+ <entries>
+ <name>Turkey</name>
+ <id>Europe/Istanbul</id>
+ </entries>
+ <entries>
+ <name>Ireland</name>
+ <id>Europe/Dublin</id>
+ </entries>
+ <entries>
+ <name>Slovakia</name>
+ <id>Europe/Bratislava</id>
+ </entries>
+ <entries>
+ <name>Germany</name>
+ <id>Europe/Berlin</id>
+ </entries>
+ <entries>
+ <name>Spain</name>
+ <id>Europe/Madrid</id>
+ </entries>
+ <entries>
+ <name>Isle of Man</name>
+ <id>Europe/Isle_of_Man</id>
+ </entries>
+ <entries>
+ <name>Guernsey</name>
+ <id>Europe/Guernsey</id>
+ </entries>
+ <entries>
+ <name>Denmark</name>
+ <id>Europe/Copenhagen</id>
+ </entries>
+ <entries>
+ <name>Switzerland</name>
+ <id>Europe/Zurich</id>
+ </entries>
+ <entries>
+ <name>Croatia</name>
+ <id>Europe/Zagreb</id>
+ </entries>
+ <entries>
+ <name>Estonia</name>
+ <id>Europe/Tallinn</id>
+ </entries>
+ <entries>
+ <name>Ukraine (Kiev)</name>
+ <id>Europe/Kiev</id>
+ </entries>
+ <entries>
+ <name>Poland</name>
+ <id>Europe/Warsaw</id>
+ </entries>
+ <entries>
+ <name>Lithuania</name>
+ <id>Europe/Vilnius</id>
+ </entries>
+ <entries>
+ <name>Vatican</name>
+ <id>Europe/Vatican</id>
+ </entries>
+ <entries>
+ <name>Czech Republic</name>
+ <id>Europe/Prague</id>
+ </entries>
+ <entries>
+ <name>Aaland Islands</name>
+ <id>Europe/Mariehamn</id>
+ </entries>
+ <entries>
+ <name>Russia (Kaliningrad)</name>
+ <id>Europe/Kaliningrad</id>
+ </entries>
+ <entries>
+ <name>Gibraltar</name>
+ <id>Europe/Gibraltar</id>
+ </entries>
+ <entries>
+ <name>Serbia</name>
+ <id>Europe/Belgrade</id>
+ </entries>
+ <entries>
+ <name>Austria</name>
+ <id>Europe/Vienna</id>
+ </entries>
+ <entries>
+ <name>Liechtenstein</name>
+ <id>Europe/Vaduz</id>
+ </entries>
+ <entries>
+ <name>Luxembourg</name>
+ <id>Europe/Luxembourg</id>
+ </entries>
+ <entries>
+ <name>Slovenia</name>
+ <id>Europe/Ljubljana</id>
+ </entries>
+ <entries>
+ <name>Andorra</name>
+ <id>Europe/Andorra</id>
+ </entries>
+ <entries>
+ <name>Azores</name>
+ <id>Atlantic/Azores</id>
+ </entries>
+ <entries>
+ <name>Ukraine (Simferopol)</name>
+ <id>Europe/Simferopol</id>
+ </entries>
+ <entries>
+ <name>Belarus</name>
+ <id>Europe/Minsk</id>
+ </entries>
+ <entries>
+ <name>United Kingdom</name>
+ <id>Europe/London</id>
+ </entries>
+ <entries>
+ <name>Romania</name>
+ <id>Europe/Bucharest</id>
+ </entries>
+ <entries>
+ <name>Russia (Volgograd)</name>
+ <id>Europe/Volgograd</id>
+ </entries>
+ <entries>
+ <name>Albania</name>
+ <id>Europe/Tirane</id>
+ </entries>
+ <entries>
+ <name>Sweden</name>
+ <id>Europe/Stockholm</id>
+ </entries>
+ <entries>
+ <name>Bulgaria</name>
+ <id>Europe/Sofia</id>
+ </entries>
+ <entries>
+ <name>Bosnia & Herzegovina</name>
+ <id>Europe/Sarajevo</id>
+ </entries>
+ <entries>
+ <name>Russia (Samara)</name>
+ <id>Europe/Samara</id>
+ </entries>
+ <entries>
+ <name>Latvia</name>
+ <id>Europe/Riga</id>
+ </entries>
+ <entries>
+ <name>Montenegro</name>
+ <id>Europe/Podgorica</id>
+ </entries>
+ <entries>
+ <name>Moldova</name>
+ <id>Europe/Chisinau</id>
+ </entries>
+ <entries>
+ <name>Hungary</name>
+ <id>Europe/Budapest</id>
+ </entries>
+ </entries>
+ <central>Europe/Prague</central>
+ </timezones>
+ <timezones>
+ <name>Global</name>
+ <entries type="array">
+ <entries>
+ <name>NZ</name>
+ <id>NZ</id>
+ </entries>
+ <entries>
+ <name>GMT+0</name>
+ <id>GMT+0</id>
+ </entries>
+ <entries>
+ <name>GMT0</name>
+ <id>GMT0</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Syowa)</name>
+ <id>Antarctica/Syowa</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Mawson)</name>
+ <id>Antarctica/Mawson</id>
+ </entries>
+ <entries>
+ <name>Navajo</name>
+ <id>Navajo</id>
+ </entries>
+ <entries>
+ <name>MST</name>
+ <id>MST</id>
+ </entries>
+ <entries>
+ <name>GMT</name>
+ <id>GMT</id>
+ </entries>
+ <entries>
+ <name>CST6CDT</name>
+ <id>CST6CDT</id>
+ </entries>
+ <entries>
+ <name>Arctic Longyearbyen</name>
+ <id>Arctic/Longyearbyen</id>
+ </entries>
+ <entries>
+ <name>Universal</name>
+ <id>Universal</id>
+ </entries>
+ <entries>
+ <name>UTC</name>
+ <id>UTC</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Casey)</name>
+ <id>Antarctica/Casey</id>
+ </entries>
+ <entries>
+ <name>PST8PDT</name>
+ <id>PST8PDT</id>
+ </entries>
+ <entries>
+ <name>NZ-CHAT</name>
+ <id>NZ-CHAT</id>
+ </entries>
+ <entries>
+ <name>Greenland (Thule)</name>
+ <id>America/Thule</id>
+ </entries>
+ <entries>
+ <name>Greenland (Nuuk)</name>
+ <id>America/Godthab</id>
+ </entries>
+ <entries>
+ <name>Zulu</name>
+ <id>Zulu</id>
+ </entries>
+ <entries>
+ <name>WET</name>
+ <id>WET</id>
+ </entries>
+ <entries>
+ <name>W-SU</name>
+ <id>W-SU</id>
+ </entries>
+ <entries>
+ <name>UCT</name>
+ <id>UCT</id>
+ </entries>
+ <entries>
+ <name>MET</name>
+ <id>MET</id>
+ </entries>
+ <entries>
+ <name>Greenwich</name>
+ <id>Greenwich</id>
+ </entries>
+ <entries>
+ <name>EST</name>
+ <id>EST</id>
+ </entries>
+ <entries>
+ <name>Greenland (Scoresbysund)</name>
+ <id>America/Scoresbysund</id>
+ </entries>
+ <entries>
+ <name>CET</name>
+ <id>CET</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Vostok)</name>
+ <id>Antarctica/Vostok</id>
+ </entries>
+ <entries>
+ <name>Antarctica (South Pole)</name>
+ <id>Antarctica/South_Pole</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Rothera)</name>
+ <id>Antarctica/Rothera</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Palmer)</name>
+ <id>Antarctica/Palmer</id>
+ </entries>
+ <entries>
+ <name>Antarctica (McMurdo)</name>
+ <id>Antarctica/McMurdo</id>
+ </entries>
+ <entries>
+ <name>MST7MDT</name>
+ <id>MST7MDT</id>
+ </entries>
+ <entries>
+ <name>HST</name>
+ <id>HST</id>
+ </entries>
+ <entries>
+ <name>EET</name>
+ <id>EET</id>
+ </entries>
+ <entries>
+ <name>Antarctica (DumontDUrville)</name>
+ <id>Antarctica/DumontDUrville</id>
+ </entries>
+ <entries>
+ <name>Antarctica (Davis)</name>
+ <id>Antarctica/Davis</id>
+ </entries>
+ <entries>
+ <name>Greenland (Danmarkshavn)</name>
+ <id>America/Danmarkshavn</id>
+ </entries>
+ <entries>
+ <name>GMT-0</name>
+ <id>GMT-0</id>
+ </entries>
+ <entries>
+ <name>EST5EDT</name>
+ <id>EST5EDT</id>
+ </entries>
+ </entries>
+ <central>America/Godthab</central>
+ </timezones>
+ <timezones>
+ <name>Indian Ocean</name>
+ <entries type="array">
+ <entries>
+ <name>Maldives</name>
+ <id>Indian/Maldives</id>
+ </entries>
+ <entries>
+ <name>Mauritius</name>
+ <id>Indian/Mauritius</id>
+ </entries>
+ <entries>
+ <name>Reunion</name>
+ <id>Indian/Reunion</id>
+ </entries>
+ <entries>
+ <name>Comoro</name>
+ <id>Indian/Comoro</id>
+ </entries>
+ <entries>
+ <name>Cocos Islands</name>
+ <id>Indian/Cocos</id>
+ </entries>
+ <entries>
+ <name>Mayotte</name>
+ <id>Indian/Mayotte</id>
+ </entries>
+ <entries>
+ <name>Mahe</name>
+ <id>Indian/Mahe</id>
+ </entries>
+ <entries>
+ <name>Chagos</name>
+ <id>Indian/Chagos</id>
+ </entries>
+ <entries>
+ <name>Kerguelen</name>
+ <id>Indian/Kerguelen</id>
+ </entries>
+ <entries>
+ <name>Christmas Island</name>
+ <id>Indian/Christmas</id>
+ </entries>
+ </entries>
+ <central>Indian/Maldives</central>
+ </timezones>
+ <timezones>
+ <name>Mexico</name>
+ <entries type="array">
+ <entries>
+ <name>Cancun</name>
+ <id>America/Cancun</id>
+ </entries>
+ <entries>
+ <name>Mazatlan</name>
+ <id>America/Mazatlan</id>
+ </entries>
+ <entries>
+ <name>Hermosillo</name>
+ <id>America/Hermosillo</id>
+ </entries>
+ <entries>
+ <name>Merida</name>
+ <id>America/Merida</id>
+ </entries>
+ <entries>
+ <name>Monterrey</name>
+ <id>America/Monterrey</id>
+ </entries>
+ <entries>
+ <name>Chihuahua</name>
+ <id>America/Chihuahua</id>
+ </entries>
+ <entries>
+ <name>Mexico City</name>
+ <id>America/Mexico_City</id>
+ </entries>
+ <entries>
+ <name>Tijuana</name>
+ <id>America/Tijuana</id>
+ </entries>
+ </entries>
+ <central>America/Mexico_City</central>
+ </timezones>
+ <timezones>
+ <name>Pacific</name>
+ <entries type="array">
+ <entries>
+ <name>Port_Moresby</name>
+ <id>Pacific/Port_Moresby</id>
+ </entries>
+ <entries>
+ <name>Palau</name>
+ <id>Pacific/Palau</id>
+ </entries>
+ <entries>
+ <name>Nauru</name>
+ <id>Pacific/Nauru</id>
+ </entries>
+ <entries>
+ <name>Guam</name>
+ <id>Pacific/Guam</id>
+ </entries>
+ <entries>
+ <name>Efate</name>
+ <id>Pacific/Efate</id>
+ </entries>
+ <entries>
+ <name>Gambier</name>
+ <id>Pacific/Gambier</id>
+ </entries>
+ <entries>
+ <name>Funafuti</name>
+ <id>Pacific/Funafuti</id>
+ </entries>
+ <entries>
+ <name>Fiji</name>
+ <id>Pacific/Fiji</id>
+ </entries>
+ <entries>
+ <name>Kosrae</name>
+ <id>Pacific/Kosrae</id>
+ </entries>
+ <entries>
+ <name>Chatham</name>
+ <id>Pacific/Chatham</id>
+ </entries>
+ <entries>
+ <name>Apia</name>
+ <id>Pacific/Apia</id>
+ </entries>
+ <entries>
+ <name>Wake</name>
+ <id>Pacific/Wake</id>
+ </entries>
+ <entries>
+ <name>Samoa</name>
+ <id>Pacific/Pago_Pago</id>
+ </entries>
+ <entries>
+ <name>Wallis</name>
+ <id>Pacific/Wallis</id>
+ </entries>
+ <entries>
+ <name>Pohnpei</name>
+ <id>Pacific/Ponape</id>
+ </entries>
+ <entries>
+ <name>New Zealand</name>
+ <id>Pacific/Auckland</id>
+ </entries>
+ <entries>
+ <name>Tongatapu</name>
+ <id>Pacific/Tongatapu</id>
+ </entries>
+ <entries>
+ <name>Tarawa</name>
+ <id>Pacific/Tarawa</id>
+ </entries>
+ <entries>
+ <name>Kiritimati</name>
+ <id>Pacific/Kiritimati</id>
+ </entries>
+ <entries>
+ <name>Guadalcanal</name>
+ <id>Pacific/Guadalcanal</id>
+ </entries>
+ <entries>
+ <name>Chuuk</name>
+ <id>Pacific/Truk</id>
+ </entries>
+ <entries>
+ <name>Midway</name>
+ <id>Pacific/Midway</id>
+ </entries>
+ <entries>
+ <name>Majuro</name>
+ <id>Pacific/Majuro</id>
+ </entries>
+ <entries>
+ <name>Kwajalein</name>
+ <id>Pacific/Kwajalein</id>
+ </entries>
+ <entries>
+ <name>Rarotonga</name>
+ <id>Pacific/Rarotonga</id>
+ </entries>
+ <entries>
+ <name>Noumea</name>
+ <id>Pacific/Noumea</id>
+ </entries>
+ <entries>
+ <name>Norfolk</name>
+ <id>Pacific/Norfolk</id>
+ </entries>
+ <entries>
+ <name>Niue</name>
+ <id>Pacific/Niue</id>
+ </entries>
+ <entries>
+ <name>Enderbury</name>
+ <id>Pacific/Enderbury</id>
+ </entries>
+ <entries>
+ <name>Tahiti</name>
+ <id>Pacific/Tahiti</id>
+ </entries>
+ <entries>
+ <name>Pitcairn</name>
+ <id>Pacific/Pitcairn</id>
+ </entries>
+ <entries>
+ <name>Saipan</name>
+ <id>Pacific/Saipan</id>
+ </entries>
+ <entries>
+ <name>Marquesas</name>
+ <id>Pacific/Marquesas</id>
+ </entries>
+ <entries>
+ <name>Johnston</name>
+ <id>Pacific/Johnston</id>
+ </entries>
+ <entries>
+ <name>Fakaofo</name>
+ <id>Pacific/Fakaofo</id>
+ </entries>
+ <entries>
+ <name>Dili</name>
+ <id>Pacific/Dili</id>
+ </entries>
+ </entries>
+ <central>Pacific/Tahiti</central>
+ </timezones>
+ <timezones>
+ <name>Russia</name>
+ <entries type="array">
+ <entries>
+ <name>Moscow</name>
+ <id>Europe/Moscow</id>
+ </entries>
+ <entries>
+ <name>Yekaterinburg</name>
+ <id>Asia/Yekaterinburg</id>
+ </entries>
+ <entries>
+ <name>Sakhalin</name>
+ <id>Asia/Sakhalin</id>
+ </entries>
+ <entries>
+ <name>Kamchatka</name>
+ <id>Asia/Kamchatka</id>
+ </entries>
+ <entries>
+ <name>Irkutsk</name>
+ <id>Asia/Irkutsk</id>
+ </entries>
+ <entries>
+ <name>Yakutsk</name>
+ <id>Asia/Yakutsk</id>
+ </entries>
+ <entries>
+ <name>Vladivostok</name>
+ <id>Asia/Vladivostok</id>
+ </entries>
+ <entries>
+ <name>Anadyr</name>
+ <id>Asia/Anadyr</id>
+ </entries>
+ <entries>
+ <name>Omsk</name>
+ <id>Asia/Omsk</id>
+ </entries>
+ <entries>
+ <name>Kaliningrad</name>
+ <id>Europe/Kaliningrad</id>
+ </entries>
+ <entries>
+ <name>Novosibirsk</name>
+ <id>Asia/Novosibirsk</id>
+ </entries>
+ <entries>
+ <name>Krasnoyarsk</name>
+ <id>Asia/Krasnoyarsk</id>
+ </entries>
+ <entries>
+ <name>Magadan</name>
+ <id>Asia/Magadan</id>
+ </entries>
+ <entries>
+ <name>Volgograd</name>
+ <id>Europe/Volgograd</id>
+ </entries>
+ <entries>
+ <name>Samara</name>
+ <id>Europe/Samara</id>
+ </entries>
+ </entries>
+ <central>Asia/Novosibirsk</central>
+ </timezones>
+ <timezones>
+ <name>USA</name>
+ <entries type="array">
+ <entries>
+ <name>Hawaii (Honolulu)</name>
+ <id>Pacific/Honolulu</id>
+ </entries>
+ <entries>
+ <name>Central (Chicago)</name>
+ <id>America/Chicago</id>
+ </entries>
+ <entries>
+ <name>Alaska (Anchorage)</name>
+ <id>America/Anchorage</id>
+ </entries>
+ <entries>
+ <name>Kentucky (Monticello)</name>
+ <id>America/Kentucky/Monticello</id>
+ </entries>
+ <entries>
+ <name>Juneau</name>
+ <id>America/Juneau</id>
+ </entries>
+ <entries>
+ <name>Indiana (Petersburg)</name>
+ <id>America/Indiana/Petersburg</id>
+ </entries>
+ <entries>
+ <name>East Indiana (Indianapolis)</name>
+ <id>America/Indiana/Indianapolis</id>
+ </entries>
+ <entries>
+ <name>Shiprock</name>
+ <id>America/Shiprock</id>
+ </entries>
+ <entries>
+ <name>Pacific (Los Angeles)</name>
+ <id>America/Los_Angeles</id>
+ </entries>
+ <entries>
+ <name>Indiana (Marengo)</name>
+ <id>America/Indiana/Marengo</id>
+ </entries>
+ <entries>
+ <name>Samoa (Pago Pago)</name>
+ <id>Pacific/Pago_Pago</id>
+ </entries>
+ <entries>
+ <name>Virgin Islands (St Thomas)</name>
+ <id>America/St_Thomas</id>
+ </entries>
+ <entries>
+ <name>North Dakota (New Salem)</name>
+ <id>America/North_Dakota/New_Salem</id>
+ </entries>
+ <entries>
+ <name>Indiana (Vevay)</name>
+ <id>America/Indiana/Vevay</id>
+ </entries>
+ <entries>
+ <name>Mountain (Denver)</name>
+ <id>America/Denver</id>
+ </entries>
+ <entries>
+ <name>Menominee</name>
+ <id>America/Menominee</id>
+ </entries>
+ <entries>
+ <name>Indiana (Winamac)</name>
+ <id>America/Indiana/Winamac</id>
+ </entries>
+ <entries>
+ <name>Boise</name>
+ <id>America/Boise</id>
+ </entries>
+ <entries>
+ <name>Arizona (Phoenix)</name>
+ <id>America/Phoenix</id>
+ </entries>
+ <entries>
+ <name>Indiana (Vincennes)</name>
+ <id>America/Indiana/Vincennes</id>
+ </entries>
+ <entries>
+ <name>Aleutian (Adak)</name>
+ <id>America/Adak</id>
+ </entries>
+ <entries>
+ <name>Eastern (New York)</name>
+ <id>America/New_York</id>
+ </entries>
+ <entries>
+ <name>Michigan (Detroit)</name>
+ <id>America/Detroit</id>
+ </entries>
+ <entries>
+ <name>Puerto Rico</name>
+ <id>America/Puerto_Rico</id>
+ </entries>
+ <entries>
+ <name>Nome</name>
+ <id>America/Nome</id>
+ </entries>
+ <entries>
+ <name>Kentucky (Louisville)</name>
+ <id>America/Kentucky/Louisville</id>
+ </entries>
+ <entries>
+ <name>Yakutat</name>
+ <id>America/Yakutat</id>
+ </entries>
+ <entries>
+ <name>North Dakota (Center)</name>
+ <id>America/North_Dakota/Center</id>
+ </entries>
+ <entries>
+ <name>Indiana Starke (Knox)</name>
+ <id>America/Indiana/Knox</id>
+ </entries>
+ <entries>
+ <name>Indiana (Tell City)</name>
+ <id>America/Indiana/Tell_City</id>
+ </entries>
+ </entries>
+ <central>America/Chicago</central>
+ </timezones>
+ </timezones>
+ <timezone>Europe/Prague</timezone>
+ <time>12:18:00</time>
+ <utcstatus type="boolean">false</utcstatus>
+ <date>07/02/2009</date>
+</systemtime>
diff --git a/plugins/systemtime/test/functional/systemtime_controller_test.rb b/plugins/systemtime/test/functional/systemtime_controller_test.rb
index 70e2995..5fa63d5 100644
--- a/plugins/systemtime/test/functional/systemtime_controller_test.rb
+++ b/plugins/systemtime/test/functional/systemtime_controller_test.rb
@@ -2,148 +2,57 @@ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
require 'test/unit'
require File.expand_path( File.join("test","validation_assert"), RailsParent.parent )
require 'mocha'
+require 'yast_mock'
class SystemtimeControllerTest < ActionController::TestCase
-
- class Proxy
- attr_accessor :result, :permissions, :timeout
- def find
- return result
- end
- end
-
- class NtpProxy
- attr_accessor :result, :permissions, :timeout
- def find
- return result
- end
- end
-
- class Ntp
- attr_accessor :synchronize, :synchronize_utc
-
- def initialize
- @synchronize = false
- @synchronize_utc = true
- end
-
- def save
- end
- end
-
- class Region
- attr_accessor :name, :central, :entries
- def initialize (name, central, entries)
- @name = name
- @central = central
- @entries = entries
- end
- end
-
- class Entry
- attr_accessor :id, :name
- def initialize (id,name)
- @id = id
- @name = name
- end
- end
-
-
-
- class Result
- attr_accessor :time, :date, :timezone, :utcstatus, :timezones, :saved
-
- def fill
- @timezones = [
- Region.new("Europe","Europe/Prague",[ Entry.new("Europe/Prague","Czech Republic" )])
-]
- @time = "12:18:00"
- @date = "07/02/2009"
- @utcstatus = false
- @timezone = "Europe/Prague"
- end
-
- def save
- @saved = true
- end
- end
-
+
def setup
SystemtimeController.any_instance.stubs(:login_required)
@controller = SystemtimeController.new
@request = ActionController::TestRequest.new
# http://railsforum.com/viewtopic.php?id=1719
@request.session[:account_id] = 1 # defined in fixtures
- @permissions = { :read => true, :write => true }
- @result = Result.new
- @result.fill
- @proxy = Proxy.new
- @proxy.permissions = @permissions
- @proxy.result = @result
+ response_time = IO.read(File.join(File.dirname(__FILE__),"..","fixtures","success.xml"))
+ response_ntp = IO.read(File.join(File.dirname(__FILE__),"..","fixtures","ntp.xml"))
+ ActiveResource::HttpMock.set_authentification
+ ActiveResource::HttpMock.respond_to do |mock|
+ header = ActiveResource::HttpMock.authentification_header
+ mock.resources :"org.opensuse.yast.modules.yapi.time" => "/systemtime", :"org.opensuse.yast.modules.yapi.ntp" => "/ntp"
+ mock.permissions "org.opensuse.yast.modules.yapi.time", { :read => true, :write => true }
+ mock.permissions "org.opensuse.yast.modules.yapi.ntp", { :available => true, :synchronize => true }
+ mock.get "/systemtime.xml", header, response_time, 200
+ mock.post "/systemtime.xml", header, response_time, 200
+ mock.get "/ntp.xml", header, response_ntp, 200
+ mock.post "/ntp.xml", header, response_ntp, 200
+ end
end
def test_index
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.time').returns(@proxy)
-#debugger
- get :index
- assert_response :success
- assert_valid_markup
- assert assigns(:permissions)
- assert assigns(:permissions)[:read]
- assert assigns(:permissions)[:write]
- assert assigns(:time)
- assert assigns(:date)
- assert_equal assigns(:timezone), "Europe/Prague"
- end
-
- def test_access_without_write_permissions
- @permissions[:write] = false
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.time').returns(@proxy)
-
get :index
-
assert_response :success
assert_valid_markup
- assert assigns(:permissions)
- assert assigns(:permissions)[:read]
- assert !assigns(:permissions)[:write]
- assert assigns(:time)
+ assert assigns(:stime)
end
-
def test_commit
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.time').returns(@proxy)
- post :update, { :currenttime => "2009-07-02 - 12:18:00", :date => { :date => "2009-07-02 - 12:18:00/2009-07-02 - 12:18:00" } }
+ post :update, { :currenttime => "12:18:00", :date => { :date => "2009-07-02" } }
assert_response :redirect
assert_redirected_to :controller => "controlpanel", :action => "index"
-
- assert @result.saved
- assert_equal false,@result.utcstatus
end
def test_commit_wizard
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.time').returns(@proxy)
session[:wizard_current] = "test"
session[:wizard_steps] = "systemtime,language"
- post :update, { :currenttime => "2009-07-02 - 12:18:00", :date => { :date => "2009-07-02 - 12:18:00/2009-07-02 - 12:18:00" }}
+ post :update, { :currenttime => "12:18:00", :date => { :date => "2009-07-02" }}
assert_response :redirect
assert_redirected_to :controller => "controlpanel", :action => "nextstep"
-
- assert @result.saved
- assert_equal false, @result.utcstatus
end
- def test_ntp_force
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.time').returns(@proxy)
- ntpproxy = NtpProxy.new
- ntpproxy.result = Ntp.new
- YaST::ServiceResource.stubs(:proxy_for).with('org.opensuse.yast.modules.yapi.ntp').returns(ntpproxy)
+ def test_ntp
post :update, { :timeconfig => "ntp_sync" }
assert_response :redirect
assert_redirected_to :controller => "controlpanel", :action => "index"
- assert ntpproxy.result.synchronize
- assert !ntpproxy.result.synchronize_utc
end
end
diff --git a/webclient/lib/yast_model/base.rb b/webclient/lib/yast_model/base.rb
index c1f0adf..a968e18 100644
--- a/webclient/lib/yast_model/base.rb
+++ b/webclient/lib/yast_model/base.rb
@@ -7,8 +7,8 @@ module YastModel
def site
ret = super
- if ret.nil? || ret != URI.parse(YaST::ServiceResource::Session.site) ||
- password != YaST::ServiceResource::Session.auth_token
+ if ret.nil? || ret != URI.parse(YaST::ServiceResource::Session.site) || password != YaST::ServiceResource::Session.auth_token
+ Rails.logger.debug "set new site for interface #{@interface}"
set_site
end
return super
--
To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org
For additional commands, e-mail: yast-commit+help@opensuse.org