summaryrefslogtreecommitdiffstats
path: root/library
diff options
context:
space:
mode:
Diffstat (limited to 'library')
-rw-r--r--library/auto.tcl26
-rw-r--r--library/clock.tcl10
-rw-r--r--library/cookiejar/cookiejar.tcl9
-rw-r--r--library/cookiejar/idna.tcl20
-rw-r--r--library/dde/pkgIndex.tcl6
-rw-r--r--library/history.tcl2
-rw-r--r--library/http/http.tcl125
-rw-r--r--library/http/pkgIndex.tcl2
-rw-r--r--library/init.tcl64
-rw-r--r--library/install.tcl9
-rw-r--r--library/manifest.txt10
-rw-r--r--library/msgcat/msgcat.tcl28
-rw-r--r--library/msgcat/pkgIndex.tcl2
-rw-r--r--library/opt/optparse.tcl6
-rw-r--r--library/opt/pkgIndex.tcl2
-rw-r--r--library/package.tcl17
-rw-r--r--library/parray.tcl4
-rw-r--r--library/platform/pkgIndex.tcl2
-rw-r--r--library/platform/platform.tcl5
-rwxr-xr-xlibrary/reg/pkgIndex.tcl9
-rw-r--r--library/registry/pkgIndex.tcl4
-rw-r--r--library/safe.tcl593
-rw-r--r--library/tclIndex2
-rw-r--r--library/tcltest/pkgIndex.tcl2
-rw-r--r--library/tcltest/tcltest.tcl77
-rw-r--r--library/tm.tcl19
-rw-r--r--library/tzdata/Africa/Algiers2
-rw-r--r--library/tzdata/Africa/Casablanca44
-rw-r--r--library/tzdata/Africa/El_Aaiun44
-rw-r--r--library/tzdata/America/Dawson160
-rw-r--r--library/tzdata/America/Godthab247
-rw-r--r--library/tzdata/America/Nuuk246
-rw-r--r--library/tzdata/America/Whitehorse160
-rw-r--r--library/tzdata/Antarctica/Casey5
-rw-r--r--library/tzdata/Antarctica/Macquarie181
-rw-r--r--library/tzdata/Asia/Gaza188
-rw-r--r--library/tzdata/Asia/Hebron188
-rw-r--r--library/tzdata/Asia/Shanghai2
-rw-r--r--library/tzdata/Europe/Budapest45
-rw-r--r--library/tzdata/Europe/Monaco4
-rw-r--r--library/tzdata/Europe/Paris4
-rw-r--r--library/tzdata/Pacific/Fiji2
-rw-r--r--library/word.tcl10
43 files changed, 1370 insertions, 1217 deletions
diff --git a/library/auto.tcl b/library/auto.tcl
index 7ef5681..7c9f38c 100644
--- a/library/auto.tcl
+++ b/library/auto.tcl
@@ -3,8 +3,8 @@
# utility procs formerly in init.tcl dealing with auto execution of commands
# and can be auto loaded themselves.
#
-# Copyright (c) 1991-1993 The Regents of the University of California.
-# Copyright (c) 1994-1998 Sun Microsystems, Inc.
+# Copyright © 1991-1993 The Regents of the University of California.
+# Copyright © 1994-1998 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -265,6 +265,7 @@ proc auto_mkindex {dir args} {
auto_mkindex_parser::cleanup
set fid [open "tclIndex" w]
+ fconfigure $fid -translation lf
puts -nonewline $fid $index
close $fid
cd $oldDir
@@ -291,6 +292,7 @@ proc auto_mkindex_old {dir args} {
set f ""
set error [catch {
set f [open $file]
+ fconfigure $f -eofchar \032
while {[gets $f line] >= 0} {
if {[regexp {^proc[ ]+([^ ]*)} $line match procName]} {
set procName [lindex [auto_qualify $procName "::"] 0]
@@ -309,6 +311,7 @@ proc auto_mkindex_old {dir args} {
set f ""
set error [catch {
set f [open tclIndex w]
+ fconfigure $f -translation lf
puts -nonewline $f $index
close $f
cd $oldDir
@@ -401,6 +404,7 @@ proc auto_mkindex_parser::mkindex {file} {
set scriptFile $file
set fid [open $file]
+ fconfigure $fid -eofchar \032
set contents [read $fid]
close $fid
@@ -427,10 +431,10 @@ proc auto_mkindex_parser::mkindex {file} {
# auto_mkindex_parser::hook command
#
-# Registers a Tcl command to evaluate when initializing the slave interpreter
-# used by the mkindex parser. The command is evaluated in the master
+# Registers a Tcl command to evaluate when initializing the child interpreter
+# used by the mkindex parser. The command is evaluated in the parent
# interpreter, and can use the variable auto_mkindex_parser::parser to get to
-# the slave
+# the child
proc auto_mkindex_parser::hook {cmd} {
variable initCommands
@@ -438,16 +442,16 @@ proc auto_mkindex_parser::hook {cmd} {
lappend initCommands $cmd
}
-# auto_mkindex_parser::slavehook command
+# auto_mkindex_parser::childhook command
#
-# Registers a Tcl command to evaluate when initializing the slave interpreter
-# used by the mkindex parser. The command is evaluated in the slave
+# Registers a Tcl command to evaluate when initializing the child interpreter
+# used by the mkindex parser. The command is evaluated in the child
# interpreter.
-proc auto_mkindex_parser::slavehook {cmd} {
+proc auto_mkindex_parser::childhook {cmd} {
variable initCommands
- # The $parser variable is defined to be the name of the slave interpreter
+ # The $parser variable is defined to be the name of the child interpreter
# when this command is used later.
lappend initCommands "\$parser eval [list $cmd]"
@@ -601,7 +605,7 @@ auto_mkindex_parser::command proc {name args} {
# Conditionally add support for Tcl byte code files. There are some tricky
# details here. First, we need to get the tbcload library initialized in the
-# current interpreter. We cannot load tbcload into the slave until we have
+# current interpreter. We cannot load tbcload into the child until we have
# done so because it needs access to the tcl_patchLevel variable. Second,
# because the package index file may defer loading the library until we invoke
# a command, we need to explicitly invoke auto_load to force it to be loaded.
diff --git a/library/clock.tcl b/library/clock.tcl
index 8e4b657..150ae3c 100644
--- a/library/clock.tcl
+++ b/library/clock.tcl
@@ -9,7 +9,7 @@
#
#----------------------------------------------------------------------
#
-# Copyright (c) 2004,2005,2006,2007 by Kevin B. Kenny
+# Copyright © 2004-2007 Kevin B. Kenny
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
@@ -3304,7 +3304,7 @@ proc ::tcl::clock::LoadTimeZoneFile { fileName } {
return
}
- # Since an unsafe interp uses the [clock] command in the master, this code
+ # Since an unsafe interp uses the [clock] command in the parent, this code
# is security sensitive. Make sure that the path name cannot escape the
# given directory.
@@ -3314,7 +3314,7 @@ proc ::tcl::clock::LoadTimeZoneFile { fileName } {
"time zone \":$fileName\" not valid"
}
try {
- source -encoding utf-8 [file join $DataDir $fileName]
+ source [file join $DataDir $fileName]
} on error {} {
return -code error \
-errorcode [list CLOCK badTimeZone :$fileName] \
@@ -3344,7 +3344,7 @@ proc ::tcl::clock::LoadTimeZoneFile { fileName } {
proc ::tcl::clock::LoadZoneinfoFile { fileName } {
variable ZoneinfoPaths
- # Since an unsafe interp uses the [clock] command in the master, this code
+ # Since an unsafe interp uses the [clock] command in the parent, this code
# is security sensitive. Make sure that the path name cannot escape the
# given directory.
@@ -3452,7 +3452,7 @@ proc ::tcl::clock::ReadZoneinfoFile {fileName fname} {
set times [linsert $times 0 $MINWIDE]
set codes {}
foreach c $tempCodes {
- lappend codes [expr { $c & 0xff }]
+ lappend codes [expr { $c & 0xFF }]
}
set codes [linsert $codes 0 0]
diff --git a/library/cookiejar/cookiejar.tcl b/library/cookiejar/cookiejar.tcl
index c8b495a..cfa73ae 100644
--- a/library/cookiejar/cookiejar.tcl
+++ b/library/cookiejar/cookiejar.tcl
@@ -98,7 +98,8 @@ namespace eval [info object namespace ::http::cookiejar] {
}
proc splitPath path {
set pieces [split [string trimleft $path "/"] "/"]
- for {set j -1} {$j < [llength $pieces]} {incr j} {
+ set result /
+ for {set j 0} {$j < [llength $pieces]} {incr j} {
lappend result /[join [lrange $pieces 0 $j] "/"]
}
return $result
@@ -131,7 +132,7 @@ package provide cookiejar \
# The implementation of the cookiejar package
::oo::define ::http::cookiejar {
self {
- method configure {{optionName "\u0000\u0000"} {optionValue "\u0000\u0000"}} {
+ method configure {{optionName "\x00\x00"} {optionValue "\x00\x00"}} {
set tbl {
-domainfile {domainfile set}
-domainlist {domainlist set}
@@ -148,14 +149,14 @@ package provide cookiejar \
dict lappend tbl -purgeold [namespace code {
my IntervalTrigger PostponePurge
}]
- if {$optionName eq "\u0000\u0000"} {
+ if {$optionName eq "\x00\x00"} {
return [dict keys $tbl]
}
set opt [::tcl::prefix match -message "option" \
[dict keys $tbl] $optionName]
set setter [lassign [dict get $tbl $opt] varname]
namespace upvar [namespace current] $varname var
- if {$optionValue ne "\u0000\u0000"} {
+ if {$optionValue ne "\x00\x00"} {
{*}$setter var $optionValue
}
return $var
diff --git a/library/cookiejar/idna.tcl b/library/cookiejar/idna.tcl
index 1ab9fc4..658dcd6 100644
--- a/library/cookiejar/idna.tcl
+++ b/library/cookiejar/idna.tcl
@@ -7,7 +7,7 @@
#
# This implementation includes code from that RFC, translated to Tcl; the
# other parts are:
-# Copyright (c) 2014 Donal K. Fellows
+# Copyright © 2014 Donal K. Fellows
#
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -27,9 +27,9 @@ namespace eval ::tcl::idna {
proc IDNAencode hostname {
set parts {}
# Split term from RFC 3490, Sec 3.1
- foreach part [split $hostname "\u002E\u3002\uFF0E\uFF61"] {
+ foreach part [split $hostname "\x2E\u3002\uFF0E\uFF61"] {
if {[regexp {[^-A-Za-z0-9]} $part]} {
- if {[regexp {[^-A-Za-z0-9\u00a1-\uffff]} $part ch]} {
+ if {[regexp {[^-A-Za-z0-9\xA1-\uFFFF]} $part ch]} {
scan $ch %c c
if {$ch < "!" || $ch > "~"} {
set ch [format "\\u%04x" $c]
@@ -51,7 +51,7 @@ namespace eval ::tcl::idna {
proc IDNAdecode hostname {
set parts {}
# Split term from RFC 3490, Sec 3.1
- foreach part [split $hostname "\u002E\u3002\uFF0E\uFF61"] {
+ foreach part [split $hostname "\x2E\u3002\uFF0E\uFF61"] {
if {[string match -nocase "xn--*" $part]} {
set part [punydecode [string range $part 4 end]]
}
@@ -116,7 +116,7 @@ namespace eval ::tcl::idna {
# Handle the basic code points:
foreach ch $string {
- if {$ch < "\u0080"} {
+ if {$ch < "\x80"} {
if {$case eq ""} {
append output $ch
} elseif {[string is true $case]} {
@@ -152,14 +152,14 @@ namespace eval ::tcl::idna {
# Increase delta enough to advance the decoder's <n,i> state to
# <m,0>, but guard against overflow:
- if {$m-$n > (0xffffffff-$delta)/($h+1)} {
+ if {$m-$n > (0xFFFFFFFF-$delta)/($h+1)} {
throw {PUNYCODE OVERFLOW} "overflow in delta computation"
}
incr delta [expr {($m-$n) * ($h+1)}]
set n $m
foreach ch $in {
- if {$ch < $n && ([incr delta] & 0xffffffff) == 0} {
+ if {$ch < $n && ([incr delta] & 0xFFFFFFFF) == 0} {
throw {PUNYCODE OVERFLOW} "overflow in delta computation"
}
@@ -251,7 +251,7 @@ namespace eval ::tcl::idna {
set first 0
break
}
- if {[set w [expr {$w * ($base - $t)}]] > 0x7fffffff} {
+ if {[set w [expr {$w * ($base - $t)}]] > 0x7FFFFFFF} {
throw {PUNYCODE OVERFLOW} \
"excessively large integer computed in digit decode"
}
@@ -261,11 +261,11 @@ namespace eval ::tcl::idna {
# i was supposed to wrap around from out+1 to 0, incrementing n
# each time, so we'll fix that now:
- if {[incr n [expr {$i / $out}]] > 0x7fffffff} {
+ if {[incr n [expr {$i / $out}]] > 0x7FFFFFFF} {
throw {PUNYCODE OVERFLOW} \
"excessively large integer computed in character choice"
} elseif {$n > $max_codepoint} {
- if {$n >= 0x00d800 && $n < 0x00e000} {
+ if {$n >= 0x00D800 && $n < 0x00E000} {
# Bare surrogate?!
throw {PUNYCODE NON_BMP} \
[format "unsupported character U+%06x" $n]
diff --git a/library/dde/pkgIndex.tcl b/library/dde/pkgIndex.tcl
index e8917ac..14f22a4 100644
--- a/library/dde/pkgIndex.tcl
+++ b/library/dde/pkgIndex.tcl
@@ -1,7 +1,3 @@
if {![package vsatisfies [package provide Tcl] 8.5-]} return
if {[info sharedlibextension] != ".dll"} return
-if {[::tcl::pkgconfig get debug]} {
- package ifneeded dde 1.4.3 [list load [file join $dir tcldde14g.dll] dde]
-} else {
- package ifneeded dde 1.4.3 [list load [file join $dir tcldde14.dll] dde]
-}
+package ifneeded dde 1.4.3 [list load [file join $dir tcldde14.dll]]
diff --git a/library/history.tcl b/library/history.tcl
index ef9099b..4867021 100644
--- a/library/history.tcl
+++ b/library/history.tcl
@@ -2,7 +2,7 @@
#
# Implementation of the history command.
#
-# Copyright (c) 1997 Sun Microsystems, Inc.
+# Copyright © 1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
diff --git a/library/http/http.tcl b/library/http/http.tcl
index baa3caa..df8fe2d 100644
--- a/library/http/http.tcl
+++ b/library/http/http.tcl
@@ -11,7 +11,7 @@
package require Tcl 8.6-
# Keep this in sync with pkgIndex.tcl and with the install directories in
# Makefiles
-package provide http 2.9.1
+package provide http 2.10.0a1
namespace eval http {
# Allow resourcing to not clobber existing data
@@ -544,7 +544,7 @@ proc http::CloseSocket {s {token {}}} {
} else {
set map [array get socketMapping]
set ndx [lsearch -exact $map $s]
- if {$ndx != -1} {
+ if {$ndx >= 0} {
incr ndx -1
set connId [lindex $map $ndx]
}
@@ -734,7 +734,7 @@ proc http::geturl {url args} {
body {}
status ""
http ""
- connection close
+ connection keep-alive
}
set state(-keepalive) $defaultKeepalive
set state(-strict) $strict
@@ -746,6 +746,7 @@ proc http::geturl {url args} {
-strict boolean
-timeout integer
-validate boolean
+ -headers dict
}
set state(charset) $defaultCharset
set options {
@@ -759,9 +760,8 @@ proc http::geturl {url args} {
foreach {flag value} $args {
if {[regexp -- $pat $flag]} {
# Validate numbers
- if {
- [info exists type($flag)] &&
- ![string is $type($flag) -strict $value]
+ if {($flag eq "-headers") ? [catch {dict size $value}] :
+ ([info exists type($flag)] && ![string is $type($flag) -strict $value])
} {
unset $token
return -code error \
@@ -983,6 +983,18 @@ proc http::geturl {url args} {
set state(-pipeline) $http(-pipeline)
}
+ # We cannot handle chunked encodings with -handler, so force HTTP/1.0
+ # until we can manage this.
+ if {[info exists state(-handler)]} {
+ set state(-protocol) 1.0
+ }
+
+ # RFC 7320 A.1 - HTTP/1.0 Keep-Alive is problematic. We do not support it.
+ if {$state(-protocol) eq "1.0"} {
+ set state(connection) close
+ set state(-keepalive) 0
+ }
+
# See if we are supposed to use a previously opened channel.
# - In principle, ANY call to http::geturl could use a previously opened
# channel if it is available - the "Connection: keep-alive" header is a
@@ -1054,7 +1066,7 @@ proc http::geturl {url args} {
}
# Do not automatically close the connection socket.
- set state(connection) {}
+ set state(connection) keep-alive
}
}
@@ -1349,19 +1361,12 @@ proc http::Connected {token proto phost srvurl} {
set how POST
# The query channel must be blocking for the async Write to
# work properly.
- lassign [fconfigure $sock -translation] trRead trWrite
- fconfigure $state(-querychannel) -blocking 1 \
- -translation [list $trRead binary]
+ fconfigure $state(-querychannel) -blocking 1 -translation binary
set contDone 0
}
if {[info exists state(-method)] && ($state(-method) ne "")} {
set how $state(-method)
}
- # We cannot handle chunked encodings with -handler, so force HTTP/1.0
- # until we can manage this.
- if {[info exists state(-handler)]} {
- set state(-protocol) 1.0
- }
set accept_types_seen 0
Log ^B$tk begin sending request - token $token
@@ -1384,7 +1389,7 @@ proc http::Connected {token proto phost srvurl} {
puts $sock "Host: $host:$port"
}
puts $sock "User-Agent: $http(-useragent)"
- if {($state(-protocol) >= 1.0) && $state(-keepalive)} {
+ if {($state(-protocol) > 1.0) && $state(-keepalive)} {
# Send this header, because a 1.1 server is not compelled to treat
# this as the default.
puts $sock "Connection: keep-alive"
@@ -1392,9 +1397,17 @@ proc http::Connected {token proto phost srvurl} {
if {($state(-protocol) > 1.0) && !$state(-keepalive)} {
puts $sock "Connection: close" ;# RFC2616 sec 8.1.2.1
}
- if {[info exists phost] && ($phost ne "") && $state(-keepalive)} {
- puts $sock "Proxy-Connection: Keep-Alive"
- }
+ if {($state(-protocol) < 1.1)} {
+ # RFC7230 A.1
+ # Some server implementations of HTTP/1.0 have a faulty
+ # implementation of RFC 2068 Keep-Alive.
+ # Don't leave this to chance.
+ # For HTTP/1.0 we have already "set state(connection) close"
+ # and "state(-keepalive) 0".
+ puts $sock "Connection: close"
+ }
+ # RFC7230 A.1 - "clients are encouraged not to send the
+ # Proxy-Connection header field in any requests"
set accept_encoding_seen 0
set content_type_seen 0
dict for {key value} $state(-headers) {
@@ -1670,9 +1683,51 @@ proc http::ReceiveResponse {token} {
Log ^D$tk begin receiving response - token $token
coroutine ${token}EventCoroutine http::Event $sock $token
- fileevent $sock readable ${token}EventCoroutine
+ if {[info exists state(-handler)] || [info exists state(-progress)]} {
+ fileevent $sock readable [list http::EventGateway $sock $token]
+ } else {
+ fileevent $sock readable ${token}EventCoroutine
+ }
+ return
+}
+
+
+# http::EventGateway
+#
+# Bug [c2dc1da315].
+# - Recursive launch of the coroutine can occur if a -handler or -progress
+# callback is used, and the callback command enters the event loop.
+# - To prevent this, the fileevent "binding" is disabled while the
+# coroutine is in flight.
+# - If a recursive call occurs despite these precautions, it is not
+# trapped and discarded here, because it is better to report it as a
+# bug.
+# - Although this solution is believed to be sufficiently general, it is
+# used only if -handler or -progress is specified. In other cases,
+# the coroutine is called directly.
+
+proc http::EventGateway {sock token} {
+ variable $token
+ upvar 0 $token state
+ fileevent $sock readable {}
+ catch {${token}EventCoroutine} res opts
+ if {[info commands ${token}EventCoroutine] ne {}} {
+ # The coroutine can be deleted by completion (a non-yield return), by
+ # http::Finish (when there is a premature end to the transaction), by
+ # http::reset or http::cleanup, or if the caller set option -channel
+ # but not option -handler: in the last case reading from the socket is
+ # now managed by commands ::http::Copy*, http::ReceiveChunked, and
+ # http::make-transformation-chunked.
+ #
+ # Catch in case the coroutine has closed the socket.
+ catch {fileevent $sock readable [list http::EventGateway $sock $token]}
+ }
+
+ # If there was an error, re-throw it.
+ return -options $opts $res
}
+
# http::NextPipelinedWrite
#
# - Connecting a socket to a token for writing is done by this command and by
@@ -2727,8 +2782,32 @@ proc http::Event {sock token} {
}
proxy-connection -
connection {
- set state(connection) \
- [string trim [string tolower $value]]
+ set tmpHeader [string trim [string tolower $value]]
+ # RFC 7230 Section 6.1 states that a comma-separated
+ # list is an acceptable value. According to
+ # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Connection
+ # any comma-separated list implies keep-alive, but I
+ # don't see this in the RFC so we'll play safe and
+ # scan any list for "close".
+ if {$tmpHeader in {close keep-alive}} {
+ # The common cases, continue.
+ } elseif {[string first , $tmpHeader] < 0} {
+ # Not a comma-separated list, not "close",
+ # therefore "keep-alive".
+ set tmpHeader keep-alive
+ } else {
+ set tmpResult keep-alive
+ set tmpCsl [split $tmpHeader ,]
+ # Optional whitespace either side of separator.
+ foreach el $tmpCsl {
+ if {[string trim $el] eq {close}} {
+ set tmpResult close
+ break
+ }
+ }
+ set tmpHeader $tmpResult
+ }
+ set state(connection) $tmpHeader
}
set-cookie {
if {$http(-cookiejar) ne ""} {
@@ -3165,7 +3244,7 @@ proc http::BlockingGets {sock} {
while 1 {
set count [gets $sock line]
set eof [eof $sock]
- if {$count > -1 || $eof} {
+ if {$count >= 0 || $eof} {
return $line
} else {
yield
diff --git a/library/http/pkgIndex.tcl b/library/http/pkgIndex.tcl
index f9f1176..f312aac 100644
--- a/library/http/pkgIndex.tcl
+++ b/library/http/pkgIndex.tcl
@@ -1,2 +1,2 @@
if {![package vsatisfies [package provide Tcl] 8.6-]} {return}
-package ifneeded http 2.9.1 [list tclPkgSetup $dir http 2.9.1 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}]
+package ifneeded http 2.10.0a1 [list tclPkgSetup $dir http 2.10.0a1 {{http.tcl source {::http::config ::http::formatQuery ::http::geturl ::http::reset ::http::wait ::http::register ::http::unregister ::http::mapReply}}}]
diff --git a/library/init.tcl b/library/init.tcl
index 4ea22d8..b25a318 100644
--- a/library/init.tcl
+++ b/library/init.tcl
@@ -3,11 +3,11 @@
# Default system startup file for Tcl-based applications. Defines
# "unknown" procedure and auto-load facilities.
#
-# Copyright (c) 1991-1993 The Regents of the University of California.
-# Copyright (c) 1994-1996 Sun Microsystems, Inc.
-# Copyright (c) 1998-1999 Scriptics Corporation.
-# Copyright (c) 2004 by Kevin B. Kenny.
-# Copyright (c) 2018 by Sean Woods
+# Copyright © 1991-1993 The Regents of the University of California.
+# Copyright © 1994-1996 Sun Microsystems, Inc.
+# Copyright © 1998-1999 Scriptics Corporation.
+# Copyright © 2004 Kevin B. Kenny.
+# Copyright © 2018 Sean Woods
#
# All rights reserved.
#
@@ -19,7 +19,7 @@
if {[info commands package] == ""} {
error "version mismatch: library\nscripts expect Tcl version 7.5b1 or later but the loaded version is\nonly [info patchlevel]"
}
-package require -exact Tcl 8.7a4
+package require -exact tcl 8.7a4
# Compute the auto path to use in this interpreter.
# The values on the path come from several locations:
@@ -40,41 +40,46 @@ package require -exact Tcl 8.7a4
# tcl_pkgPath, which is set by the platform-specific initialization routines
# On UNIX it is compiled in
# On Windows, it is not used
+#
+# (Ticket 41c9857bdd) In a safe interpreter, this file does not set
+# ::auto_path (other than to {} if it is undefined). The caller, typically
+# a Safe Base command, is responsible for setting ::auto_path.
if {![info exists auto_path]} {
- if {[info exists env(TCLLIBPATH)]} {
+ if {[info exists env(TCLLIBPATH)] && (![interp issafe])} {
set auto_path $env(TCLLIBPATH)
} else {
set auto_path ""
}
}
namespace eval tcl {
- variable Dir
- foreach Dir [list $::tcl_library [file dirname $::tcl_library]] {
- if {$Dir ni $::auto_path} {
- lappend ::auto_path $Dir
- }
- }
- set Dir [file join [file dirname [file dirname \
- [info nameofexecutable]]] lib]
- if {$Dir ni $::auto_path} {
- lappend ::auto_path $Dir
- }
- if {[info exists ::tcl_pkgPath]} { catch {
- foreach Dir $::tcl_pkgPath {
+ if {![interp issafe]} {
+ variable Dir
+ foreach Dir [list $::tcl_library [file dirname $::tcl_library]] {
if {$Dir ni $::auto_path} {
lappend ::auto_path $Dir
}
}
- }}
+ set Dir [file join [file dirname [file dirname \
+ [info nameofexecutable]]] lib]
+ if {$Dir ni $::auto_path} {
+ lappend ::auto_path $Dir
+ }
+ if {[info exists ::tcl_pkgPath]} { catch {
+ foreach Dir $::tcl_pkgPath {
+ if {$Dir ni $::auto_path} {
+ lappend ::auto_path $Dir
+ }
+ }
+ }}
- if {![interp issafe]} {
- variable Path [encoding dirs]
- set Dir [file join $::tcl_library encoding]
- if {$Dir ni $Path} {
+ variable Path [encoding dirs]
+ set Dir [file join $::tcl_library encoding]
+ if {$Dir ni $Path} {
lappend Path $Dir
encoding dirs $Path
- }
+ }
+ unset Dir Path
}
}
@@ -107,7 +112,7 @@ if {[interp issafe]} {
foreach cmd {add format scan} {
proc ::tcl::clock::$cmd args {
variable TclLibDir
- source -encoding utf-8 [file join $TclLibDir clock.tcl]
+ source [file join $TclLibDir clock.tcl]
return [uplevel 1 [info level 0]]
}
}
@@ -240,7 +245,7 @@ proc unknown args {
set errInfo [string range $errInfo 0 $last-1]
set tail "\"$cinfo\""
set last [string last $tail $errInfo]
- if {$last + [string length $tail] != [string length $errInfo]} {
+ if {$last < 0 || $last + [string length $tail] != [string length $errInfo]} {
return -code error -errorcode $errCode \
-errorinfo $errInfo $msg
}
@@ -437,6 +442,7 @@ proc auto_load_index {} {
continue
} else {
set error [catch {
+ fconfigure $f -eofchar \032
set id [gets $f]
if {$id eq "# Tcl autoload index file, version 2.0"} {
eval [read $f]
@@ -737,7 +743,7 @@ proc tcl::CopyDirectory {action src dest} {
}
}
} else {
- if {[string first $nsrc $ndest] != -1} {
+ if {[string first $nsrc $ndest] >= 0} {
set srclen [expr {[llength [file split $nsrc]] - 1}]
set ndest [lindex [file split $ndest] $srclen]
if {$ndest eq [file tail $nsrc]} {
diff --git a/library/install.tcl b/library/install.tcl
index e62226e..2c5afa7 100644
--- a/library/install.tcl
+++ b/library/install.tcl
@@ -35,6 +35,7 @@ proc ::practcl::_pkgindex_directory {path} {
# Read the file, and override assumptions as needed
###
set fin [open $file r]
+ fconfigure $fin -encoding utf-8 -eofchar \032
set dat [read $fin]
close $fin
# Look for a teapot style Package statement
@@ -58,6 +59,7 @@ proc ::practcl::_pkgindex_directory {path} {
foreach file [glob -nocomplain $path/*.tcl] {
if { [file tail $file] == "version_info.tcl" } continue
set fin [open $file r]
+ fconfigure $fin -encoding utf-8 -eofchar \032
set dat [read $fin]
close $fin
if {![regexp "package provide" $dat]} continue
@@ -77,6 +79,7 @@ proc ::practcl::_pkgindex_directory {path} {
return $buffer
}
set fin [open $pkgidxfile r]
+ fconfigure $fin -encoding utf-8 -eofchar \032
set dat [read $fin]
close $fin
set trace 0
@@ -104,7 +107,7 @@ proc ::practcl::_pkgindex_directory {path} {
}
if {![regexp "package.*ifneeded" $thisline]} {
# This package index contains arbitrary code
- # source instead of trying to add it to the master
+ # source instead of trying to add it to the main
# package index
if {$trace} { puts "[file dirname $pkgidxfile] Arbitrary code $thisline" }
return {source [file join $dir pkgIndex.tcl]}
@@ -199,7 +202,7 @@ proc ::practcl::installDir {d1 d2} {
} elseif {[file isfile $f]} {
file copy -force $f [file join $d2 $ftail]
if {$::tcl_platform(platform) eq {unix}} {
- file attributes [file join $d2 $ftail] -permissions 0644
+ file attributes [file join $d2 $ftail] -permissions 0o644
} else {
file attributes [file join $d2 $ftail] -readonly 1
}
@@ -207,7 +210,7 @@ proc ::practcl::installDir {d1 d2} {
}
if {$::tcl_platform(platform) eq {unix}} {
- file attributes $d2 -permissions 0755
+ file attributes $d2 -permissions 0o755
} else {
file attributes $d2 -readonly 1
}
diff --git a/library/manifest.txt b/library/manifest.txt
index 620f8b8..be777cb 100644
--- a/library/manifest.txt
+++ b/library/manifest.txt
@@ -5,14 +5,14 @@ apply {{dir} {
set ::test [info script]
set isafe [interp issafe]
foreach {safe package version file} {
- 0 http 2.9.1 {http http.tcl}
- 1 msgcat 1.7.0 {msgcat msgcat.tcl}
- 1 opt 0.4.7 {opt optparse.tcl}
+ 0 http 2.10.0a1 {http http.tcl}
+ 1 msgcat 1.7.1 {msgcat msgcat.tcl}
+ 1 opt 0.4.8 {opt optparse.tcl}
0 cookiejar 0.2.0 {cookiejar cookiejar.tcl}
0 tcl::idna 1.0.1 {cookiejar idna.tcl}
- 0 platform 1.0.14 {platform platform.tcl}
+ 0 platform 1.0.15 {platform platform.tcl}
0 platform::shell 1.1.4 {platform shell.tcl}
- 1 tcltest 2.5.1 {tcltest tcltest.tcl}
+ 1 tcltest 2.5.3 {tcltest tcltest.tcl}
} {
if {$isafe && !$safe} continue
package ifneeded $package $version [list source [file join $dir {*}$file]]
diff --git a/library/msgcat/msgcat.tcl b/library/msgcat/msgcat.tcl
index 9f7d54a..12ab43f 100644
--- a/library/msgcat/msgcat.tcl
+++ b/library/msgcat/msgcat.tcl
@@ -4,9 +4,9 @@
# message catalog facility for Tcl programs. It should be
# loaded with the command "package require msgcat".
#
-# Copyright (c) 2010-2018 by Harald Oehlmann.
-# Copyright (c) 1998-2000 by Ajuba Solutions.
-# Copyright (c) 1998 by Mark Harrison.
+# Copyright © 2010-2018 Harald Oehlmann.
+# Copyright © 1998-2000 Ajuba Solutions.
+# Copyright © 1998 Mark Harrison.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -15,7 +15,7 @@
package require Tcl 8.7-
# When the version number changes, be sure to update the pkgIndex.tcl file,
# and the installation directory in the Makefiles.
-package provide msgcat 1.7.0
+package provide msgcat 1.7.1
namespace eval msgcat {
namespace export mc mcn mcexists mcload mclocale mcmax\
@@ -360,17 +360,19 @@ proc msgcat::mclocale {args} {
proc msgcat::mcutil::getpreferences {locale} {
set locale [string tolower $locale]
- set loclist [list $locale]
- while {-1 !=[set pos [string last "_" $locale]]} {
- set locale [string range $locale 0 $pos-1]
- if { "_" ne [string index $locale end] } {
- lappend loclist $locale
+ set result [list {}]
+ set el {}
+ foreach e [split $locale _] {
+ if {$el eq {}} {
+ set el ${e}
+ } else {
+ set el ${el}_${e}
+ }
+ if {[string index $el end] != {_}} {
+ set result [linsert $result 0 $el]
}
}
- if {"" ne [lindex $loclist end]} {
- lappend loclist {}
- }
- return $loclist
+ return $result
}
# msgcat::mcpreferences --
diff --git a/library/msgcat/pkgIndex.tcl b/library/msgcat/pkgIndex.tcl
index 3309a30..18bd71b 100644
--- a/library/msgcat/pkgIndex.tcl
+++ b/library/msgcat/pkgIndex.tcl
@@ -1,2 +1,2 @@
if {![package vsatisfies [package provide Tcl] 8.7-]} {return}
-package ifneeded msgcat 1.7.0 [list source [file join $dir msgcat.tcl]]
+package ifneeded msgcat 1.7.1 [list source [file join $dir msgcat.tcl]]
diff --git a/library/opt/optparse.tcl b/library/opt/optparse.tcl
index c8946fd..1639379 100644
--- a/library/opt/optparse.tcl
+++ b/library/opt/optparse.tcl
@@ -11,7 +11,7 @@
package require Tcl 8.5-
# When this version number changes, update the pkgIndex.tcl file
# and the install directory in the Makefiles.
-package provide opt 0.4.7
+package provide opt 0.4.8
namespace eval ::tcl {
@@ -44,8 +44,8 @@ namespace eval ::tcl {
{-intflag 7}
{-weirdflag "help string"}
{-noStatics "Not ok to load static packages"}
- {-nestedloading1 true "OK to load into nested slaves"}
- {-nestedloading2 -boolean true "OK to load into nested slaves"}
+ {-nestedloading1 true "OK to load into nested children"}
+ {-nestedloading2 -boolean true "OK to load into nested children"}
{-libsOK -choice {Tk SybTcl}
"List of packages that can be loaded"}
{-precision -int 12 "Number of digits of precision"}
diff --git a/library/opt/pkgIndex.tcl b/library/opt/pkgIndex.tcl
index daf9aa9..23e118c 100644
--- a/library/opt/pkgIndex.tcl
+++ b/library/opt/pkgIndex.tcl
@@ -9,4 +9,4 @@
# full path name of this file's directory.
if {![package vsatisfies [package provide Tcl] 8.5-]} {return}
-package ifneeded opt 0.4.7 [list source [file join $dir optparse.tcl]]
+package ifneeded opt 0.4.8 [list source [file join $dir optparse.tcl]]
diff --git a/library/package.tcl b/library/package.tcl
index 6c87ec1..7df9fe4 100644
--- a/library/package.tcl
+++ b/library/package.tcl
@@ -3,8 +3,8 @@
# utility procs formerly in init.tcl which can be loaded on demand
# for package management.
#
-# Copyright (c) 1991-1993 The Regents of the University of California.
-# Copyright (c) 1994-1998 Sun Microsystems, Inc.
+# Copyright © 1991-1993 The Regents of the University of California.
+# Copyright © 1994-1998 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -237,7 +237,7 @@ proc pkg_mkIndex {args} {
$c eval [list set ::tcl::file $file]
$c eval [list set ::tcl::direct $direct]
- # Download needed procedures into the slave because we've just deleted
+ # Download needed procedures into the child because we've just deleted
# the unknown procedure. This doesn't handle procedures with default
# arguments.
@@ -409,6 +409,7 @@ proc pkg_mkIndex {args} {
}
set f [open [file join $dir pkgIndex.tcl] w]
+ fconfigure $f -translation lf
puts $f $index
close $f
}
@@ -479,9 +480,12 @@ proc tclPkgUnknown {name args} {
}
set tclSeenPath($dir) 1
- # we can't use glob in safe interps, so enclose the following in a
- # catch statement, where we get the pkgIndex files out of the
- # subdirectories
+ # Get the pkgIndex.tcl files in subdirectories of auto_path directories.
+ # - Safe Base interpreters have a restricted "glob" command that
+ # works in this case.
+ # - The "catch" was essential when there was no safe glob and every
+ # call in a safe interp failed; it is retained only for corner
+ # cases in which the eventual call to glob returns an error.
catch {
foreach file [glob -directory $dir -join -nocomplain \
* pkgIndex.tcl] {
@@ -593,6 +597,7 @@ proc tcl::MacOSXPkgUnknown {original name args} {
set tclSeenPath($dir) 1
# get the pkgIndex files out of the subdirectories
+ # Safe interpreters do not use tcl::MacOSXPkgUnknown - see init.tcl.
foreach file [glob -directory $dir -join -nocomplain \
* Resources Scripts pkgIndex.tcl] {
set dir [file dirname $file]
diff --git a/library/parray.tcl b/library/parray.tcl
index a9c2cb1..984bf47 100644
--- a/library/parray.tcl
+++ b/library/parray.tcl
@@ -1,8 +1,8 @@
# parray:
# Print the contents of a global array on stdout.
#
-# Copyright (c) 1991-1993 The Regents of the University of California.
-# Copyright (c) 1994 Sun Microsystems, Inc.
+# Copyright © 1991-1993 The Regents of the University of California.
+# Copyright © 1994 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
diff --git a/library/platform/pkgIndex.tcl b/library/platform/pkgIndex.tcl
index 5970a3f..46a0ed4 100644
--- a/library/platform/pkgIndex.tcl
+++ b/library/platform/pkgIndex.tcl
@@ -1,3 +1,3 @@
-package ifneeded platform 1.0.14 [list source [file join $dir platform.tcl]]
+package ifneeded platform 1.0.15 [list source [file join $dir platform.tcl]]
package ifneeded platform::shell 1.1.4 [list source [file join $dir shell.tcl]]
diff --git a/library/platform/platform.tcl b/library/platform/platform.tcl
index 35a22a3..87d720b 100644
--- a/library/platform/platform.tcl
+++ b/library/platform/platform.tcl
@@ -97,6 +97,9 @@ proc ::platform::generic {} {
cygwin* {
set plat cygwin
}
+ msys* {
+ set plat msystem
+ }
windows {
if {$tcl_platform(platform) == "unix"} {
set plat cygwin
@@ -378,7 +381,7 @@ proc ::platform::patterns {id} {
# ### ### ### ######### ######### #########
## Ready
-package provide platform 1.0.14
+package provide platform 1.0.15
# ### ### ### ######### ######### #########
## Demo application
diff --git a/library/reg/pkgIndex.tcl b/library/reg/pkgIndex.tcl
deleted file mode 100755
index b33970d..0000000
--- a/library/reg/pkgIndex.tcl
+++ /dev/null
@@ -1,9 +0,0 @@
-if {![package vsatisfies [package provide Tcl] 8.5-]} return
-if {[info sharedlibextension] != ".dll"} return
-if {[::tcl::pkgconfig get debug]} {
- package ifneeded registry 1.3.5 \
- [list load [file join $dir tclreg13g.dll] registry]
-} else {
- package ifneeded registry 1.3.5 \
- [list load [file join $dir tclreg13.dll] registry]
-}
diff --git a/library/registry/pkgIndex.tcl b/library/registry/pkgIndex.tcl
new file mode 100644
index 0000000..8b35997
--- /dev/null
+++ b/library/registry/pkgIndex.tcl
@@ -0,0 +1,4 @@
+if {![package vsatisfies [package provide Tcl] 8.5-]} return
+if {[info sharedlibextension] != ".dll"} return
+package ifneeded registry 1.3.5 \
+ [list load [file join $dir tclregistry13.dll]]
diff --git a/library/safe.tcl b/library/safe.tcl
index 470cfa3..0efc00f 100644
--- a/library/safe.tcl
+++ b/library/safe.tcl
@@ -2,12 +2,12 @@
#
# This file provide a safe loading/sourcing mechanism for safe interpreters.
# It implements a virtual path mecanism to hide the real pathnames from the
-# slave. It runs in a master interpreter and sets up data structure and
-# aliases that will be invoked when used from a slave interpreter.
+# child. It runs in a parent interpreter and sets up data structure and
+# aliases that will be invoked when used from a child interpreter.
#
# See the safe.n man page for details.
#
-# Copyright (c) 1996-1997 Sun Microsystems, Inc.
+# Copyright © 1996-1997 Sun Microsystems, Inc.
#
# See the file "license.terms" for information on usage and redistribution of
# this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -20,7 +20,7 @@
#
# Needed utilities package
-package require opt 0.4.7
+package require opt 0.4.8
# Create the safe namespace
namespace eval ::safe {
@@ -79,25 +79,27 @@ proc ::safe::InterpNested {} {
# Interface/entry point function and front end for "Create"
proc ::safe::interpCreate {args} {
set Args [::tcl::OptKeyParse ::safe::interpCreate $args]
- InterpCreate $slave $accessPath \
+ RejectExcessColons $child
+ InterpCreate $child $accessPath \
[InterpStatics] [InterpNested] $deleteHook
}
proc ::safe::interpInit {args} {
set Args [::tcl::OptKeyParse ::safe::interpIC $args]
- if {![::interp exists $slave]} {
- return -code error "\"$slave\" is not an interpreter"
+ if {![::interp exists $child]} {
+ return -code error "\"$child\" is not an interpreter"
}
- InterpInit $slave $accessPath \
+ RejectExcessColons $child
+ InterpInit $child $accessPath \
[InterpStatics] [InterpNested] $deleteHook
}
-# Check that the given slave is "one of us"
-proc ::safe::CheckInterp {slave} {
- namespace upvar ::safe S$slave state
- if {![info exists state] || ![::interp exists $slave]} {
+# Check that the given child is "one of us"
+proc ::safe::CheckInterp {child} {
+ namespace upvar ::safe [VarName $child] state
+ if {![info exists state] || ![::interp exists $child]} {
return -code error \
- "\"$slave\" is not an interpreter managed by ::safe::"
+ "\"$child\" is not an interpreter managed by ::safe::"
}
}
@@ -119,11 +121,11 @@ proc ::safe::interpConfigure {args} {
1 {
# If we have exactly 1 argument the semantic is to return all
# the current configuration. We still call OptKeyParse though
- # we know that "slave" is our given argument because it also
+ # we know that "child" is our given argument because it also
# checks for the "-help" option.
set Args [::tcl::OptKeyParse ::safe::interpIC $args]
- CheckInterp $slave
- namespace upvar ::safe S$slave state
+ CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
return [join [list \
[list -accessPath $state(access_path)] \
@@ -134,7 +136,7 @@ proc ::safe::interpConfigure {args} {
2 {
# If we have exactly 2 arguments the semantic is a "configure
# get"
- lassign $args slave arg
+ lassign $args child arg
# get the flag sub program (we 'know' about Opt's internal
# representation of data)
@@ -145,8 +147,8 @@ proc ::safe::interpConfigure {args} {
} elseif {$hits == 0} {
return -code error [::tcl::OptFlagUsage $desc $arg]
}
- CheckInterp $slave
- namespace upvar ::safe S$slave state
+ CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
set item [::tcl::OptCurDesc $desc]
set name [::tcl::OptName $item]
@@ -186,16 +188,16 @@ proc ::safe::interpConfigure {args} {
# Otherwise we want to parse the arguments like init and
# create did
set Args [::tcl::OptKeyParse ::safe::interpIC $args]
- CheckInterp $slave
- namespace upvar ::safe S$slave state
+ CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
# Get the current (and not the default) values of whatever has
# not been given:
if {![::tcl::OptProcArgGiven -accessPath]} {
- set doreset 1
+ set doreset 0
set accessPath $state(access_path)
} else {
- set doreset 0
+ set doreset 1
}
if {
![::tcl::OptProcArgGiven -statics]
@@ -217,15 +219,34 @@ proc ::safe::interpConfigure {args} {
set deleteHook $state(cleanupHook)
}
# we can now reconfigure :
- InterpSetConfig $slave $accessPath $statics $nested $deleteHook
- # auto_reset the slave (to completly synch the new access_path)
+ InterpSetConfig $child $accessPath $statics $nested $deleteHook
+ # auto_reset the child (to completly synch the new access_path)
if {$doreset} {
- if {[catch {::interp eval $slave {auto_reset}} msg]} {
- Log $slave "auto_reset failed: $msg"
+ if {[catch {::interp eval $child {auto_reset}} msg]} {
+ Log $child "auto_reset failed: $msg"
} else {
- Log $slave "successful auto_reset" NOTICE
+ Log $child "successful auto_reset" NOTICE
+ }
+
+ # Sync the paths used to search for Tcl modules.
+ ::interp eval $child {tcl::tm::path remove {*}[tcl::tm::list]}
+ if {[llength $state(tm_path_child)] > 0} {
+ ::interp eval $child [list \
+ ::tcl::tm::add {*}[lreverse $state(tm_path_child)]]
+ }
+
+ # Remove stale "package ifneeded" data for non-loaded packages.
+ # - Not for loaded packages, because "package forget" erases
+ # data from "package provide" as well as "package ifneeded".
+ # - This is OK because the script cannot reload any version of
+ # the package unless it first does "package forget".
+ foreach pkg [::interp eval $child {package names}] {
+ if {[::interp eval $child [list package provide $pkg]] eq ""} {
+ ::interp eval $child [list package forget $pkg]
+ }
}
}
+ return
}
}
}
@@ -239,17 +260,17 @@ proc ::safe::interpConfigure {args} {
#
# safe::InterpCreate : doing the real job
#
-# This procedure creates a safe slave and initializes it with the safe
+# This procedure creates a safe interpreter and initializes it with the safe
# base aliases.
-# NB: slave name must be simple alphanumeric string, no spaces, no (), no
+# NB: child name must be simple alphanumeric string, no spaces, no (), no
# {},... {because the state array is stored as part of the name}
#
-# Returns the slave name.
+# Returns the child name.
#
# Optional Arguments :
-# + slave name : if empty, generated name will be used
+# + child name : if empty, generated name will be used
# + access_path: path list controlling where load/source can occur,
-# if empty: the master auto_path will be used.
+# if empty: the parent auto_path will be used.
# + staticsok : flag, if 0 :no static package can be loaded (load {} Xxx)
# if 1 :static packages are ok.
# + nestedok: flag, if 0 :no loading to sub-sub interps (load xx xx sub)
@@ -257,35 +278,37 @@ proc ::safe::interpConfigure {args} {
# use the full name and no indent so auto_mkIndex can find us
proc ::safe::InterpCreate {
- slave
+ child
access_path
staticsok
nestedok
deletehook
} {
- # Create the slave.
- if {$slave ne ""} {
- ::interp create -safe $slave
+ # Create the child.
+ # If evaluated in ::safe, the interpreter command for foo is ::foo;
+ # but for foo::bar is safe::foo::bar. So evaluate in :: instead.
+ if {$child ne ""} {
+ namespace eval :: [list ::interp create -safe $child]
} else {
- # empty argument: generate slave name
- set slave [::interp create -safe]
+ # empty argument: generate child name
+ set child [::interp create -safe]
}
- Log $slave "Created" NOTICE
+ Log $child "Created" NOTICE
- # Initialize it. (returns slave name)
- InterpInit $slave $access_path $staticsok $nestedok $deletehook
+ # Initialize it. (returns child name)
+ InterpInit $child $access_path $staticsok $nestedok $deletehook
}
#
# InterpSetConfig (was setAccessPath) :
-# Sets up slave virtual auto_path and corresponding structure within
-# the master. Also sets the tcl_library in the slave to be the first
+# Sets up child virtual auto_path and corresponding structure within
+# the parent. Also sets the tcl_library in the child to be the first
# directory in the path.
-# NB: If you change the path after the slave has been initialized you
-# probably need to call "auto_reset" in the slave in order that it gets
+# NB: If you change the path after the child has been initialized you
+# probably need to call "auto_reset" in the child in order that it gets
# the right auto_index() array values.
-proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
+proc ::safe::InterpSetConfig {child access_path staticsok nestedok deletehook} {
global auto_path
# determine and store the access path if empty
@@ -295,48 +318,48 @@ proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
# Make sure that tcl_library is in auto_path and at the first
# position (needed by setAccessPath)
set where [lsearch -exact $access_path [info library]]
- if {$where == -1} {
+ if {$where < 0} {
# not found, add it.
set access_path [linsert $access_path 0 [info library]]
- Log $slave "tcl_library was not in auto_path,\
- added it to slave's access_path" NOTICE
+ Log $child "tcl_library was not in auto_path,\
+ added it to child's access_path" NOTICE
} elseif {$where != 0} {
# not first, move it first
set access_path [linsert \
[lreplace $access_path $where $where] \
0 [info library]]
- Log $slave "tcl_libray was not in first in auto_path,\
- moved it to front of slave's access_path" NOTICE
+ Log $child "tcl_libray was not in first in auto_path,\
+ moved it to front of child's access_path" NOTICE
}
# Add 1st level sub dirs (will searched by auto loading from tcl
- # code in the slave using glob and thus fail, so we add them here
+ # code in the child using glob and thus fail, so we add them here
# so by default it works the same).
set access_path [AddSubDirs $access_path]
}
- Log $slave "Setting accessPath=($access_path) staticsok=$staticsok\
+ Log $child "Setting accessPath=($access_path) staticsok=$staticsok\
nestedok=$nestedok deletehook=($deletehook)" NOTICE
- namespace upvar ::safe S$slave state
+ namespace upvar ::safe [VarName $child] state
# clear old autopath if it existed
# build new one
# Extend the access list with the paths used to look for Tcl Modules.
# We save the virtual form separately as well, as syncing it with the
- # slave has to be defered until the necessary commands are present for
+ # child has to be defered until the necessary commands are present for
# setup.
set norm_access_path {}
- set slave_access_path {}
+ set child_access_path {}
set map_access_path {}
set remap_access_path {}
- set slave_tm_path {}
+ set child_tm_path {}
set i 0
foreach dir $access_path {
set token [PathToken $i]
- lappend slave_access_path $token
+ lappend child_access_path $token
lappend map_access_path $token $dir
lappend remap_access_path $dir $token
lappend norm_access_path [file normalize $dir]
@@ -344,6 +367,7 @@ proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
}
set morepaths [::tcl::tm::list]
+ set firstpass 1
while {[llength $morepaths]} {
set addpaths $morepaths
set morepaths {}
@@ -352,16 +376,27 @@ proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
# Prevent the addition of dirs on the tm list to the
# result if they are already known.
if {[dict exists $remap_access_path $dir]} {
+ if {$firstpass} {
+ # $dir is in [::tcl::tm::list] and belongs in the child_tm_path.
+ # Later passes handle subdirectories, which belong in the
+ # access path but not in the module path.
+ lappend child_tm_path [dict get $remap_access_path $dir]
+ }
continue
}
set token [PathToken $i]
lappend access_path $dir
- lappend slave_access_path $token
+ lappend child_access_path $token
lappend map_access_path $token $dir
lappend remap_access_path $dir $token
lappend norm_access_path [file normalize $dir]
- lappend slave_tm_path $token
+ if {$firstpass} {
+ # $dir is in [::tcl::tm::list] and belongs in the child_tm_path.
+ # Later passes handle subdirectories, which belong in the
+ # access path but not in the module path.
+ lappend child_tm_path $token
+ }
incr i
# [Bug 2854929]
@@ -372,19 +407,21 @@ proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
# subdirectories.
lappend morepaths {*}[glob -nocomplain -directory $dir -type d *]
}
+ set firstpass 0
}
set state(access_path) $access_path
set state(access_path,map) $map_access_path
set state(access_path,remap) $remap_access_path
set state(access_path,norm) $norm_access_path
- set state(access_path,slave) $slave_access_path
- set state(tm_path_slave) $slave_tm_path
+ set state(access_path,child) $child_access_path
+ set state(tm_path_child) $child_tm_path
set state(staticsok) $staticsok
set state(nestedok) $nestedok
set state(cleanupHook) $deletehook
- SyncAccessPath $slave
+ SyncAccessPath $child
+ return
}
#
@@ -392,11 +429,12 @@ proc ::safe::InterpSetConfig {slave access_path staticsok nestedok deletehook} {
# FindInAccessPath:
# Search for a real directory and returns its virtual Id (including the
# "$")
-proc ::safe::interpFindInAccessPath {slave path} {
- namespace upvar ::safe S$slave state
+proc ::safe::interpFindInAccessPath {child path} {
+ CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
if {![dict exists $state(access_path,remap) $path]} {
- return -code error "$path not found in access path $access_path"
+ return -code error "$path not found in access path"
}
return [dict get $state(access_path,remap) $path]
@@ -406,10 +444,11 @@ proc ::safe::interpFindInAccessPath {slave path} {
# addToAccessPath:
# add (if needed) a real directory to access path and return its
# virtual token (including the "$").
-proc ::safe::interpAddToAccessPath {slave path} {
+proc ::safe::interpAddToAccessPath {child path} {
# first check if the directory is already in there
# (inlined interpFindInAccessPath).
- namespace upvar ::safe S$slave state
+ CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
if {[dict exists $state(access_path,remap) $path]} {
return [dict get $state(access_path,remap) $path]
@@ -419,12 +458,12 @@ proc ::safe::interpAddToAccessPath {slave path} {
set token [PathToken [llength $state(access_path)]]
lappend state(access_path) $path
- lappend state(access_path,slave) $token
+ lappend state(access_path,child) $token
lappend state(access_path,map) $token $path
lappend state(access_path,remap) $path $token
lappend state(access_path,norm) [file normalize $path]
- SyncAccessPath $slave
+ SyncAccessPath $child
return $token
}
@@ -432,25 +471,25 @@ proc ::safe::interpAddToAccessPath {slave path} {
# interpreter. It is useful when you want to install the safe base aliases
# into a preexisting safe interpreter.
proc ::safe::InterpInit {
- slave
+ child
access_path
staticsok
nestedok
deletehook
} {
# Configure will generate an access_path when access_path is empty.
- InterpSetConfig $slave $access_path $staticsok $nestedok $deletehook
+ InterpSetConfig $child $access_path $staticsok $nestedok $deletehook
# NB we need to add [namespace current], aliases are always absolute
# paths.
- # These aliases let the slave load files to define new commands
- # This alias lets the slave use the encoding names, convertfrom,
+ # These aliases let the child load files to define new commands
+ # This alias lets the child use the encoding names, convertfrom,
# convertto, and system, but not "encoding system <name>" to set the
# system encoding.
# Handling Tcl Modules, we need a restricted form of Glob.
# This alias interposes on the 'exit' command and cleanly terminates
- # the slave.
+ # the child.
foreach {command alias} {
source AliasSource
@@ -458,60 +497,60 @@ proc ::safe::InterpInit {
exit interpDelete
glob AliasGlob
} {
- ::interp alias $slave $command {} [namespace current]::$alias $slave
+ ::interp alias $child $command {} [namespace current]::$alias $child
}
# UGLY POINT! These commands are safe (they're ensembles with unsafe
# subcommands), but is assumed to not be by existing policies so it is
# hidden by default. Hack it...
foreach command {encoding file} {
- ::interp alias $slave $command {} interp invokehidden $slave $command
+ ::interp alias $child $command {} interp invokehidden $child $command
}
- # This alias lets the slave have access to a subset of the 'file'
+ # This alias lets the child have access to a subset of the 'file'
# command functionality.
foreach subcommand {dirname extension rootname tail} {
- ::interp alias $slave ::tcl::file::$subcommand {} \
- ::safe::AliasFileSubcommand $slave $subcommand
+ ::interp alias $child ::tcl::file::$subcommand {} \
+ ::safe::AliasFileSubcommand $child $subcommand
}
# Subcommand of 'encoding' that has special handling; [encoding system] is
# OK provided it has no other arguments passed to it.
- ::interp alias $slave ::tcl::encoding::system {} \
- ::safe::AliasEncodingSystem $slave
+ ::interp alias $child ::tcl::encoding::system {} \
+ ::safe::AliasEncodingSystem $child
# Subcommands of info
- ::interp alias $slave ::tcl::info::nameofexecutable {} \
- ::safe::AliasExeName $slave
+ ::interp alias $child ::tcl::info::nameofexecutable {} \
+ ::safe::AliasExeName $child
- # The allowed slave variables already have been set by Tcl_MakeSafe(3)
+ # The allowed child variables already have been set by Tcl_MakeSafe(3)
- # Source init.tcl and tm.tcl into the slave, to get auto_load and
+ # Source init.tcl and tm.tcl into the child, to get auto_load and
# other procedures defined:
- if {[catch {::interp eval $slave {
+ if {[catch {::interp eval $child {
source [file join $tcl_library init.tcl]
}} msg opt]} {
- Log $slave "can't source init.tcl ($msg)"
- return -options $opt "can't source init.tcl into slave $slave ($msg)"
+ Log $child "can't source init.tcl ($msg)"
+ return -options $opt "can't source init.tcl into child $child ($msg)"
}
- if {[catch {::interp eval $slave {
+ if {[catch {::interp eval $child {
source [file join $tcl_library tm.tcl]
}} msg opt]} {
- Log $slave "can't source tm.tcl ($msg)"
- return -options $opt "can't source tm.tcl into slave $slave ($msg)"
+ Log $child "can't source tm.tcl ($msg)"
+ return -options $opt "can't source tm.tcl into child $child ($msg)"
}
# Sync the paths used to search for Tcl modules. This can be done only
# now, after tm.tcl was loaded.
- namespace upvar ::safe S$slave state
- if {[llength $state(tm_path_slave)] > 0} {
- ::interp eval $slave [list \
- ::tcl::tm::add {*}[lreverse $state(tm_path_slave)]]
+ namespace upvar ::safe [VarName $child] state
+ if {[llength $state(tm_path_child)] > 0} {
+ ::interp eval $child [list \
+ ::tcl::tm::add {*}[lreverse $state(tm_path_child)]]
}
- return $slave
+ return $child
}
# Add (only if needed, avoid duplicates) 1 level of sub directories to an
@@ -537,15 +576,30 @@ proc ::safe::AddSubDirs {pathList} {
return $res
}
-# This procedure deletes a safe slave managed by Safe Tcl and cleans up
-# associated state:
-
-proc ::safe::interpDelete {slave} {
- Log $slave "About to delete" NOTICE
-
- namespace upvar ::safe S$slave state
+# This procedure deletes a safe interpreter managed by Safe Tcl and cleans up
+# associated state.
+# - The command will also delete non-Safe-Base interpreters.
+# - This is regrettable, but to avoid breaking existing code this should be
+# amended at the next major revision by uncommenting "CheckInterp".
+
+proc ::safe::interpDelete {child} {
+ Log $child "About to delete" NOTICE
+
+ # CheckInterp $child
+ namespace upvar ::safe [VarName $child] state
+
+ # When an interpreter is deleted with [interp delete], any sub-interpreters
+ # are deleted automatically, but this leaves behind their data in the Safe
+ # Base. To clean up properly, we call safe::interpDelete recursively on each
+ # Safe Base sub-interpreter, so each one is deleted cleanly and not by
+ # the automatic mechanism built into [interp delete].
+ foreach sub [interp children $child] {
+ if {[info exists ::safe::[VarName [list $child $sub]]]} {
+ ::safe::interpDelete [list $child $sub]
+ }
+ }
- # If the slave has a cleanup hook registered, call it. Check the
+ # If the child has a cleanup hook registered, call it. Check the
# existance because we might be called to delete an interp which has
# not been registered with us at all
@@ -556,14 +610,14 @@ proc ::safe::interpDelete {slave} {
# we'll loop
unset state(cleanupHook)
try {
- {*}$hook $slave
+ {*}$hook $child
} on error err {
- Log $slave "Delete hook error ($err)"
+ Log $child "Delete hook error ($err)"
}
}
}
- # Discard the global array of state associated with the slave, and
+ # Discard the global array of state associated with the child, and
# delete the interpreter.
if {[info exists state]} {
@@ -572,9 +626,9 @@ proc ::safe::interpDelete {slave} {
# if we have been called twice, the interp might have been deleted
# already
- if {[::interp exists $slave]} {
- ::interp delete $slave
- Log $slave "Deleted" NOTICE
+ if {[::interp exists $child]} {
+ ::interp delete $child
+ Log $child "Deleted" NOTICE
}
return
@@ -600,9 +654,9 @@ proc ::safe::setLogCmd {args} {
} else {
# Activate logging, define proper command.
- proc ::safe::Log {slave msg {type ERROR}} {
+ proc ::safe::Log {child msg {type ERROR}} {
variable Log
- {*}$Log "$type for slave $slave : $msg"
+ {*}$Log "$type for child $child : $msg"
return
}
}
@@ -611,24 +665,24 @@ proc ::safe::setLogCmd {args} {
# ------------------- END OF PUBLIC METHODS ------------
#
-# Sets the slave auto_path to the master recorded value. Also sets
+# Sets the child auto_path to the parent recorded value. Also sets
# tcl_library to the first token of the virtual path.
#
-proc ::safe::SyncAccessPath {slave} {
- namespace upvar ::safe S$slave state
+proc ::safe::SyncAccessPath {child} {
+ namespace upvar ::safe [VarName $child] state
- set slave_access_path $state(access_path,slave)
- ::interp eval $slave [list set auto_path $slave_access_path]
+ set child_access_path $state(access_path,child)
+ ::interp eval $child [list set auto_path $child_access_path]
- Log $slave "auto_path in $slave has been set to $slave_access_path"\
+ Log $child "auto_path in $child has been set to $child_access_path"\
NOTICE
# This code assumes that info library is the first element in the
# list of auto_path's. See -> InterpSetConfig for the code which
# ensures this condition.
- ::interp eval $slave [list \
- set tcl_library [lindex $slave_access_path 0]]
+ ::interp eval $child [list \
+ set tcl_library [lindex $child_access_path 0]]
}
# Returns the virtual token for directory number N.
@@ -641,8 +695,8 @@ proc ::safe::PathToken {n} {
#
# translate virtual path into real path
#
-proc ::safe::TranslatePath {slave path} {
- namespace upvar ::safe S$slave state
+proc ::safe::TranslatePath {child path} {
+ namespace upvar ::safe [VarName $child] state
# somehow strip the namespaces 'functionality' out (the danger is that
# we would strip valid macintosh "../" queries... :
@@ -657,7 +711,7 @@ proc ::safe::TranslatePath {slave path} {
# file name control (limit access to files/resources that should be a
# valid tcl source file)
-proc ::safe::CheckFileName {slave file} {
+proc ::safe::CheckFileName {child file} {
# This used to limit what can be sourced to ".tcl" and forbid files
# with more than 1 dot and longer than 14 chars, but I changed that
# for 8.4 as a safe interp has enough internal protection already to
@@ -678,17 +732,17 @@ proc ::safe::CheckFileName {slave file} {
# interpreters that are *almost* safe. In particular, it just acts to
# prevent discovery of what home directories exist.
-proc ::safe::AliasFileSubcommand {slave subcommand name} {
+proc ::safe::AliasFileSubcommand {child subcommand name} {
if {[string match ~* $name]} {
set name ./$name
}
- tailcall ::interp invokehidden $slave tcl:file:$subcommand $name
+ tailcall ::interp invokehidden $child tcl:file:$subcommand $name
}
# AliasGlob is the target of the "glob" alias in safe interpreters.
-proc ::safe::AliasGlob {slave args} {
- Log $slave "GLOB ! $args" NOTICE
+proc ::safe::AliasGlob {child args} {
+ Log $child "GLOB ! $args" NOTICE
set cmd {}
set at 0
array set got {
@@ -710,11 +764,15 @@ proc ::safe::AliasGlob {slave args} {
while {$at < [llength $args]} {
switch -glob -- [set opt [lindex $args $at]] {
- -nocomplain - -- - -join - -tails {
+ -nocomplain - -- - -tails {
lappend cmd $opt
set got($opt) 1
incr at
}
+ -join {
+ set got($opt) 1
+ incr at
+ }
-types - -type {
lappend cmd -types [lindex $args [incr at]]
incr at
@@ -728,15 +786,8 @@ proc ::safe::AliasGlob {slave args} {
set virtualdir [lindex $args [incr at]]
incr at
}
- pkgIndex.tcl {
- # Oops, this is globbing a subdirectory in regular package
- # search. That is not wanted. Abort, handler does catch
- # already (because glob was not defined before). See
- # package.tcl, lines 484ff in tclPkgUnknown.
- return -code error "unknown command glob"
- }
-* {
- Log $slave "Safe base rejecting glob option '$opt'"
+ Log $child "Safe base rejecting glob option '$opt'"
return -code error "Safe base rejecting glob option '$opt'"
}
default {
@@ -747,73 +798,116 @@ proc ::safe::AliasGlob {slave args} {
}
# Get the real path from the virtual one and check that the path is in the
- # access path of that slave. Done after basic argument processing so that
+ # access path of that child. Done after basic argument processing so that
# we know if -nocomplain is set.
if {$got(-directory)} {
try {
- set dir [TranslatePath $slave $virtualdir]
- DirInAccessPath $slave $dir
+ set dir [TranslatePath $child $virtualdir]
+ DirInAccessPath $child $dir
} on error msg {
- Log $slave $msg
+ Log $child $msg
if {$got(-nocomplain)} return
return -code error "permission denied"
}
- lappend cmd -directory $dir
+ if {$got(--)} {
+ set cmd [linsert $cmd end-1 -directory $dir]
+ } else {
+ lappend cmd -directory $dir
+ }
+ } else {
+ # The code after this "if ... else" block would conspire to return with
+ # no results in this case, if it were allowed to proceed. Instead,
+ # return now and reduce the number of cases to be considered later.
+ Log $child {option -directory must be supplied}
+ if {$got(-nocomplain)} return
+ return -code error "permission denied"
}
- # Apply the -join semantics ourselves
+ # Apply the -join semantics ourselves.
if {$got(-join)} {
set args [lreplace $args $at end [join [lrange $args $at end] "/"]]
}
- # Process remaining pattern arguments
+ # Process the pattern arguments. If we've done a join there is only one
+ # pattern argument.
+
set firstPattern [llength $cmd]
foreach opt [lrange $args $at end] {
if {![regexp $dirPartRE $opt -> thedir thefile]} {
set thedir .
- } elseif {[string match ~* $thedir]} {
- set thedir ./$thedir
+ # The *.tm search comes here.
}
- if {$thedir eq "*" &&
- ($thefile eq "pkgIndex.tcl" || $thefile eq "*.tm")} {
+ # "Special" treatment for (joined) argument {*/pkgIndex.tcl}.
+ # Do the expansion of "*" here, and filter out any directories that are
+ # not in the access path. The outcome is to lappend to cmd a path of
+ # the form $virtualdir/subdir/pkgIndex.tcl for each subdirectory subdir,
+ # after removing any subdir that are not in the access path.
+ if {($thedir eq "*") && ($thefile eq "pkgIndex.tcl")} {
set mapped 0
- foreach d [glob -directory [TranslatePath $slave $virtualdir] \
+ foreach d [glob -directory [TranslatePath $child $virtualdir] \
-types d -tails *] {
catch {
- DirInAccessPath $slave \
- [TranslatePath $slave [file join $virtualdir $d]]
+ DirInAccessPath $child \
+ [TranslatePath $child [file join $virtualdir $d]]
lappend cmd [file join $d $thefile]
set mapped 1
}
}
if {$mapped} continue
+ # Don't [continue] if */pkgIndex.tcl has no matches in the access
+ # path. The pattern will now receive the same treatment as a
+ # "non-special" pattern (and will fail because it includes a "*" in
+ # the directory name).
}
+ # Any directory pattern that is not an exact (i.e. non-glob) match to a
+ # directory in the access path will be rejected here.
+ # - Rejections include any directory pattern that has glob matching
+ # patterns "*", "?", backslashes, braces or square brackets, (UNLESS
+ # it corresponds to a genuine directory name AND that directory is in
+ # the access path).
+ # - The only "special matching characters" that remain in patterns for
+ # processing by glob are in the filename tail.
+ # - [file join $anything ~${foo}] is ~${foo}, which is not an exact
+ # match to any directory in the access path. Hence directory patterns
+ # that begin with "~" are rejected here. Tests safe-16.[5-8] check
+ # that "file join" remains as required and does not expand ~${foo}.
+ # - Bug [3529949] relates to unwanted expansion of ~${foo} and this is
+ # how the present code avoids the bug. All tests safe-16.* relate.
try {
- DirInAccessPath $slave [TranslatePath $slave \
+ DirInAccessPath $child [TranslatePath $child \
[file join $virtualdir $thedir]]
} on error msg {
- Log $slave $msg
+ Log $child $msg
if {$got(-nocomplain)} continue
return -code error "permission denied"
}
lappend cmd $opt
}
- Log $slave "GLOB = $cmd" NOTICE
+ Log $child "GLOB = $cmd" NOTICE
if {$got(-nocomplain) && [llength $cmd] eq $firstPattern} {
return
}
try {
- set entries [::interp invokehidden $slave glob {*}$cmd]
+ # >>>>>>>>>> HERE'S THE CALL TO SAFE INTERP GLOB <<<<<<<<<<
+ # - Pattern arguments added to cmd have NOT been translated from tokens.
+ # Only the virtualdir is translated (to dir).
+ # - In the pkgIndex.tcl case, there is no "*" in the pattern arguments,
+ # which are a list of names each with tail pkgIndex.tcl. The purpose
+ # of the call to glob is to remove the names for which the file does
+ # not exist.
+ set entries [::interp invokehidden $child glob {*}$cmd]
} on error msg {
- Log $slave $msg
+ # This is the only place that a call with -nocomplain and no invalid
+ # "dash-options" can return an error.
+ Log $child $msg
return -code error "script error"
}
- Log $slave "GLOB < $entries" NOTICE
+ Log $child "GLOB < $entries" NOTICE
- # Translate path back to what the slave should see.
+ # Translate path back to what the child should see.
set res {}
set l [string length $dir]
foreach p $entries {
@@ -823,13 +917,13 @@ proc ::safe::AliasGlob {slave args} {
lappend res $p
}
- Log $slave "GLOB > $res" NOTICE
+ Log $child "GLOB > $res" NOTICE
return $res
}
# AliasSource is the target of the "source" alias in safe interpreters.
-proc ::safe::AliasSource {slave args} {
+proc ::safe::AliasSource {child args} {
set argc [llength $args]
# Extended for handling of Tcl Modules to allow not only "source
# filename", but "source -encoding E filename" as well.
@@ -838,68 +932,68 @@ proc ::safe::AliasSource {slave args} {
set encoding [lindex $args 1]
set at 2
if {$encoding eq "identity"} {
- Log $slave "attempt to use the identity encoding"
+ Log $child "attempt to use the identity encoding"
return -code error "permission denied"
}
} else {
set at 0
- set encoding {}
+ set encoding utf-8
}
if {$argc != 1} {
set msg "wrong # args: should be \"source ?-encoding E? fileName\""
- Log $slave "$msg ($args)"
+ Log $child "$msg ($args)"
return -code error $msg
}
set file [lindex $args $at]
# get the real path from the virtual one.
if {[catch {
- set realfile [TranslatePath $slave $file]
+ set realfile [TranslatePath $child $file]
} msg]} {
- Log $slave $msg
+ Log $child $msg
return -code error "permission denied"
}
- # check that the path is in the access path of that slave
+ # check that the path is in the access path of that child
if {[catch {
- FileInAccessPath $slave $realfile
+ FileInAccessPath $child $realfile
} msg]} {
- Log $slave $msg
+ Log $child $msg
return -code error "permission denied"
}
- # do the checks on the filename :
+ # Check that the filename exists and is readable. If it is not, deliver
+ # this -errorcode so that caller in tclPkgUnknown does not write a message
+ # to tclLog. Has no effect on other callers of ::source, which are in
+ # "package ifneeded" scripts.
if {[catch {
- CheckFileName $slave $realfile
+ CheckFileName $child $realfile
} msg]} {
- Log $slave "$realfile:$msg"
- return -code error $msg
+ Log $child "$realfile:$msg"
+ return -code error -errorcode {POSIX EACCES} $msg
}
# Passed all the tests, lets source it. Note that we do this all manually
- # because we want to control [info script] in the slave so information
+ # because we want to control [info script] in the child so information
# doesn't leak so much. [Bug 2913625]
- set old [::interp eval $slave {info script}]
+ set old [::interp eval $child {info script}]
set replacementMsg "script error"
set code [catch {
set f [open $realfile]
- fconfigure $f -eofchar \032
- if {$encoding ne ""} {
- fconfigure $f -encoding $encoding
- }
+ fconfigure $f -encoding $encoding -eofchar \032
set contents [read $f]
close $f
- ::interp eval $slave [list info script $file]
+ ::interp eval $child [list info script $file]
} msg opt]
if {$code == 0} {
- set code [catch {::interp eval $slave $contents} msg opt]
+ set code [catch {::interp eval $child $contents} msg opt]
set replacementMsg $msg
}
- catch {interp eval $slave [list info script $old]}
+ catch {interp eval $child [list info script $old]}
# Note that all non-errors are fine result codes from [source], so we must
# take a little care to do it properly. [Bug 2923613]
if {$code == 1} {
- Log $slave $msg
+ Log $child $msg
return -code error $replacementMsg
}
return -code $code -options $opt $msg
@@ -907,18 +1001,18 @@ proc ::safe::AliasSource {slave args} {
# AliasLoad is the target of the "load" alias in safe interpreters.
-proc ::safe::AliasLoad {slave file args} {
+proc ::safe::AliasLoad {child file args} {
set argc [llength $args]
if {$argc > 2} {
set msg "load error: too many arguments"
- Log $slave "$msg ($argc) {$file $args}"
+ Log $child "$msg ($argc) {$file $args}"
return -code error $msg
}
# package name (can be empty if file is not).
set package [lindex $args 0]
- namespace upvar ::safe S$slave state
+ namespace upvar ::safe [VarName $child] state
# Determine where to load. load use a relative interp path and {}
# means self, so we can directly and safely use passed arg.
@@ -927,7 +1021,7 @@ proc ::safe::AliasLoad {slave file args} {
# we will try to load into a sub sub interp; check that we want to
# authorize that.
if {!$state(nestedok)} {
- Log $slave "loading to a sub interp (nestedok)\
+ Log $child "loading to a sub interp (nestedok)\
disabled (trying to load $package to $target)"
return -code error "permission denied (nested load)"
}
@@ -938,11 +1032,11 @@ proc ::safe::AliasLoad {slave file args} {
# static package loading
if {$package eq ""} {
set msg "load error: empty filename and no package name"
- Log $slave $msg
+ Log $child $msg
return -code error $msg
}
if {!$state(staticsok)} {
- Log $slave "static packages loading disabled\
+ Log $child "static packages loading disabled\
(trying to load $package to $target)"
return -code error "permission denied (static package)"
}
@@ -951,36 +1045,43 @@ proc ::safe::AliasLoad {slave file args} {
# get the real path from the virtual one.
try {
- set file [TranslatePath $slave $file]
+ set file [TranslatePath $child $file]
} on error msg {
- Log $slave $msg
+ Log $child $msg
return -code error "permission denied"
}
# check the translated path
try {
- FileInAccessPath $slave $file
+ FileInAccessPath $child $file
} on error msg {
- Log $slave $msg
+ Log $child $msg
return -code error "permission denied (path)"
}
}
try {
- return [::interp invokehidden $slave load $file $package $target]
+ return [::interp invokehidden $child load $file $package $target]
} on error msg {
- Log $slave $msg
+ # Some packages return no error message.
+ set msg0 "load of binary library for package $package failed"
+ if {$msg eq {}} {
+ set msg $msg0
+ } else {
+ set msg "$msg0: $msg"
+ }
+ Log $child $msg
return -code error $msg
}
}
# FileInAccessPath raises an error if the file is not found in the list of
-# directories contained in the (master side recorded) slave's access path.
+# directories contained in the (parent side recorded) child's access path.
# the security here relies on "file dirname" answering the proper
# result... needs checking ?
-proc ::safe::FileInAccessPath {slave file} {
- namespace upvar ::safe S$slave state
+proc ::safe::FileInAccessPath {child file} {
+ namespace upvar ::safe [VarName $child] state
set access_path $state(access_path)
if {[file isdirectory $file]} {
@@ -992,14 +1093,14 @@ proc ::safe::FileInAccessPath {slave file} {
# potential pathname anomalies.
set norm_parent [file normalize $parent]
- namespace upvar ::safe S$slave state
+ namespace upvar ::safe [VarName $child] state
if {$norm_parent ni $state(access_path,norm)} {
return -code error "\"$file\": not in access_path"
}
}
-proc ::safe::DirInAccessPath {slave dir} {
- namespace upvar ::safe S$slave state
+proc ::safe::DirInAccessPath {child dir} {
+ namespace upvar ::safe [VarName $child] state
set access_path $state(access_path)
if {[file isfile $dir]} {
@@ -1010,7 +1111,7 @@ proc ::safe::DirInAccessPath {slave dir} {
# potential pathname anomalies.
set norm_dir [file normalize $dir]
- namespace upvar ::safe S$slave state
+ namespace upvar ::safe [VarName $child] state
if {$norm_dir ni $state(access_path,norm)} {
return -code error "\"$dir\": not in access_path"
}
@@ -1019,35 +1120,87 @@ proc ::safe::DirInAccessPath {slave dir} {
# This procedure is used to report an attempt to use an unsafe member of an
# ensemble command.
-proc ::safe::BadSubcommand {slave command subcommand args} {
+proc ::safe::BadSubcommand {child command subcommand args} {
set msg "not allowed to invoke subcommand $subcommand of $command"
- Log $slave $msg
+ Log $child $msg
return -code error -errorcode {TCL SAFE SUBCOMMAND} $msg
}
# AliasEncodingSystem is the target of the "encoding system" alias in safe
# interpreters.
-proc ::safe::AliasEncodingSystem {slave args} {
+proc ::safe::AliasEncodingSystem {child args} {
try {
- # Must not pass extra arguments; safe slaves may not set the system
- # encoding but they may read it.
+ # Must not pass extra arguments; safe interpreters may not set the
+ # system encoding but they may read it.
if {[llength $args]} {
return -code error -errorcode {TCL WRONGARGS} \
"wrong # args: should be \"encoding system\""
}
} on error {msg options} {
- Log $slave $msg
+ Log $child $msg
return -options $options $msg
}
- tailcall ::interp invokehidden $slave tcl:encoding:system
+ tailcall ::interp invokehidden $child tcl:encoding:system
}
# Various minor hiding of platform features. [Bug 2913625]
-proc ::safe::AliasExeName {slave} {
+proc ::safe::AliasExeName {child} {
return ""
}
+# ------------------------------------------------------------------------------
+# Using Interpreter Names with Namespace Qualifiers
+# ------------------------------------------------------------------------------
+# (1) We wish to preserve compatibility with existing code, in which Safe Base
+# interpreter names have no namespace qualifiers.
+# (2) safe::interpCreate and the rest of the Safe Base previously could not
+# accept namespace qualifiers in an interpreter name.
+# (3) The interp command will accept namespace qualifiers in an interpreter
+# name, but accepts distinct interpreters that will have the same command
+# name (e.g. foo, ::foo, and :::foo) (bug 66c2e8c974).
+# (4) To satisfy these constraints, Safe Base interpreter names will be fully
+# qualified namespace names with no excess colons and with the leading "::"
+# omitted.
+# (5) Trailing "::" implies a namespace tail {}, which interp reads as {{}}.
+# Reject such names.
+# (6) We could:
+# (a) EITHER reject usable but non-compliant names (e.g. excess colons) in
+# interpCreate, interpInit;
+# (b) OR accept such names and then translate to a compliant name in every
+# command.
+# The problem with (b) is that the user will expect to use the name with the
+# interp command and will find that it is not recognised.
+# E.g "interpCreate ::foo" creates interpreter "foo", and the user's name
+# "::foo" works with all the Safe Base commands, but "interp eval ::foo"
+# fails.
+# So we choose (a).
+# (7) The command
+# namespace upvar ::safe S$child state
+# becomes
+# namespace upvar ::safe [VarName $child] state
+# ------------------------------------------------------------------------------
+
+proc ::safe::RejectExcessColons {child} {
+ set stripped [regsub -all -- {:::*} $child ::]
+ if {[string range $stripped end-1 end] eq {::}} {
+ return -code error {interpreter name must not end in "::"}
+ }
+ if {$stripped ne $child} {
+ set msg {interpreter name has excess colons in namespace separators}
+ return -code error $msg
+ }
+ if {[string range $stripped 0 1] eq {::}} {
+ return -code error {interpreter name must not begin "::"}
+ }
+ return
+}
+
+proc ::safe::VarName {child} {
+ # return S$child
+ return S[string map {:: @N @ @A} $child]
+}
+
proc ::safe::Setup {} {
####
#
@@ -1057,7 +1210,7 @@ proc ::safe::Setup {} {
# Share the descriptions
set temp [::tcl::OptKeyRegister {
- {-accessPath -list {} "access path for the slave"}
+ {-accessPath -list {} "access path for the child"}
{-noStatics "prevent loading of statically linked pkgs"}
{-statics true "loading of statically linked pkgs"}
{-nestedLoadOk "allow nested loading"}
@@ -1065,18 +1218,18 @@ proc ::safe::Setup {} {
{-deleteHook -script {} "delete hook"}
}]
- # create case (slave is optional)
+ # create case (child is optional)
::tcl::OptKeyRegister {
- {?slave? -name {} "name of the slave (optional)"}
+ {?child? -name {} "name of the child (optional)"}
} ::safe::interpCreate
# adding the flags sub programs to the command program (relying on Opt's
# internal implementation details)
lappend ::tcl::OptDesc(::safe::interpCreate) $::tcl::OptDesc($temp)
- # init and configure (slave is needed)
+ # init and configure (child is needed)
::tcl::OptKeyRegister {
- {slave -name {} "name of the slave"}
+ {child -name {} "name of the child"}
} ::safe::interpIC
# adding the flags sub programs to the command program (relying on Opt's
@@ -1106,20 +1259,20 @@ namespace eval ::safe {
# Log command, set via 'setLogCmd'. Logging is disabled when empty.
variable Log {}
- # The package maintains a state array per slave interp under its
+ # The package maintains a state array per child interp under its
# control. The name of this array is S<interp-name>. This array is
# brought into scope where needed, using 'namespace upvar'. The S
- # prefix is used to avoid that a slave interp called "Log" smashes
+ # prefix is used to avoid that a child interp called "Log" smashes
# the "Log" variable.
#
# The array's elements are:
#
- # access_path : List of paths accessible to the slave.
+ # access_path : List of paths accessible to the child.
# access_path,norm : Ditto, in normalized form.
- # access_path,slave : Ditto, as the path tokens as seen by the slave.
+ # access_path,child : Ditto, as the path tokens as seen by the child.
# access_path,map : dict ( token -> path )
# access_path,remap : dict ( path -> token )
- # tm_path_slave : List of TM root directories, as tokens seen by the slave.
+ # tm_path_child : List of TM root directories, as tokens seen by the child.
# staticsok : Value of option -statics
# nestedok : Value of option -nested
# cleanupHook : Value of option -deleteHook
diff --git a/library/tclIndex b/library/tclIndex
index 87a2814..5f7fbfb 100644
--- a/library/tclIndex
+++ b/library/tclIndex
@@ -15,7 +15,7 @@ set auto_index(::auto_mkindex_parser::init) [list ::tcl::Pkg::source [file join
set auto_index(::auto_mkindex_parser::cleanup) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
set auto_index(::auto_mkindex_parser::mkindex) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
set auto_index(::auto_mkindex_parser::hook) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
-set auto_index(::auto_mkindex_parser::slavehook) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
+set auto_index(::auto_mkindex_parser::childhook) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
set auto_index(::auto_mkindex_parser::command) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
set auto_index(::auto_mkindex_parser::commandInit) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
set auto_index(::auto_mkindex_parser::fullname) [list ::tcl::Pkg::source [file join $dir auto.tcl]]
diff --git a/library/tcltest/pkgIndex.tcl b/library/tcltest/pkgIndex.tcl
index 4aa3970..a56a0d6 100644
--- a/library/tcltest/pkgIndex.tcl
+++ b/library/tcltest/pkgIndex.tcl
@@ -9,4 +9,4 @@
# full path name of this file's directory.
if {![package vsatisfies [package provide Tcl] 8.5-]} {return}
-package ifneeded tcltest 2.5.2 [list source [file join $dir tcltest.tcl]]
+package ifneeded tcltest 2.5.3 [list source [file join $dir tcltest.tcl]]
diff --git a/library/tcltest/tcltest.tcl b/library/tcltest/tcltest.tcl
index e5cfc77..7dc75d7 100644
--- a/library/tcltest/tcltest.tcl
+++ b/library/tcltest/tcltest.tcl
@@ -11,8 +11,8 @@
# Microsystems.
#
# Copyright (c) 1994-1997 Sun Microsystems, Inc.
-# Copyright (c) 1998-1999 by Scriptics Corporation.
-# Copyright (c) 2000 by Ajuba Solutions
+# Copyright (c) 1998-1999 Scriptics Corporation.
+# Copyright (c) 2000 Ajuba Solutions
# Contributions from Don Porter, NIST, 2002. (not subject to US copyright)
# All rights reserved.
@@ -22,7 +22,7 @@ namespace eval tcltest {
# When the version number changes, be sure to update the pkgIndex.tcl file,
# and the install directory in the Makefiles. When the minor version
# changes (new feature) be sure to update the man page as well.
- variable Version 2.5.2
+ variable Version 2.5.3
# Compatibility support for dumb variables defined in tcltest 1
# Do not use these. Call [package provide Tcl] and [info patchlevel]
@@ -41,7 +41,9 @@ namespace eval tcltest {
outputChannel testConstraint
# Export commands that are duplication (candidates for deprecation)
- namespace export bytestring ;# dups [encoding convertfrom identity]
+ if {![package vsatisfies [package provide Tcl] 8.7-]} {
+ namespace export bytestring ;# dups [encoding convertfrom identity]
+ }
namespace export debug ;# [configure -debug]
namespace export errorFile ;# [configure -errfile]
namespace export limitConstraints ;# [configure -limitconstraints]
@@ -640,7 +642,7 @@ namespace eval tcltest {
proc IsVerbose {level} {
variable Option
- return [expr {[lsearch -exact $Option(-verbose) $level] != -1}]
+ return [expr {[lsearch -exact $Option(-verbose) $level] >= 0}]
}
# Default verbosity is to show bodies of failed tests
@@ -811,14 +813,14 @@ namespace eval tcltest {
trace add variable Option(-errfile) write \
[namespace code {errorChannel $Option(-errfile) ;#}]
- proc loadIntoSlaveInterpreter {slave args} {
+ proc loadIntoChildInterpreter {child args} {
variable Version
- interp eval $slave [package ifneeded tcltest $Version]
- interp eval $slave "tcltest::configure {*}{$args}"
- interp alias $slave ::tcltest::ReportToMaster \
- {} ::tcltest::ReportedFromSlave
+ interp eval $child [package ifneeded tcltest $Version]
+ interp eval $child "tcltest::configure {*}{$args}"
+ interp alias $child ::tcltest::ReportToParent \
+ {} ::tcltest::ReportedFromChild
}
- proc ReportedFromSlave {total passed skipped failed because newfiles} {
+ proc ReportedFromChild {total passed skipped failed because newfiles} {
variable numTests
variable skippedBecause
variable createdNewFiles
@@ -1269,7 +1271,7 @@ proc tcltest::DefineConstraintInitializers {} {
ConstraintInitializer nonBlockFiles {
set code [expr {[catch {set f [open defs r]}]
- || [catch {chan configure $f -blocking off}]}]
+ || [catch {fconfigure $f -blocking off}]}]
catch {close $f}
set code
}
@@ -2462,8 +2464,8 @@ proc tcltest::cleanupTests {{calledFromAllFile 0}} {
set testFileName [file tail [info script]]
# Hook to handle reporting to a parent interpreter
- if {[llength [info commands [namespace current]::ReportToMaster]]} {
- ReportToMaster $numTests(Total) $numTests(Passed) $numTests(Skipped) \
+ if {[llength [info commands [namespace current]::ReportToParent]]} {
+ ReportToParent $numTests(Total) $numTests(Passed) $numTests(Skipped) \
$numTests(Failed) [array get skippedBecause] \
[array get createdNewFiles]
set testSingleFile false
@@ -2798,7 +2800,6 @@ proc tcltest::runAllTests { {shell ""} } {
variable numTests
variable failFiles
variable DefaultValue
- set failFilesAccum {}
FillFilesExisted
if {[llength [info level 0]] == 1} {
@@ -2854,8 +2855,18 @@ proc tcltest::runAllTests { {shell ""} } {
flush [outputChannel]
if {[singleProcess]} {
- incr numTestFiles
- uplevel 1 [list ::source $file]
+ if {[catch {
+ incr numTestFiles
+ uplevel 1 [list ::source $file]
+ } msg]} {
+ puts [outputChannel] "Test file error: $msg"
+ # append the name of the test to a list to be reported
+ # later
+ lappend testFileFailures $file
+ }
+ if {$numTests(Failed) > 0} {
+ set failFilesSet 1
+ }
} else {
# Pass along our configuration to the child processes.
# EXCEPT for the -outfile, because the parent process
@@ -2888,7 +2899,7 @@ proc tcltest::runAllTests { {shell ""} } {
}
if {$Failed > 0} {
lappend failFiles $testFile
- lappend failFilesAccum $testFile
+ set failFilesSet 1
}
} elseif {[regexp [join {
{^Number of tests skipped }
@@ -2935,7 +2946,7 @@ proc tcltest::runAllTests { {shell ""} } {
puts [outputChannel] ""
puts [outputChannel] [string repeat ~ 44]
}
- return [expr {[info exists testFileFailures] || [llength $failFilesAccum]}]
+ return [expr {[info exists testFileFailures] || [info exists failFilesSet]}]
}
#####################################################################
@@ -3070,7 +3081,10 @@ proc tcltest::makeFile {contents name {directory ""}} {
putting ``$contents'' into $fullName"
set fd [open $fullName w]
- chan configure $fd -translation lf
+ fconfigure $fd -translation lf
+ if {[package vsatisfies [package provide Tcl] 8.7-]} {
+ fconfigure $fd -encoding utf-8
+ }
if {[string index $contents end] eq "\n"} {
puts -nonewline $fd $contents
} else {
@@ -3107,11 +3121,12 @@ proc tcltest::removeFile {name {directory ""}} {
set fullName [file join $directory $name]
DebugPuts 3 "[lindex [info level 0] 0]: removing $fullName"
set idx [lsearch -exact $filesMade $fullName]
- set filesMade [lreplace $filesMade $idx $idx]
- if {$idx == -1} {
+ if {$idx < 0} {
DebugDo 1 {
Warn "removeFile removing \"$fullName\":\n not created by makeFile"
}
+ } else {
+ set filesMade [lreplace $filesMade $idx $idx]
}
if {![file isfile $fullName]} {
DebugDo 1 {
@@ -3183,7 +3198,7 @@ proc tcltest::removeDirectory {name {directory ""}} {
DebugPuts 3 "[lindex [info level 0] 0]: deleting $fullName"
set idx [lsearch -exact $filesMade $fullName]
set filesMade [lreplace $filesMade $idx $idx]
- if {$idx == -1} {
+ if {$idx < 0} {
DebugDo 1 {
Warn "removeDirectory removing \"$fullName\":\n not created\
by makeDirectory"
@@ -3218,6 +3233,9 @@ proc tcltest::viewFile {name {directory ""}} {
}
set fullName [file join $directory $name]
set f [open $fullName]
+ if {[package vsatisfies [package provide Tcl] 8.7-]} {
+ fconfigure $f -encoding utf-8
+ }
set data [read -nonewline $f]
close $f
return $data
@@ -3232,13 +3250,16 @@ proc tcltest::viewFile {name {directory ""}} {
# procedures that are supposed to accept strings with embedded NULL
# bytes.
# 2. Confirm that a string result has a certain pattern of bytes, for
-# instance to confirm that "\xe0\0" in a Tcl script is stored
-# internally in UTF-8 as the sequence of bytes "\xc3\xa0\xc0\x80".
+# instance to confirm that "\xE0\0" in a Tcl script is stored
+# internally in UTF-8 as the sequence of bytes "\xC3\xA0\xC0\x80".
#
# Generally, it's a bad idea to examine the bytes in a Tcl string or to
# construct improperly formed strings in this manner, because it involves
# exposing that Tcl uses UTF-8 internally.
#
+# This function doesn't work any more in Tcl 8.7, since the 'identity'
+# is gone (TIP #345)
+#
# Arguments:
# string being converted
#
@@ -3248,8 +3269,10 @@ proc tcltest::viewFile {name {directory ""}} {
# Side effects:
# None
-proc tcltest::bytestring {string} {
- return [encoding convertfrom identity $string]
+if {![package vsatisfies [package provide Tcl] 8.7-]} {
+ proc tcltest::bytestring {string} {
+ return [encoding convertfrom identity $string]
+ }
}
# tcltest::OpenFiles --
diff --git a/library/tm.tcl b/library/tm.tcl
index 1802bb9..3c0ec22 100644
--- a/library/tm.tcl
+++ b/library/tm.tcl
@@ -212,11 +212,12 @@ proc ::tcl::tm::UnknownHandler {original name args} {
}
set strip [llength [file split $path]]
- # We can't use glob in safe interps, so enclose the following in a
- # catch statement, where we get the module files out of the
- # subdirectories. In other words, Tcl Modules are not-functional
- # in such an interpreter. This is the same as for the command
- # "tclPkgUnknown", i.e. the search for regular packages.
+ # Get the module files out of the subdirectories.
+ # - Safe Base interpreters have a restricted "glob" command that
+ # works in this case.
+ # - The "catch" was essential when there was no safe glob and every
+ # call in a safe interp failed; it is retained only for corner
+ # cases in which the eventual call to glob returns an error.
catch {
# We always look for _all_ possible modules in the current
@@ -238,12 +239,16 @@ proc ::tcl::tm::UnknownHandler {original name args} {
continue
}
- if {[package ifneeded $pkgname $pkgversion] ne {}} {
+ if {([package ifneeded $pkgname $pkgversion] ne {})
+ && (![interp issafe])
+ } {
# There's already a provide script registered for
# this version of this package. Since all units of
# code claiming to be the same version of the same
# package ought to be identical, just stick with
# the one we already have.
+ # This does not apply to Safe Base interpreters because
+ # the token-to-directory mapping may have changed.
continue
}
@@ -262,7 +267,7 @@ proc ::tcl::tm::UnknownHandler {original name args} {
# of the package file is the last element in the list.
package ifneeded $pkgname $pkgversion \
- "[::list package provide $pkgname $pkgversion];[::list source -encoding utf-8 $file]"
+ "[::list package provide $pkgname $pkgversion];[::list source $file]"
# We abort in this unknown handler only if we got a
# satisfying candidate for the requested package.
diff --git a/library/tzdata/Africa/Algiers b/library/tzdata/Africa/Algiers
index fe4de22..b26d31c 100644
--- a/library/tzdata/Africa/Algiers
+++ b/library/tzdata/Africa/Algiers
@@ -2,7 +2,7 @@
set TZData(:Africa/Algiers) {
{-9223372036854775808 732 0 LMT}
- {-2486679072 561 0 PMT}
+ {-2486592732 561 0 PMT}
{-1855958961 0 0 WET}
{-1689814800 3600 1 WEST}
{-1680397200 0 0 WET}
diff --git a/library/tzdata/Africa/Casablanca b/library/tzdata/Africa/Casablanca
index 99027c9..cb60740 100644
--- a/library/tzdata/Africa/Casablanca
+++ b/library/tzdata/Africa/Casablanca
@@ -60,13 +60,13 @@ set TZData(:Africa/Casablanca) {
{1557021600 0 1 +01}
{1560045600 3600 0 +01}
{1587261600 0 1 +01}
- {1590285600 3600 0 +01}
+ {1590890400 3600 0 +01}
{1618106400 0 1 +01}
{1621130400 3600 0 +01}
{1648346400 0 1 +01}
{1651975200 3600 0 +01}
{1679191200 0 1 +01}
- {1682215200 3600 0 +01}
+ {1682820000 3600 0 +01}
{1710036000 0 1 +01}
{1713060000 3600 0 +01}
{1740276000 0 1 +01}
@@ -76,13 +76,13 @@ set TZData(:Africa/Casablanca) {
{1801965600 0 1 +01}
{1804989600 3600 0 +01}
{1832205600 0 1 +01}
- {1835229600 3600 0 +01}
+ {1835834400 3600 0 +01}
{1863050400 0 1 +01}
{1866074400 3600 0 +01}
{1893290400 0 1 +01}
{1896919200 3600 0 +01}
{1924135200 0 1 +01}
- {1927159200 3600 0 +01}
+ {1927764000 3600 0 +01}
{1954980000 0 1 +01}
{1958004000 3600 0 +01}
{1985220000 0 1 +01}
@@ -92,13 +92,13 @@ set TZData(:Africa/Casablanca) {
{2046304800 0 1 +01}
{2049933600 3600 0 +01}
{2077149600 0 1 +01}
- {2080173600 3600 0 +01}
+ {2080778400 3600 0 +01}
{2107994400 0 1 +01}
{2111018400 3600 0 +01}
{2138234400 0 1 +01}
{2141863200 3600 0 +01}
{2169079200 0 1 +01}
- {2172103200 3600 0 +01}
+ {2172708000 3600 0 +01}
{2199924000 0 1 +01}
{2202948000 3600 0 +01}
{2230164000 0 1 +01}
@@ -108,13 +108,13 @@ set TZData(:Africa/Casablanca) {
{2291248800 0 1 +01}
{2294877600 3600 0 +01}
{2322093600 0 1 +01}
- {2325117600 3600 0 +01}
+ {2325722400 3600 0 +01}
{2352938400 0 1 +01}
{2355962400 3600 0 +01}
{2383178400 0 1 +01}
{2386807200 3600 0 +01}
{2414023200 0 1 +01}
- {2417047200 3600 0 +01}
+ {2417652000 3600 0 +01}
{2444868000 0 1 +01}
{2447892000 3600 0 +01}
{2475108000 0 1 +01}
@@ -124,13 +124,13 @@ set TZData(:Africa/Casablanca) {
{2536192800 0 1 +01}
{2539821600 3600 0 +01}
{2567037600 0 1 +01}
- {2570061600 3600 0 +01}
+ {2570666400 3600 0 +01}
{2597882400 0 1 +01}
{2600906400 3600 0 +01}
{2628122400 0 1 +01}
{2631751200 3600 0 +01}
{2658967200 0 1 +01}
- {2661991200 3600 0 +01}
+ {2662596000 3600 0 +01}
{2689812000 0 1 +01}
{2692836000 3600 0 +01}
{2720052000 0 1 +01}
@@ -140,63 +140,63 @@ set TZData(:Africa/Casablanca) {
{2781136800 0 1 +01}
{2784765600 3600 0 +01}
{2811981600 0 1 +01}
- {2815005600 3600 0 +01}
+ {2815610400 3600 0 +01}
{2842826400 0 1 +01}
{2845850400 3600 0 +01}
{2873066400 0 1 +01}
{2876695200 3600 0 +01}
{2903911200 0 1 +01}
- {2906935200 3600 0 +01}
+ {2907540000 3600 0 +01}
{2934756000 0 1 +01}
{2937780000 3600 0 +01}
{2964996000 0 1 +01}
- {2968020000 3600 0 +01}
+ {2968624800 3600 0 +01}
{2995840800 0 1 +01}
{2998864800 3600 0 +01}
{3026080800 0 1 +01}
{3029709600 3600 0 +01}
{3056925600 0 1 +01}
- {3059949600 3600 0 +01}
+ {3060554400 3600 0 +01}
{3087770400 0 1 +01}
{3090794400 3600 0 +01}
{3118010400 0 1 +01}
{3121639200 3600 0 +01}
{3148855200 0 1 +01}
- {3151879200 3600 0 +01}
+ {3152484000 3600 0 +01}
{3179700000 0 1 +01}
{3182724000 3600 0 +01}
{3209940000 0 1 +01}
- {3212964000 3600 0 +01}
+ {3213568800 3600 0 +01}
{3240784800 0 1 +01}
{3243808800 3600 0 +01}
{3271024800 0 1 +01}
{3274653600 3600 0 +01}
{3301869600 0 1 +01}
- {3304893600 3600 0 +01}
+ {3305498400 3600 0 +01}
{3332714400 0 1 +01}
{3335738400 3600 0 +01}
{3362954400 0 1 +01}
{3366583200 3600 0 +01}
{3393799200 0 1 +01}
- {3396823200 3600 0 +01}
+ {3397428000 3600 0 +01}
{3424644000 0 1 +01}
{3427668000 3600 0 +01}
{3454884000 0 1 +01}
- {3457908000 3600 0 +01}
+ {3458512800 3600 0 +01}
{3485728800 0 1 +01}
{3488752800 3600 0 +01}
{3515968800 0 1 +01}
{3519597600 3600 0 +01}
{3546813600 0 1 +01}
- {3549837600 3600 0 +01}
+ {3550442400 3600 0 +01}
{3577658400 0 1 +01}
{3580682400 3600 0 +01}
{3607898400 0 1 +01}
{3611527200 3600 0 +01}
{3638743200 0 1 +01}
- {3641767200 3600 0 +01}
+ {3642372000 3600 0 +01}
{3669588000 0 1 +01}
{3672612000 3600 0 +01}
{3699828000 0 1 +01}
- {3702852000 3600 0 +01}
+ {3703456800 3600 0 +01}
}
diff --git a/library/tzdata/Africa/El_Aaiun b/library/tzdata/Africa/El_Aaiun
index 9f021a4..fd3e88f 100644
--- a/library/tzdata/Africa/El_Aaiun
+++ b/library/tzdata/Africa/El_Aaiun
@@ -49,13 +49,13 @@ set TZData(:Africa/El_Aaiun) {
{1557021600 0 1 +01}
{1560045600 3600 0 +01}
{1587261600 0 1 +01}
- {1590285600 3600 0 +01}
+ {1590890400 3600 0 +01}
{1618106400 0 1 +01}
{1621130400 3600 0 +01}
{1648346400 0 1 +01}
{1651975200 3600 0 +01}
{1679191200 0 1 +01}
- {1682215200 3600 0 +01}
+ {1682820000 3600 0 +01}
{1710036000 0 1 +01}
{1713060000 3600 0 +01}
{1740276000 0 1 +01}
@@ -65,13 +65,13 @@ set TZData(:Africa/El_Aaiun) {
{1801965600 0 1 +01}
{1804989600 3600 0 +01}
{1832205600 0 1 +01}
- {1835229600 3600 0 +01}
+ {1835834400 3600 0 +01}
{1863050400 0 1 +01}
{1866074400 3600 0 +01}
{1893290400 0 1 +01}
{1896919200 3600 0 +01}
{1924135200 0 1 +01}
- {1927159200 3600 0 +01}
+ {1927764000 3600 0 +01}
{1954980000 0 1 +01}
{1958004000 3600 0 +01}
{1985220000 0 1 +01}
@@ -81,13 +81,13 @@ set TZData(:Africa/El_Aaiun) {
{2046304800 0 1 +01}
{2049933600 3600 0 +01}
{2077149600 0 1 +01}
- {2080173600 3600 0 +01}
+ {2080778400 3600 0 +01}
{2107994400 0 1 +01}
{2111018400 3600 0 +01}
{2138234400 0 1 +01}
{2141863200 3600 0 +01}
{2169079200 0 1 +01}
- {2172103200 3600 0 +01}
+ {2172708000 3600 0 +01}
{2199924000 0 1 +01}
{2202948000 3600 0 +01}
{2230164000 0 1 +01}
@@ -97,13 +97,13 @@ set TZData(:Africa/El_Aaiun) {
{2291248800 0 1 +01}
{2294877600 3600 0 +01}
{2322093600 0 1 +01}
- {2325117600 3600 0 +01}
+ {2325722400 3600 0 +01}
{2352938400 0 1 +01}
{2355962400 3600 0 +01}
{2383178400 0 1 +01}
{2386807200 3600 0 +01}
{2414023200 0 1 +01}
- {2417047200 3600 0 +01}
+ {2417652000 3600 0 +01}
{2444868000 0 1 +01}
{2447892000 3600 0 +01}
{2475108000 0 1 +01}
@@ -113,13 +113,13 @@ set TZData(:Africa/El_Aaiun) {
{2536192800 0 1 +01}
{2539821600 3600 0 +01}
{2567037600 0 1 +01}
- {2570061600 3600 0 +01}
+ {2570666400 3600 0 +01}
{2597882400 0 1 +01}
{2600906400 3600 0 +01}
{2628122400 0 1 +01}
{2631751200 3600 0 +01}
{2658967200 0 1 +01}
- {2661991200 3600 0 +01}
+ {2662596000 3600 0 +01}
{2689812000 0 1 +01}
{2692836000 3600 0 +01}
{2720052000 0 1 +01}
@@ -129,63 +129,63 @@ set TZData(:Africa/El_Aaiun) {
{2781136800 0 1 +01}
{2784765600 3600 0 +01}
{2811981600 0 1 +01}
- {2815005600 3600 0 +01}
+ {2815610400 3600 0 +01}
{2842826400 0 1 +01}
{2845850400 3600 0 +01}
{2873066400 0 1 +01}
{2876695200 3600 0 +01}
{2903911200 0 1 +01}
- {2906935200 3600 0 +01}
+ {2907540000 3600 0 +01}
{2934756000 0 1 +01}
{2937780000 3600 0 +01}
{2964996000 0 1 +01}
- {2968020000 3600 0 +01}
+ {2968624800 3600 0 +01}
{2995840800 0 1 +01}
{2998864800 3600 0 +01}
{3026080800 0 1 +01}
{3029709600 3600 0 +01}
{3056925600 0 1 +01}
- {3059949600 3600 0 +01}
+ {3060554400 3600 0 +01}
{3087770400 0 1 +01}
{3090794400 3600 0 +01}
{3118010400 0 1 +01}
{3121639200 3600 0 +01}
{3148855200 0 1 +01}
- {3151879200 3600 0 +01}
+ {3152484000 3600 0 +01}
{3179700000 0 1 +01}
{3182724000 3600 0 +01}
{3209940000 0 1 +01}
- {3212964000 3600 0 +01}
+ {3213568800 3600 0 +01}
{3240784800 0 1 +01}
{3243808800 3600 0 +01}
{3271024800 0 1 +01}
{3274653600 3600 0 +01}
{3301869600 0 1 +01}
- {3304893600 3600 0 +01}
+ {3305498400 3600 0 +01}
{3332714400 0 1 +01}
{3335738400 3600 0 +01}
{3362954400 0 1 +01}
{3366583200 3600 0 +01}
{3393799200 0 1 +01}
- {3396823200 3600 0 +01}
+ {3397428000 3600 0 +01}
{3424644000 0 1 +01}
{3427668000 3600 0 +01}
{3454884000 0 1 +01}
- {3457908000 3600 0 +01}
+ {3458512800 3600 0 +01}
{3485728800 0 1 +01}
{3488752800 3600 0 +01}
{3515968800 0 1 +01}
{3519597600 3600 0 +01}
{3546813600 0 1 +01}
- {3549837600 3600 0 +01}
+ {3550442400 3600 0 +01}
{3577658400 0 1 +01}
{3580682400 3600 0 +01}
{3607898400 0 1 +01}
{3611527200 3600 0 +01}
{3638743200 0 1 +01}
- {3641767200 3600 0 +01}
+ {3642372000 3600 0 +01}
{3669588000 0 1 +01}
{3672612000 3600 0 +01}
{3699828000 0 1 +01}
- {3702852000 3600 0 +01}
+ {3703456800 3600 0 +01}
}
diff --git a/library/tzdata/America/Dawson b/library/tzdata/America/Dawson
index 8d2b641..c8e3f26 100644
--- a/library/tzdata/America/Dawson
+++ b/library/tzdata/America/Dawson
@@ -94,163 +94,5 @@ set TZData(:America/Dawson) {
{1552212000 -25200 1 PDT}
{1572771600 -28800 0 PST}
{1583661600 -25200 1 PDT}
- {1604221200 -28800 0 PST}
- {1615716000 -25200 1 PDT}
- {1636275600 -28800 0 PST}
- {1647165600 -25200 1 PDT}
- {1667725200 -28800 0 PST}
- {1678615200 -25200 1 PDT}
- {1699174800 -28800 0 PST}
- {1710064800 -25200 1 PDT}
- {1730624400 -28800 0 PST}
- {1741514400 -25200 1 PDT}
- {1762074000 -28800 0 PST}
- {1772964000 -25200 1 PDT}
- {1793523600 -28800 0 PST}
- {1805018400 -25200 1 PDT}
- {1825578000 -28800 0 PST}
- {1836468000 -25200 1 PDT}
- {1857027600 -28800 0 PST}
- {1867917600 -25200 1 PDT}
- {1888477200 -28800 0 PST}
- {1899367200 -25200 1 PDT}
- {1919926800 -28800 0 PST}
- {1930816800 -25200 1 PDT}
- {1951376400 -28800 0 PST}
- {1962871200 -25200 1 PDT}
- {1983430800 -28800 0 PST}
- {1994320800 -25200 1 PDT}
- {2014880400 -28800 0 PST}
- {2025770400 -25200 1 PDT}
- {2046330000 -28800 0 PST}
- {2057220000 -25200 1 PDT}
- {2077779600 -28800 0 PST}
- {2088669600 -25200 1 PDT}
- {2109229200 -28800 0 PST}
- {2120119200 -25200 1 PDT}
- {2140678800 -28800 0 PST}
- {2152173600 -25200 1 PDT}
- {2172733200 -28800 0 PST}
- {2183623200 -25200 1 PDT}
- {2204182800 -28800 0 PST}
- {2215072800 -25200 1 PDT}
- {2235632400 -28800 0 PST}
- {2246522400 -25200 1 PDT}
- {2267082000 -28800 0 PST}
- {2277972000 -25200 1 PDT}
- {2298531600 -28800 0 PST}
- {2309421600 -25200 1 PDT}
- {2329981200 -28800 0 PST}
- {2341476000 -25200 1 PDT}
- {2362035600 -28800 0 PST}
- {2372925600 -25200 1 PDT}
- {2393485200 -28800 0 PST}
- {2404375200 -25200 1 PDT}
- {2424934800 -28800 0 PST}
- {2435824800 -25200 1 PDT}
- {2456384400 -28800 0 PST}
- {2467274400 -25200 1 PDT}
- {2487834000 -28800 0 PST}
- {2499328800 -25200 1 PDT}
- {2519888400 -28800 0 PST}
- {2530778400 -25200 1 PDT}
- {2551338000 -28800 0 PST}
- {2562228000 -25200 1 PDT}
- {2582787600 -28800 0 PST}
- {2593677600 -25200 1 PDT}
- {2614237200 -28800 0 PST}
- {2625127200 -25200 1 PDT}
- {2645686800 -28800 0 PST}
- {2656576800 -25200 1 PDT}
- {2677136400 -28800 0 PST}
- {2688631200 -25200 1 PDT}
- {2709190800 -28800 0 PST}
- {2720080800 -25200 1 PDT}
- {2740640400 -28800 0 PST}
- {2751530400 -25200 1 PDT}
- {2772090000 -28800 0 PST}
- {2782980000 -25200 1 PDT}
- {2803539600 -28800 0 PST}
- {2814429600 -25200 1 PDT}
- {2834989200 -28800 0 PST}
- {2846484000 -25200 1 PDT}
- {2867043600 -28800 0 PST}
- {2877933600 -25200 1 PDT}
- {2898493200 -28800 0 PST}
- {2909383200 -25200 1 PDT}
- {2929942800 -28800 0 PST}
- {2940832800 -25200 1 PDT}
- {2961392400 -28800 0 PST}
- {2972282400 -25200 1 PDT}
- {2992842000 -28800 0 PST}
- {3003732000 -25200 1 PDT}
- {3024291600 -28800 0 PST}
- {3035786400 -25200 1 PDT}
- {3056346000 -28800 0 PST}
- {3067236000 -25200 1 PDT}
- {3087795600 -28800 0 PST}
- {3098685600 -25200 1 PDT}
- {3119245200 -28800 0 PST}
- {3130135200 -25200 1 PDT}
- {3150694800 -28800 0 PST}
- {3161584800 -25200 1 PDT}
- {3182144400 -28800 0 PST}
- {3193034400 -25200 1 PDT}
- {3213594000 -28800 0 PST}
- {3225088800 -25200 1 PDT}
- {3245648400 -28800 0 PST}
- {3256538400 -25200 1 PDT}
- {3277098000 -28800 0 PST}
- {3287988000 -25200 1 PDT}
- {3308547600 -28800 0 PST}
- {3319437600 -25200 1 PDT}
- {3339997200 -28800 0 PST}
- {3350887200 -25200 1 PDT}
- {3371446800 -28800 0 PST}
- {3382941600 -25200 1 PDT}
- {3403501200 -28800 0 PST}
- {3414391200 -25200 1 PDT}
- {3434950800 -28800 0 PST}
- {3445840800 -25200 1 PDT}
- {3466400400 -28800 0 PST}
- {3477290400 -25200 1 PDT}
- {3497850000 -28800 0 PST}
- {3508740000 -25200 1 PDT}
- {3529299600 -28800 0 PST}
- {3540189600 -25200 1 PDT}
- {3560749200 -28800 0 PST}
- {3572244000 -25200 1 PDT}
- {3592803600 -28800 0 PST}
- {3603693600 -25200 1 PDT}
- {3624253200 -28800 0 PST}
- {3635143200 -25200 1 PDT}
- {3655702800 -28800 0 PST}
- {3666592800 -25200 1 PDT}
- {3687152400 -28800 0 PST}
- {3698042400 -25200 1 PDT}
- {3718602000 -28800 0 PST}
- {3730096800 -25200 1 PDT}
- {3750656400 -28800 0 PST}
- {3761546400 -25200 1 PDT}
- {3782106000 -28800 0 PST}
- {3792996000 -25200 1 PDT}
- {3813555600 -28800 0 PST}
- {3824445600 -25200 1 PDT}
- {3845005200 -28800 0 PST}
- {3855895200 -25200 1 PDT}
- {3876454800 -28800 0 PST}
- {3887344800 -25200 1 PDT}
- {3907904400 -28800 0 PST}
- {3919399200 -25200 1 PDT}
- {3939958800 -28800 0 PST}
- {3950848800 -25200 1 PDT}
- {3971408400 -28800 0 PST}
- {3982298400 -25200 1 PDT}
- {4002858000 -28800 0 PST}
- {4013748000 -25200 1 PDT}
- {4034307600 -28800 0 PST}
- {4045197600 -25200 1 PDT}
- {4065757200 -28800 0 PST}
- {4076647200 -25200 1 PDT}
- {4097206800 -28800 0 PST}
+ {1604217600 -25200 0 MST}
}
diff --git a/library/tzdata/America/Godthab b/library/tzdata/America/Godthab
index 3e45f87..8bb7b73 100644
--- a/library/tzdata/America/Godthab
+++ b/library/tzdata/America/Godthab
@@ -1,246 +1,5 @@
# created by tools/tclZIC.tcl - do not edit
-
-set TZData(:America/Godthab) {
- {-9223372036854775808 -12416 0 LMT}
- {-1686083584 -10800 0 -03}
- {323845200 -7200 0 -02}
- {338950800 -10800 0 -03}
- {354675600 -7200 1 -02}
- {370400400 -10800 0 -03}
- {386125200 -7200 1 -02}
- {401850000 -10800 0 -03}
- {417574800 -7200 1 -02}
- {433299600 -10800 0 -03}
- {449024400 -7200 1 -02}
- {465354000 -10800 0 -03}
- {481078800 -7200 1 -02}
- {496803600 -10800 0 -03}
- {512528400 -7200 1 -02}
- {528253200 -10800 0 -03}
- {543978000 -7200 1 -02}
- {559702800 -10800 0 -03}
- {575427600 -7200 1 -02}
- {591152400 -10800 0 -03}
- {606877200 -7200 1 -02}
- {622602000 -10800 0 -03}
- {638326800 -7200 1 -02}
- {654656400 -10800 0 -03}
- {670381200 -7200 1 -02}
- {686106000 -10800 0 -03}
- {701830800 -7200 1 -02}
- {717555600 -10800 0 -03}
- {733280400 -7200 1 -02}
- {749005200 -10800 0 -03}
- {764730000 -7200 1 -02}
- {780454800 -10800 0 -03}
- {796179600 -7200 1 -02}
- {811904400 -10800 0 -03}
- {828234000 -7200 1 -02}
- {846378000 -10800 0 -03}
- {859683600 -7200 1 -02}
- {877827600 -10800 0 -03}
- {891133200 -7200 1 -02}
- {909277200 -10800 0 -03}
- {922582800 -7200 1 -02}
- {941331600 -10800 0 -03}
- {954032400 -7200 1 -02}
- {972781200 -10800 0 -03}
- {985482000 -7200 1 -02}
- {1004230800 -10800 0 -03}
- {1017536400 -7200 1 -02}
- {1035680400 -10800 0 -03}
- {1048986000 -7200 1 -02}
- {1067130000 -10800 0 -03}
- {1080435600 -7200 1 -02}
- {1099184400 -10800 0 -03}
- {1111885200 -7200 1 -02}
- {1130634000 -10800 0 -03}
- {1143334800 -7200 1 -02}
- {1162083600 -10800 0 -03}
- {1174784400 -7200 1 -02}
- {1193533200 -10800 0 -03}
- {1206838800 -7200 1 -02}
- {1224982800 -10800 0 -03}
- {1238288400 -7200 1 -02}
- {1256432400 -10800 0 -03}
- {1269738000 -7200 1 -02}
- {1288486800 -10800 0 -03}
- {1301187600 -7200 1 -02}
- {1319936400 -10800 0 -03}
- {1332637200 -7200 1 -02}
- {1351386000 -10800 0 -03}
- {1364691600 -7200 1 -02}
- {1382835600 -10800 0 -03}
- {1396141200 -7200 1 -02}
- {1414285200 -10800 0 -03}
- {1427590800 -7200 1 -02}
- {1445734800 -10800 0 -03}
- {1459040400 -7200 1 -02}
- {1477789200 -10800 0 -03}
- {1490490000 -7200 1 -02}
- {1509238800 -10800 0 -03}
- {1521939600 -7200 1 -02}
- {1540688400 -10800 0 -03}
- {1553994000 -7200 1 -02}
- {1572138000 -10800 0 -03}
- {1585443600 -7200 1 -02}
- {1603587600 -10800 0 -03}
- {1616893200 -7200 1 -02}
- {1635642000 -10800 0 -03}
- {1648342800 -7200 1 -02}
- {1667091600 -10800 0 -03}
- {1679792400 -7200 1 -02}
- {1698541200 -10800 0 -03}
- {1711846800 -7200 1 -02}
- {1729990800 -10800 0 -03}
- {1743296400 -7200 1 -02}
- {1761440400 -10800 0 -03}
- {1774746000 -7200 1 -02}
- {1792890000 -10800 0 -03}
- {1806195600 -7200 1 -02}
- {1824944400 -10800 0 -03}
- {1837645200 -7200 1 -02}
- {1856394000 -10800 0 -03}
- {1869094800 -7200 1 -02}
- {1887843600 -10800 0 -03}
- {1901149200 -7200 1 -02}
- {1919293200 -10800 0 -03}
- {1932598800 -7200 1 -02}
- {1950742800 -10800 0 -03}
- {1964048400 -7200 1 -02}
- {1982797200 -10800 0 -03}
- {1995498000 -7200 1 -02}
- {2014246800 -10800 0 -03}
- {2026947600 -7200 1 -02}
- {2045696400 -10800 0 -03}
- {2058397200 -7200 1 -02}
- {2077146000 -10800 0 -03}
- {2090451600 -7200 1 -02}
- {2108595600 -10800 0 -03}
- {2121901200 -7200 1 -02}
- {2140045200 -10800 0 -03}
- {2153350800 -7200 1 -02}
- {2172099600 -10800 0 -03}
- {2184800400 -7200 1 -02}
- {2203549200 -10800 0 -03}
- {2216250000 -7200 1 -02}
- {2234998800 -10800 0 -03}
- {2248304400 -7200 1 -02}
- {2266448400 -10800 0 -03}
- {2279754000 -7200 1 -02}
- {2297898000 -10800 0 -03}
- {2311203600 -7200 1 -02}
- {2329347600 -10800 0 -03}
- {2342653200 -7200 1 -02}
- {2361402000 -10800 0 -03}
- {2374102800 -7200 1 -02}
- {2392851600 -10800 0 -03}
- {2405552400 -7200 1 -02}
- {2424301200 -10800 0 -03}
- {2437606800 -7200 1 -02}
- {2455750800 -10800 0 -03}
- {2469056400 -7200 1 -02}
- {2487200400 -10800 0 -03}
- {2500506000 -7200 1 -02}
- {2519254800 -10800 0 -03}
- {2531955600 -7200 1 -02}
- {2550704400 -10800 0 -03}
- {2563405200 -7200 1 -02}
- {2582154000 -10800 0 -03}
- {2595459600 -7200 1 -02}
- {2613603600 -10800 0 -03}
- {2626909200 -7200 1 -02}
- {2645053200 -10800 0 -03}
- {2658358800 -7200 1 -02}
- {2676502800 -10800 0 -03}
- {2689808400 -7200 1 -02}
- {2708557200 -10800 0 -03}
- {2721258000 -7200 1 -02}
- {2740006800 -10800 0 -03}
- {2752707600 -7200 1 -02}
- {2771456400 -10800 0 -03}
- {2784762000 -7200 1 -02}
- {2802906000 -10800 0 -03}
- {2816211600 -7200 1 -02}
- {2834355600 -10800 0 -03}
- {2847661200 -7200 1 -02}
- {2866410000 -10800 0 -03}
- {2879110800 -7200 1 -02}
- {2897859600 -10800 0 -03}
- {2910560400 -7200 1 -02}
- {2929309200 -10800 0 -03}
- {2942010000 -7200 1 -02}
- {2960758800 -10800 0 -03}
- {2974064400 -7200 1 -02}
- {2992208400 -10800 0 -03}
- {3005514000 -7200 1 -02}
- {3023658000 -10800 0 -03}
- {3036963600 -7200 1 -02}
- {3055712400 -10800 0 -03}
- {3068413200 -7200 1 -02}
- {3087162000 -10800 0 -03}
- {3099862800 -7200 1 -02}
- {3118611600 -10800 0 -03}
- {3131917200 -7200 1 -02}
- {3150061200 -10800 0 -03}
- {3163366800 -7200 1 -02}
- {3181510800 -10800 0 -03}
- {3194816400 -7200 1 -02}
- {3212960400 -10800 0 -03}
- {3226266000 -7200 1 -02}
- {3245014800 -10800 0 -03}
- {3257715600 -7200 1 -02}
- {3276464400 -10800 0 -03}
- {3289165200 -7200 1 -02}
- {3307914000 -10800 0 -03}
- {3321219600 -7200 1 -02}
- {3339363600 -10800 0 -03}
- {3352669200 -7200 1 -02}
- {3370813200 -10800 0 -03}
- {3384118800 -7200 1 -02}
- {3402867600 -10800 0 -03}
- {3415568400 -7200 1 -02}
- {3434317200 -10800 0 -03}
- {3447018000 -7200 1 -02}
- {3465766800 -10800 0 -03}
- {3479072400 -7200 1 -02}
- {3497216400 -10800 0 -03}
- {3510522000 -7200 1 -02}
- {3528666000 -10800 0 -03}
- {3541971600 -7200 1 -02}
- {3560115600 -10800 0 -03}
- {3573421200 -7200 1 -02}
- {3592170000 -10800 0 -03}
- {3604870800 -7200 1 -02}
- {3623619600 -10800 0 -03}
- {3636320400 -7200 1 -02}
- {3655069200 -10800 0 -03}
- {3668374800 -7200 1 -02}
- {3686518800 -10800 0 -03}
- {3699824400 -7200 1 -02}
- {3717968400 -10800 0 -03}
- {3731274000 -7200 1 -02}
- {3750022800 -10800 0 -03}
- {3762723600 -7200 1 -02}
- {3781472400 -10800 0 -03}
- {3794173200 -7200 1 -02}
- {3812922000 -10800 0 -03}
- {3825622800 -7200 1 -02}
- {3844371600 -10800 0 -03}
- {3857677200 -7200 1 -02}
- {3875821200 -10800 0 -03}
- {3889126800 -7200 1 -02}
- {3907270800 -10800 0 -03}
- {3920576400 -7200 1 -02}
- {3939325200 -10800 0 -03}
- {3952026000 -7200 1 -02}
- {3970774800 -10800 0 -03}
- {3983475600 -7200 1 -02}
- {4002224400 -10800 0 -03}
- {4015530000 -7200 1 -02}
- {4033674000 -10800 0 -03}
- {4046979600 -7200 1 -02}
- {4065123600 -10800 0 -03}
- {4078429200 -7200 1 -02}
- {4096573200 -10800 0 -03}
+if {![info exists TZData(America/Nuuk)]} {
+ LoadTimeZoneFile America/Nuuk
}
+set TZData(:America/Godthab) $TZData(:America/Nuuk)
diff --git a/library/tzdata/America/Nuuk b/library/tzdata/America/Nuuk
new file mode 100644
index 0000000..8d85a81
--- /dev/null
+++ b/library/tzdata/America/Nuuk
@@ -0,0 +1,246 @@
+# created by tools/tclZIC.tcl - do not edit
+
+set TZData(:America/Nuuk) {
+ {-9223372036854775808 -12416 0 LMT}
+ {-1686083584 -10800 0 -03}
+ {323845200 -7200 0 -02}
+ {338950800 -10800 0 -03}
+ {354675600 -7200 1 -02}
+ {370400400 -10800 0 -03}
+ {386125200 -7200 1 -02}
+ {401850000 -10800 0 -03}
+ {417574800 -7200 1 -02}
+ {433299600 -10800 0 -03}
+ {449024400 -7200 1 -02}
+ {465354000 -10800 0 -03}
+ {481078800 -7200 1 -02}
+ {496803600 -10800 0 -03}
+ {512528400 -7200 1 -02}
+ {528253200 -10800 0 -03}
+ {543978000 -7200 1 -02}
+ {559702800 -10800 0 -03}
+ {575427600 -7200 1 -02}
+ {591152400 -10800 0 -03}
+ {606877200 -7200 1 -02}
+ {622602000 -10800 0 -03}
+ {638326800 -7200 1 -02}
+ {654656400 -10800 0 -03}
+ {670381200 -7200 1 -02}
+ {686106000 -10800 0 -03}
+ {701830800 -7200 1 -02}
+ {717555600 -10800 0 -03}
+ {733280400 -7200 1 -02}
+ {749005200 -10800 0 -03}
+ {764730000 -7200 1 -02}
+ {780454800 -10800 0 -03}
+ {796179600 -7200 1 -02}
+ {811904400 -10800 0 -03}
+ {828234000 -7200 1 -02}
+ {846378000 -10800 0 -03}
+ {859683600 -7200 1 -02}
+ {877827600 -10800 0 -03}
+ {891133200 -7200 1 -02}
+ {909277200 -10800 0 -03}
+ {922582800 -7200 1 -02}
+ {941331600 -10800 0 -03}
+ {954032400 -7200 1 -02}
+ {972781200 -10800 0 -03}
+ {985482000 -7200 1 -02}
+ {1004230800 -10800 0 -03}
+ {1017536400 -7200 1 -02}
+ {1035680400 -10800 0 -03}
+ {1048986000 -7200 1 -02}
+ {1067130000 -10800 0 -03}
+ {1080435600 -7200 1 -02}
+ {1099184400 -10800 0 -03}
+ {1111885200 -7200 1 -02}
+ {1130634000 -10800 0 -03}
+ {1143334800 -7200 1 -02}
+ {1162083600 -10800 0 -03}
+ {1174784400 -7200 1 -02}
+ {1193533200 -10800 0 -03}
+ {1206838800 -7200 1 -02}
+ {1224982800 -10800 0 -03}
+ {1238288400 -7200 1 -02}
+ {1256432400 -10800 0 -03}
+ {1269738000 -7200 1 -02}
+ {1288486800 -10800 0 -03}
+ {1301187600 -7200 1 -02}
+ {1319936400 -10800 0 -03}
+ {1332637200 -7200 1 -02}
+ {1351386000 -10800 0 -03}
+ {1364691600 -7200 1 -02}
+ {1382835600 -10800 0 -03}
+ {1396141200 -7200 1 -02}
+ {1414285200 -10800 0 -03}
+ {1427590800 -7200 1 -02}
+ {1445734800 -10800 0 -03}
+ {1459040400 -7200 1 -02}
+ {1477789200 -10800 0 -03}
+ {1490490000 -7200 1 -02}
+ {1509238800 -10800 0 -03}
+ {1521939600 -7200 1 -02}
+ {1540688400 -10800 0 -03}
+ {1553994000 -7200 1 -02}
+ {1572138000 -10800 0 -03}
+ {1585443600 -7200 1 -02}
+ {1603587600 -10800 0 -03}
+ {1616893200 -7200 1 -02}
+ {1635642000 -10800 0 -03}
+ {1648342800 -7200 1 -02}
+ {1667091600 -10800 0 -03}
+ {1679792400 -7200 1 -02}
+ {1698541200 -10800 0 -03}
+ {1711846800 -7200 1 -02}
+ {1729990800 -10800 0 -03}
+ {1743296400 -7200 1 -02}
+ {1761440400 -10800 0 -03}
+ {1774746000 -7200 1 -02}
+ {1792890000 -10800 0 -03}
+ {1806195600 -7200 1 -02}
+ {1824944400 -10800 0 -03}
+ {1837645200 -7200 1 -02}
+ {1856394000 -10800 0 -03}
+ {1869094800 -7200 1 -02}
+ {1887843600 -10800 0 -03}
+ {1901149200 -7200 1 -02}
+ {1919293200 -10800 0 -03}
+ {1932598800 -7200 1 -02}
+ {1950742800 -10800 0 -03}
+ {1964048400 -7200 1 -02}
+ {1982797200 -10800 0 -03}
+ {1995498000 -7200 1 -02}
+ {2014246800 -10800 0 -03}
+ {2026947600 -7200 1 -02}
+ {2045696400 -10800 0 -03}
+ {2058397200 -7200 1 -02}
+ {2077146000 -10800 0 -03}
+ {2090451600 -7200 1 -02}
+ {2108595600 -10800 0 -03}
+ {2121901200 -7200 1 -02}
+ {2140045200 -10800 0 -03}
+ {2153350800 -7200 1 -02}
+ {2172099600 -10800 0 -03}
+ {2184800400 -7200 1 -02}
+ {2203549200 -10800 0 -03}
+ {2216250000 -7200 1 -02}
+ {2234998800 -10800 0 -03}
+ {2248304400 -7200 1 -02}
+ {2266448400 -10800 0 -03}
+ {2279754000 -7200 1 -02}
+ {2297898000 -10800 0 -03}
+ {2311203600 -7200 1 -02}
+ {2329347600 -10800 0 -03}
+ {2342653200 -7200 1 -02}
+ {2361402000 -10800 0 -03}
+ {2374102800 -7200 1 -02}
+ {2392851600 -10800 0 -03}
+ {2405552400 -7200 1 -02}
+ {2424301200 -10800 0 -03}
+ {2437606800 -7200 1 -02}
+ {2455750800 -10800 0 -03}
+ {2469056400 -7200 1 -02}
+ {2487200400 -10800 0 -03}
+ {2500506000 -7200 1 -02}
+ {2519254800 -10800 0 -03}
+ {2531955600 -7200 1 -02}
+ {2550704400 -10800 0 -03}
+ {2563405200 -7200 1 -02}
+ {2582154000 -10800 0 -03}
+ {2595459600 -7200 1 -02}
+ {2613603600 -10800 0 -03}
+ {2626909200 -7200 1 -02}
+ {2645053200 -10800 0 -03}
+ {2658358800 -7200 1 -02}
+ {2676502800 -10800 0 -03}
+ {2689808400 -7200 1 -02}
+ {2708557200 -10800 0 -03}
+ {2721258000 -7200 1 -02}
+ {2740006800 -10800 0 -03}
+ {2752707600 -7200 1 -02}
+ {2771456400 -10800 0 -03}
+ {2784762000 -7200 1 -02}
+ {2802906000 -10800 0 -03}
+ {2816211600 -7200 1 -02}
+ {2834355600 -10800 0 -03}
+ {2847661200 -7200 1 -02}
+ {2866410000 -10800 0 -03}
+ {2879110800 -7200 1 -02}
+ {2897859600 -10800 0 -03}
+ {2910560400 -7200 1 -02}
+ {2929309200 -10800 0 -03}
+ {2942010000 -7200 1 -02}
+ {2960758800 -10800 0 -03}
+ {2974064400 -7200 1 -02}
+ {2992208400 -10800 0 -03}
+ {3005514000 -7200 1 -02}
+ {3023658000 -10800 0 -03}
+ {3036963600 -7200 1 -02}
+ {3055712400 -10800 0 -03}
+ {3068413200 -7200 1 -02}
+ {3087162000 -10800 0 -03}
+ {3099862800 -7200 1 -02}
+ {3118611600 -10800 0 -03}
+ {3131917200 -7200 1 -02}
+ {3150061200 -10800 0 -03}
+ {3163366800 -7200 1 -02}
+ {3181510800 -10800 0 -03}
+ {3194816400 -7200 1 -02}
+ {3212960400 -10800 0 -03}
+ {3226266000 -7200 1 -02}
+ {3245014800 -10800 0 -03}
+ {3257715600 -7200 1 -02}
+ {3276464400 -10800 0 -03}
+ {3289165200 -7200 1 -02}
+ {3307914000 -10800 0 -03}
+ {3321219600 -7200 1 -02}
+ {3339363600 -10800 0 -03}
+ {3352669200 -7200 1 -02}
+ {3370813200 -10800 0 -03}
+ {3384118800 -7200 1 -02}
+ {3402867600 -10800 0 -03}
+ {3415568400 -7200 1 -02}
+ {3434317200 -10800 0 -03}
+ {3447018000 -7200 1 -02}
+ {3465766800 -10800 0 -03}
+ {3479072400 -7200 1 -02}
+ {3497216400 -10800 0 -03}
+ {3510522000 -7200 1 -02}
+ {3528666000 -10800 0 -03}
+ {3541971600 -7200 1 -02}
+ {3560115600 -10800 0 -03}
+ {3573421200 -7200 1 -02}
+ {3592170000 -10800 0 -03}
+ {3604870800 -7200 1 -02}
+ {3623619600 -10800 0 -03}
+ {3636320400 -7200 1 -02}
+ {3655069200 -10800 0 -03}
+ {3668374800 -7200 1 -02}
+ {3686518800 -10800 0 -03}
+ {3699824400 -7200 1 -02}
+ {3717968400 -10800 0 -03}
+ {3731274000 -7200 1 -02}
+ {3750022800 -10800 0 -03}
+ {3762723600 -7200 1 -02}
+ {3781472400 -10800 0 -03}
+ {3794173200 -7200 1 -02}
+ {3812922000 -10800 0 -03}
+ {3825622800 -7200 1 -02}
+ {3844371600 -10800 0 -03}
+ {3857677200 -7200 1 -02}
+ {3875821200 -10800 0 -03}
+ {3889126800 -7200 1 -02}
+ {3907270800 -10800 0 -03}
+ {3920576400 -7200 1 -02}
+ {3939325200 -10800 0 -03}
+ {3952026000 -7200 1 -02}
+ {3970774800 -10800 0 -03}
+ {3983475600 -7200 1 -02}
+ {4002224400 -10800 0 -03}
+ {4015530000 -7200 1 -02}
+ {4033674000 -10800 0 -03}
+ {4046979600 -7200 1 -02}
+ {4065123600 -10800 0 -03}
+ {4078429200 -7200 1 -02}
+ {4096573200 -10800 0 -03}
+}
diff --git a/library/tzdata/America/Whitehorse b/library/tzdata/America/Whitehorse
index 1d61093..498a203 100644
--- a/library/tzdata/America/Whitehorse
+++ b/library/tzdata/America/Whitehorse
@@ -94,163 +94,5 @@ set TZData(:America/Whitehorse) {
{1552212000 -25200 1 PDT}
{1572771600 -28800 0 PST}
{1583661600 -25200 1 PDT}
- {1604221200 -28800 0 PST}
- {1615716000 -25200 1 PDT}
- {1636275600 -28800 0 PST}
- {1647165600 -25200 1 PDT}
- {1667725200 -28800 0 PST}
- {1678615200 -25200 1 PDT}
- {1699174800 -28800 0 PST}
- {1710064800 -25200 1 PDT}
- {1730624400 -28800 0 PST}
- {1741514400 -25200 1 PDT}
- {1762074000 -28800 0 PST}
- {1772964000 -25200 1 PDT}
- {1793523600 -28800 0 PST}
- {1805018400 -25200 1 PDT}
- {1825578000 -28800 0 PST}
- {1836468000 -25200 1 PDT}
- {1857027600 -28800 0 PST}
- {1867917600 -25200 1 PDT}
- {1888477200 -28800 0 PST}
- {1899367200 -25200 1 PDT}
- {1919926800 -28800 0 PST}
- {1930816800 -25200 1 PDT}
- {1951376400 -28800 0 PST}
- {1962871200 -25200 1 PDT}
- {1983430800 -28800 0 PST}
- {1994320800 -25200 1 PDT}
- {2014880400 -28800 0 PST}
- {2025770400 -25200 1 PDT}
- {2046330000 -28800 0 PST}
- {2057220000 -25200 1 PDT}
- {2077779600 -28800 0 PST}
- {2088669600 -25200 1 PDT}
- {2109229200 -28800 0 PST}
- {2120119200 -25200 1 PDT}
- {2140678800 -28800 0 PST}
- {2152173600 -25200 1 PDT}
- {2172733200 -28800 0 PST}
- {2183623200 -25200 1 PDT}
- {2204182800 -28800 0 PST}
- {2215072800 -25200 1 PDT}
- {2235632400 -28800 0 PST}
- {2246522400 -25200 1 PDT}
- {2267082000 -28800 0 PST}
- {2277972000 -25200 1 PDT}
- {2298531600 -28800 0 PST}
- {2309421600 -25200 1 PDT}
- {2329981200 -28800 0 PST}
- {2341476000 -25200 1 PDT}
- {2362035600 -28800 0 PST}
- {2372925600 -25200 1 PDT}
- {2393485200 -28800 0 PST}
- {2404375200 -25200 1 PDT}
- {2424934800 -28800 0 PST}
- {2435824800 -25200 1 PDT}
- {2456384400 -28800 0 PST}
- {2467274400 -25200 1 PDT}
- {2487834000 -28800 0 PST}
- {2499328800 -25200 1 PDT}
- {2519888400 -28800 0 PST}
- {2530778400 -25200 1 PDT}
- {2551338000 -28800 0 PST}
- {2562228000 -25200 1 PDT}
- {2582787600 -28800 0 PST}
- {2593677600 -25200 1 PDT}
- {2614237200 -28800 0 PST}
- {2625127200 -25200 1 PDT}
- {2645686800 -28800 0 PST}
- {2656576800 -25200 1 PDT}
- {2677136400 -28800 0 PST}
- {2688631200 -25200 1 PDT}
- {2709190800 -28800 0 PST}
- {2720080800 -25200 1 PDT}
- {2740640400 -28800 0 PST}
- {2751530400 -25200 1 PDT}
- {2772090000 -28800 0 PST}
- {2782980000 -25200 1 PDT}
- {2803539600 -28800 0 PST}
- {2814429600 -25200 1 PDT}
- {2834989200 -28800 0 PST}
- {2846484000 -25200 1 PDT}
- {2867043600 -28800 0 PST}
- {2877933600 -25200 1 PDT}
- {2898493200 -28800 0 PST}
- {2909383200 -25200 1 PDT}
- {2929942800 -28800 0 PST}
- {2940832800 -25200 1 PDT}
- {2961392400 -28800 0 PST}
- {2972282400 -25200 1 PDT}
- {2992842000 -28800 0 PST}
- {3003732000 -25200 1 PDT}
- {3024291600 -28800 0 PST}
- {3035786400 -25200 1 PDT}
- {3056346000 -28800 0 PST}
- {3067236000 -25200 1 PDT}
- {3087795600 -28800 0 PST}
- {3098685600 -25200 1 PDT}
- {3119245200 -28800 0 PST}
- {3130135200 -25200 1 PDT}
- {3150694800 -28800 0 PST}
- {3161584800 -25200 1 PDT}
- {3182144400 -28800 0 PST}
- {3193034400 -25200 1 PDT}
- {3213594000 -28800 0 PST}
- {3225088800 -25200 1 PDT}
- {3245648400 -28800 0 PST}
- {3256538400 -25200 1 PDT}
- {3277098000 -28800 0 PST}
- {3287988000 -25200 1 PDT}
- {3308547600 -28800 0 PST}
- {3319437600 -25200 1 PDT}
- {3339997200 -28800 0 PST}
- {3350887200 -25200 1 PDT}
- {3371446800 -28800 0 PST}
- {3382941600 -25200 1 PDT}
- {3403501200 -28800 0 PST}
- {3414391200 -25200 1 PDT}
- {3434950800 -28800 0 PST}
- {3445840800 -25200 1 PDT}
- {3466400400 -28800 0 PST}
- {3477290400 -25200 1 PDT}
- {3497850000 -28800 0 PST}
- {3508740000 -25200 1 PDT}
- {3529299600 -28800 0 PST}
- {3540189600 -25200 1 PDT}
- {3560749200 -28800 0 PST}
- {3572244000 -25200 1 PDT}
- {3592803600 -28800 0 PST}
- {3603693600 -25200 1 PDT}
- {3624253200 -28800 0 PST}
- {3635143200 -25200 1 PDT}
- {3655702800 -28800 0 PST}
- {3666592800 -25200 1 PDT}
- {3687152400 -28800 0 PST}
- {3698042400 -25200 1 PDT}
- {3718602000 -28800 0 PST}
- {3730096800 -25200 1 PDT}
- {3750656400 -28800 0 PST}
- {3761546400 -25200 1 PDT}
- {3782106000 -28800 0 PST}
- {3792996000 -25200 1 PDT}
- {3813555600 -28800 0 PST}
- {3824445600 -25200 1 PDT}
- {3845005200 -28800 0 PST}
- {3855895200 -25200 1 PDT}
- {3876454800 -28800 0 PST}
- {3887344800 -25200 1 PDT}
- {3907904400 -28800 0 PST}
- {3919399200 -25200 1 PDT}
- {3939958800 -28800 0 PST}
- {3950848800 -25200 1 PDT}
- {3971408400 -28800 0 PST}
- {3982298400 -25200 1 PDT}
- {4002858000 -28800 0 PST}
- {4013748000 -25200 1 PDT}
- {4034307600 -28800 0 PST}
- {4045197600 -25200 1 PDT}
- {4065757200 -28800 0 PST}
- {4076647200 -25200 1 PDT}
- {4097206800 -28800 0 PST}
+ {1604217600 -25200 0 MST}
}
diff --git a/library/tzdata/Antarctica/Casey b/library/tzdata/Antarctica/Casey
index aa37480..56935e3 100644
--- a/library/tzdata/Antarctica/Casey
+++ b/library/tzdata/Antarctica/Casey
@@ -9,4 +9,9 @@ set TZData(:Antarctica/Casey) {
{1329843600 28800 0 +08}
{1477065600 39600 0 +11}
{1520701200 28800 0 +08}
+ {1538856000 39600 0 +11}
+ {1552752000 28800 0 +08}
+ {1570129200 39600 0 +11}
+ {1583596800 28800 0 +08}
+ {1601740860 39600 0 +11}
}
diff --git a/library/tzdata/Antarctica/Macquarie b/library/tzdata/Antarctica/Macquarie
index 60bf7a6..e8ed043 100644
--- a/library/tzdata/Antarctica/Macquarie
+++ b/library/tzdata/Antarctica/Macquarie
@@ -93,5 +93,184 @@ set TZData(:Antarctica/Macquarie) {
{1223136000 39600 1 AEDT}
{1238860800 36000 0 AEST}
{1254585600 39600 1 AEDT}
- {1270310400 39600 0 +11}
+ {1262264400 39600 1 AEDT}
+ {1293800400 39600 0 AEST}
+ {1301760000 36000 0 AEST}
+ {1317484800 39600 1 AEDT}
+ {1333209600 36000 0 AEST}
+ {1349539200 39600 1 AEDT}
+ {1365264000 36000 0 AEST}
+ {1380988800 39600 1 AEDT}
+ {1396713600 36000 0 AEST}
+ {1412438400 39600 1 AEDT}
+ {1428163200 36000 0 AEST}
+ {1443888000 39600 1 AEDT}
+ {1459612800 36000 0 AEST}
+ {1475337600 39600 1 AEDT}
+ {1491062400 36000 0 AEST}
+ {1506787200 39600 1 AEDT}
+ {1522512000 36000 0 AEST}
+ {1538841600 39600 1 AEDT}
+ {1554566400 36000 0 AEST}
+ {1570291200 39600 1 AEDT}
+ {1586016000 36000 0 AEST}
+ {1601740800 39600 1 AEDT}
+ {1617465600 36000 0 AEST}
+ {1633190400 39600 1 AEDT}
+ {1648915200 36000 0 AEST}
+ {1664640000 39600 1 AEDT}
+ {1680364800 36000 0 AEST}
+ {1696089600 39600 1 AEDT}
+ {1712419200 36000 0 AEST}
+ {1728144000 39600 1 AEDT}
+ {1743868800 36000 0 AEST}
+ {1759593600 39600 1 AEDT}
+ {1775318400 36000 0 AEST}
+ {1791043200 39600 1 AEDT}
+ {1806768000 36000 0 AEST}
+ {1822492800 39600 1 AEDT}
+ {1838217600 36000 0 AEST}
+ {1853942400 39600 1 AEDT}
+ {1869667200 36000 0 AEST}
+ {1885996800 39600 1 AEDT}
+ {1901721600 36000 0 AEST}
+ {1917446400 39600 1 AEDT}
+ {1933171200 36000 0 AEST}
+ {1948896000 39600 1 AEDT}
+ {1964620800 36000 0 AEST}
+ {1980345600 39600 1 AEDT}
+ {1996070400 36000 0 AEST}
+ {2011795200 39600 1 AEDT}
+ {2027520000 36000 0 AEST}
+ {2043244800 39600 1 AEDT}
+ {2058969600 36000 0 AEST}
+ {2075299200 39600 1 AEDT}
+ {2091024000 36000 0 AEST}
+ {2106748800 39600 1 AEDT}
+ {2122473600 36000 0 AEST}
+ {2138198400 39600 1 AEDT}
+ {2153923200 36000 0 AEST}
+ {2169648000 39600 1 AEDT}
+ {2185372800 36000 0 AEST}
+ {2201097600 39600 1 AEDT}
+ {2216822400 36000 0 AEST}
+ {2233152000 39600 1 AEDT}
+ {2248876800 36000 0 AEST}
+ {2264601600 39600 1 AEDT}
+ {2280326400 36000 0 AEST}
+ {2296051200 39600 1 AEDT}
+ {2311776000 36000 0 AEST}
+ {2327500800 39600 1 AEDT}
+ {2343225600 36000 0 AEST}
+ {2358950400 39600 1 AEDT}
+ {2374675200 36000 0 AEST}
+ {2390400000 39600 1 AEDT}
+ {2406124800 36000 0 AEST}
+ {2422454400 39600 1 AEDT}
+ {2438179200 36000 0 AEST}
+ {2453904000 39600 1 AEDT}
+ {2469628800 36000 0 AEST}
+ {2485353600 39600 1 AEDT}
+ {2501078400 36000 0 AEST}
+ {2516803200 39600 1 AEDT}
+ {2532528000 36000 0 AEST}
+ {2548252800 39600 1 AEDT}
+ {2563977600 36000 0 AEST}
+ {2579702400 39600 1 AEDT}
+ {2596032000 36000 0 AEST}
+ {2611756800 39600 1 AEDT}
+ {2627481600 36000 0 AEST}
+ {2643206400 39600 1 AEDT}
+ {2658931200 36000 0 AEST}
+ {2674656000 39600 1 AEDT}
+ {2690380800 36000 0 AEST}
+ {2706105600 39600 1 AEDT}
+ {2721830400 36000 0 AEST}
+ {2737555200 39600 1 AEDT}
+ {2753280000 36000 0 AEST}
+ {2769609600 39600 1 AEDT}
+ {2785334400 36000 0 AEST}
+ {2801059200 39600 1 AEDT}
+ {2816784000 36000 0 AEST}
+ {2832508800 39600 1 AEDT}
+ {2848233600 36000 0 AEST}
+ {2863958400 39600 1 AEDT}
+ {2879683200 36000 0 AEST}
+ {2895408000 39600 1 AEDT}
+ {2911132800 36000 0 AEST}
+ {2926857600 39600 1 AEDT}
+ {2942582400 36000 0 AEST}
+ {2958912000 39600 1 AEDT}
+ {2974636800 36000 0 AEST}
+ {2990361600 39600 1 AEDT}
+ {3006086400 36000 0 AEST}
+ {3021811200 39600 1 AEDT}
+ {3037536000 36000 0 AEST}
+ {3053260800 39600 1 AEDT}
+ {3068985600 36000 0 AEST}
+ {3084710400 39600 1 AEDT}
+ {3100435200 36000 0 AEST}
+ {3116764800 39600 1 AEDT}
+ {3132489600 36000 0 AEST}
+ {3148214400 39600 1 AEDT}
+ {3163939200 36000 0 AEST}
+ {3179664000 39600 1 AEDT}
+ {3195388800 36000 0 AEST}
+ {3211113600 39600 1 AEDT}
+ {3226838400 36000 0 AEST}
+ {3242563200 39600 1 AEDT}
+ {3258288000 36000 0 AEST}
+ {3274012800 39600 1 AEDT}
+ {3289737600 36000 0 AEST}
+ {3306067200 39600 1 AEDT}
+ {3321792000 36000 0 AEST}
+ {3337516800 39600 1 AEDT}
+ {3353241600 36000 0 AEST}
+ {3368966400 39600 1 AEDT}
+ {3384691200 36000 0 AEST}
+ {3400416000 39600 1 AEDT}
+ {3416140800 36000 0 AEST}
+ {3431865600 39600 1 AEDT}
+ {3447590400 36000 0 AEST}
+ {3463315200 39600 1 AEDT}
+ {3479644800 36000 0 AEST}
+ {3495369600 39600 1 AEDT}
+ {3511094400 36000 0 AEST}
+ {3526819200 39600 1 AEDT}
+ {3542544000 36000 0 AEST}
+ {3558268800 39600 1 AEDT}
+ {3573993600 36000 0 AEST}
+ {3589718400 39600 1 AEDT}
+ {3605443200 36000 0 AEST}
+ {3621168000 39600 1 AEDT}
+ {3636892800 36000 0 AEST}
+ {3653222400 39600 1 AEDT}
+ {3668947200 36000 0 AEST}
+ {3684672000 39600 1 AEDT}
+ {3700396800 36000 0 AEST}
+ {3716121600 39600 1 AEDT}
+ {3731846400 36000 0 AEST}
+ {3747571200 39600 1 AEDT}
+ {3763296000 36000 0 AEST}
+ {3779020800 39600 1 AEDT}
+ {3794745600 36000 0 AEST}
+ {3810470400 39600 1 AEDT}
+ {3826195200 36000 0 AEST}
+ {3842524800 39600 1 AEDT}
+ {3858249600 36000 0 AEST}
+ {3873974400 39600 1 AEDT}
+ {3889699200 36000 0 AEST}
+ {3905424000 39600 1 AEDT}
+ {3921148800 36000 0 AEST}
+ {3936873600 39600 1 AEDT}
+ {3952598400 36000 0 AEST}
+ {3968323200 39600 1 AEDT}
+ {3984048000 36000 0 AEST}
+ {4000377600 39600 1 AEDT}
+ {4016102400 36000 0 AEST}
+ {4031827200 39600 1 AEDT}
+ {4047552000 36000 0 AEST}
+ {4063276800 39600 1 AEDT}
+ {4079001600 36000 0 AEST}
+ {4094726400 39600 1 AEDT}
}
diff --git a/library/tzdata/Asia/Gaza b/library/tzdata/Asia/Gaza
index 9b73dcc..ae86505 100644
--- a/library/tzdata/Asia/Gaza
+++ b/library/tzdata/Asia/Gaza
@@ -110,7 +110,7 @@ set TZData(:Asia/Gaza) {
{1395957600 10800 1 EEST}
{1414098000 7200 0 EET}
{1427493600 10800 1 EEST}
- {1445547600 7200 0 EET}
+ {1445551200 7200 0 EET}
{1458946800 10800 1 EEST}
{1477692000 7200 0 EET}
{1490396400 10800 1 EEST}
@@ -118,165 +118,165 @@ set TZData(:Asia/Gaza) {
{1521846000 10800 1 EEST}
{1540591200 7200 0 EET}
{1553810400 10800 1 EEST}
- {1572040800 7200 0 EET}
- {1585260000 10800 1 EEST}
- {1604095200 7200 0 EET}
- {1616709600 10800 1 EEST}
+ {1572037200 7200 0 EET}
+ {1585346400 10800 1 EEST}
+ {1603490400 7200 0 EET}
+ {1616796000 10800 1 EEST}
{1635544800 7200 0 EET}
- {1648159200 10800 1 EEST}
+ {1648245600 10800 1 EEST}
{1666994400 7200 0 EET}
- {1680213600 10800 1 EEST}
+ {1679695200 10800 1 EEST}
{1698444000 7200 0 EET}
- {1711663200 10800 1 EEST}
+ {1711749600 10800 1 EEST}
{1729893600 7200 0 EET}
- {1743112800 10800 1 EEST}
+ {1743199200 10800 1 EEST}
{1761343200 7200 0 EET}
- {1774562400 10800 1 EEST}
- {1793397600 7200 0 EET}
- {1806012000 10800 1 EEST}
+ {1774648800 10800 1 EEST}
+ {1792792800 7200 0 EET}
+ {1806098400 10800 1 EEST}
{1824847200 7200 0 EET}
- {1838066400 10800 1 EEST}
+ {1837548000 10800 1 EEST}
{1856296800 7200 0 EET}
- {1869516000 10800 1 EEST}
+ {1868997600 10800 1 EEST}
{1887746400 7200 0 EET}
- {1900965600 10800 1 EEST}
+ {1901052000 10800 1 EEST}
{1919196000 7200 0 EET}
- {1932415200 10800 1 EEST}
+ {1932501600 10800 1 EEST}
{1950645600 7200 0 EET}
- {1963864800 10800 1 EEST}
+ {1963951200 10800 1 EEST}
{1982700000 7200 0 EET}
- {1995314400 10800 1 EEST}
+ {1995400800 10800 1 EEST}
{2014149600 7200 0 EET}
- {2027368800 10800 1 EEST}
+ {2026850400 10800 1 EEST}
{2045599200 7200 0 EET}
- {2058818400 10800 1 EEST}
+ {2058300000 10800 1 EEST}
{2077048800 7200 0 EET}
- {2090268000 10800 1 EEST}
+ {2090354400 10800 1 EEST}
{2108498400 7200 0 EET}
- {2121717600 10800 1 EEST}
- {2140552800 7200 0 EET}
- {2153167200 10800 1 EEST}
+ {2121804000 10800 1 EEST}
+ {2139948000 7200 0 EET}
+ {2153253600 10800 1 EEST}
{2172002400 7200 0 EET}
- {2184616800 10800 1 EEST}
+ {2184703200 10800 1 EEST}
{2203452000 7200 0 EET}
- {2216671200 10800 1 EEST}
+ {2216152800 10800 1 EEST}
{2234901600 7200 0 EET}
- {2248120800 10800 1 EEST}
+ {2248207200 10800 1 EEST}
{2266351200 7200 0 EET}
- {2279570400 10800 1 EEST}
+ {2279656800 10800 1 EEST}
{2297800800 7200 0 EET}
- {2311020000 10800 1 EEST}
- {2329855200 7200 0 EET}
- {2342469600 10800 1 EEST}
+ {2311106400 10800 1 EEST}
+ {2329250400 7200 0 EET}
+ {2342556000 10800 1 EEST}
{2361304800 7200 0 EET}
- {2374524000 10800 1 EEST}
+ {2374005600 10800 1 EEST}
{2392754400 7200 0 EET}
- {2405973600 10800 1 EEST}
+ {2405455200 10800 1 EEST}
{2424204000 7200 0 EET}
- {2437423200 10800 1 EEST}
+ {2437509600 10800 1 EEST}
{2455653600 7200 0 EET}
- {2468872800 10800 1 EEST}
- {2487708000 7200 0 EET}
- {2500322400 10800 1 EEST}
+ {2468959200 10800 1 EEST}
+ {2487103200 7200 0 EET}
+ {2500408800 10800 1 EEST}
{2519157600 7200 0 EET}
- {2531772000 10800 1 EEST}
+ {2531858400 10800 1 EEST}
{2550607200 7200 0 EET}
- {2563826400 10800 1 EEST}
+ {2563308000 10800 1 EEST}
{2582056800 7200 0 EET}
- {2595276000 10800 1 EEST}
+ {2595362400 10800 1 EEST}
{2613506400 7200 0 EET}
- {2626725600 10800 1 EEST}
+ {2626812000 10800 1 EEST}
{2644956000 7200 0 EET}
- {2658175200 10800 1 EEST}
- {2677010400 7200 0 EET}
- {2689624800 10800 1 EEST}
+ {2658261600 10800 1 EEST}
+ {2676405600 7200 0 EET}
+ {2689711200 10800 1 EEST}
{2708460000 7200 0 EET}
- {2721679200 10800 1 EEST}
+ {2721160800 10800 1 EEST}
{2739909600 7200 0 EET}
- {2753128800 10800 1 EEST}
+ {2752610400 10800 1 EEST}
{2771359200 7200 0 EET}
- {2784578400 10800 1 EEST}
+ {2784664800 10800 1 EEST}
{2802808800 7200 0 EET}
- {2816028000 10800 1 EEST}
+ {2816114400 10800 1 EEST}
{2834258400 7200 0 EET}
- {2847477600 10800 1 EEST}
+ {2847564000 10800 1 EEST}
{2866312800 7200 0 EET}
- {2878927200 10800 1 EEST}
+ {2879013600 10800 1 EEST}
{2897762400 7200 0 EET}
- {2910981600 10800 1 EEST}
+ {2910463200 10800 1 EEST}
{2929212000 7200 0 EET}
- {2942431200 10800 1 EEST}
+ {2941912800 10800 1 EEST}
{2960661600 7200 0 EET}
- {2973880800 10800 1 EEST}
+ {2973967200 10800 1 EEST}
{2992111200 7200 0 EET}
- {3005330400 10800 1 EEST}
- {3024165600 7200 0 EET}
- {3036780000 10800 1 EEST}
+ {3005416800 10800 1 EEST}
+ {3023560800 7200 0 EET}
+ {3036866400 10800 1 EEST}
{3055615200 7200 0 EET}
- {3068229600 10800 1 EEST}
+ {3068316000 10800 1 EEST}
{3087064800 7200 0 EET}
- {3100284000 10800 1 EEST}
+ {3099765600 10800 1 EEST}
{3118514400 7200 0 EET}
- {3131733600 10800 1 EEST}
+ {3131820000 10800 1 EEST}
{3149964000 7200 0 EET}
- {3163183200 10800 1 EEST}
+ {3163269600 10800 1 EEST}
{3181413600 7200 0 EET}
- {3194632800 10800 1 EEST}
- {3213468000 7200 0 EET}
- {3226082400 10800 1 EEST}
+ {3194719200 10800 1 EEST}
+ {3212863200 7200 0 EET}
+ {3226168800 10800 1 EEST}
{3244917600 7200 0 EET}
- {3258136800 10800 1 EEST}
+ {3257618400 10800 1 EEST}
{3276367200 7200 0 EET}
- {3289586400 10800 1 EEST}
+ {3289068000 10800 1 EEST}
{3307816800 7200 0 EET}
- {3321036000 10800 1 EEST}
+ {3321122400 10800 1 EEST}
{3339266400 7200 0 EET}
- {3352485600 10800 1 EEST}
- {3371320800 7200 0 EET}
- {3383935200 10800 1 EEST}
+ {3352572000 10800 1 EEST}
+ {3370716000 7200 0 EET}
+ {3384021600 10800 1 EEST}
{3402770400 7200 0 EET}
- {3415384800 10800 1 EEST}
+ {3415471200 10800 1 EEST}
{3434220000 7200 0 EET}
- {3447439200 10800 1 EEST}
+ {3446920800 10800 1 EEST}
{3465669600 7200 0 EET}
- {3478888800 10800 1 EEST}
+ {3478975200 10800 1 EEST}
{3497119200 7200 0 EET}
- {3510338400 10800 1 EEST}
+ {3510424800 10800 1 EEST}
{3528568800 7200 0 EET}
- {3541788000 10800 1 EEST}
- {3560623200 7200 0 EET}
- {3573237600 10800 1 EEST}
+ {3541874400 10800 1 EEST}
+ {3560018400 7200 0 EET}
+ {3573324000 10800 1 EEST}
{3592072800 7200 0 EET}
- {3605292000 10800 1 EEST}
+ {3604773600 10800 1 EEST}
{3623522400 7200 0 EET}
- {3636741600 10800 1 EEST}
+ {3636223200 10800 1 EEST}
{3654972000 7200 0 EET}
- {3668191200 10800 1 EEST}
+ {3668277600 10800 1 EEST}
{3686421600 7200 0 EET}
- {3699640800 10800 1 EEST}
+ {3699727200 10800 1 EEST}
{3717871200 7200 0 EET}
- {3731090400 10800 1 EEST}
+ {3731176800 10800 1 EEST}
{3749925600 7200 0 EET}
- {3762540000 10800 1 EEST}
+ {3762626400 10800 1 EEST}
{3781375200 7200 0 EET}
- {3794594400 10800 1 EEST}
+ {3794076000 10800 1 EEST}
{3812824800 7200 0 EET}
- {3826044000 10800 1 EEST}
+ {3825525600 10800 1 EEST}
{3844274400 7200 0 EET}
- {3857493600 10800 1 EEST}
+ {3857580000 10800 1 EEST}
{3875724000 7200 0 EET}
- {3888943200 10800 1 EEST}
- {3907778400 7200 0 EET}
- {3920392800 10800 1 EEST}
+ {3889029600 10800 1 EEST}
+ {3907173600 7200 0 EET}
+ {3920479200 10800 1 EEST}
{3939228000 7200 0 EET}
- {3951842400 10800 1 EEST}
+ {3951928800 10800 1 EEST}
{3970677600 7200 0 EET}
- {3983896800 10800 1 EEST}
+ {3983378400 10800 1 EEST}
{4002127200 7200 0 EET}
- {4015346400 10800 1 EEST}
+ {4015432800 10800 1 EEST}
{4033576800 7200 0 EET}
- {4046796000 10800 1 EEST}
+ {4046882400 10800 1 EEST}
{4065026400 7200 0 EET}
- {4078245600 10800 1 EEST}
- {4097080800 7200 0 EET}
+ {4078332000 10800 1 EEST}
+ {4096476000 7200 0 EET}
}
diff --git a/library/tzdata/Asia/Hebron b/library/tzdata/Asia/Hebron
index fe8f7e1..aa028d8 100644
--- a/library/tzdata/Asia/Hebron
+++ b/library/tzdata/Asia/Hebron
@@ -109,7 +109,7 @@ set TZData(:Asia/Hebron) {
{1395957600 10800 1 EEST}
{1414098000 7200 0 EET}
{1427493600 10800 1 EEST}
- {1445547600 7200 0 EET}
+ {1445551200 7200 0 EET}
{1458946800 10800 1 EEST}
{1477692000 7200 0 EET}
{1490396400 10800 1 EEST}
@@ -117,165 +117,165 @@ set TZData(:Asia/Hebron) {
{1521846000 10800 1 EEST}
{1540591200 7200 0 EET}
{1553810400 10800 1 EEST}
- {1572040800 7200 0 EET}
- {1585260000 10800 1 EEST}
- {1604095200 7200 0 EET}
- {1616709600 10800 1 EEST}
+ {1572037200 7200 0 EET}
+ {1585346400 10800 1 EEST}
+ {1603490400 7200 0 EET}
+ {1616796000 10800 1 EEST}
{1635544800 7200 0 EET}
- {1648159200 10800 1 EEST}
+ {1648245600 10800 1 EEST}
{1666994400 7200 0 EET}
- {1680213600 10800 1 EEST}
+ {1679695200 10800 1 EEST}
{1698444000 7200 0 EET}
- {1711663200 10800 1 EEST}
+ {1711749600 10800 1 EEST}
{1729893600 7200 0 EET}
- {1743112800 10800 1 EEST}
+ {1743199200 10800 1 EEST}
{1761343200 7200 0 EET}
- {1774562400 10800 1 EEST}
- {1793397600 7200 0 EET}
- {1806012000 10800 1 EEST}
+ {1774648800 10800 1 EEST}
+ {1792792800 7200 0 EET}
+ {1806098400 10800 1 EEST}
{1824847200 7200 0 EET}
- {1838066400 10800 1 EEST}
+ {1837548000 10800 1 EEST}
{1856296800 7200 0 EET}
- {1869516000 10800 1 EEST}
+ {1868997600 10800 1 EEST}
{1887746400 7200 0 EET}
- {1900965600 10800 1 EEST}
+ {1901052000 10800 1 EEST}
{1919196000 7200 0 EET}
- {1932415200 10800 1 EEST}
+ {1932501600 10800 1 EEST}
{1950645600 7200 0 EET}
- {1963864800 10800 1 EEST}
+ {1963951200 10800 1 EEST}
{1982700000 7200 0 EET}
- {1995314400 10800 1 EEST}
+ {1995400800 10800 1 EEST}
{2014149600 7200 0 EET}
- {2027368800 10800 1 EEST}
+ {2026850400 10800 1 EEST}
{2045599200 7200 0 EET}
- {2058818400 10800 1 EEST}
+ {2058300000 10800 1 EEST}
{2077048800 7200 0 EET}
- {2090268000 10800 1 EEST}
+ {2090354400 10800 1 EEST}
{2108498400 7200 0 EET}
- {2121717600 10800 1 EEST}
- {2140552800 7200 0 EET}
- {2153167200 10800 1 EEST}
+ {2121804000 10800 1 EEST}
+ {2139948000 7200 0 EET}
+ {2153253600 10800 1 EEST}
{2172002400 7200 0 EET}
- {2184616800 10800 1 EEST}
+ {2184703200 10800 1 EEST}
{2203452000 7200 0 EET}
- {2216671200 10800 1 EEST}
+ {2216152800 10800 1 EEST}
{2234901600 7200 0 EET}
- {2248120800 10800 1 EEST}
+ {2248207200 10800 1 EEST}
{2266351200 7200 0 EET}
- {2279570400 10800 1 EEST}
+ {2279656800 10800 1 EEST}
{2297800800 7200 0 EET}
- {2311020000 10800 1 EEST}
- {2329855200 7200 0 EET}
- {2342469600 10800 1 EEST}
+ {2311106400 10800 1 EEST}
+ {2329250400 7200 0 EET}
+ {2342556000 10800 1 EEST}
{2361304800 7200 0 EET}
- {2374524000 10800 1 EEST}
+ {2374005600 10800 1 EEST}
{2392754400 7200 0 EET}
- {2405973600 10800 1 EEST}
+ {2405455200 10800 1 EEST}
{2424204000 7200 0 EET}
- {2437423200 10800 1 EEST}
+ {2437509600 10800 1 EEST}
{2455653600 7200 0 EET}
- {2468872800 10800 1 EEST}
- {2487708000 7200 0 EET}
- {2500322400 10800 1 EEST}
+ {2468959200 10800 1 EEST}
+ {2487103200 7200 0 EET}
+ {2500408800 10800 1 EEST}
{2519157600 7200 0 EET}
- {2531772000 10800 1 EEST}
+ {2531858400 10800 1 EEST}
{2550607200 7200 0 EET}
- {2563826400 10800 1 EEST}
+ {2563308000 10800 1 EEST}
{2582056800 7200 0 EET}
- {2595276000 10800 1 EEST}
+ {2595362400 10800 1 EEST}
{2613506400 7200 0 EET}
- {2626725600 10800 1 EEST}
+ {2626812000 10800 1 EEST}
{2644956000 7200 0 EET}
- {2658175200 10800 1 EEST}
- {2677010400 7200 0 EET}
- {2689624800 10800 1 EEST}
+ {2658261600 10800 1 EEST}
+ {2676405600 7200 0 EET}
+ {2689711200 10800 1 EEST}
{2708460000 7200 0 EET}
- {2721679200 10800 1 EEST}
+ {2721160800 10800 1 EEST}
{2739909600 7200 0 EET}
- {2753128800 10800 1 EEST}
+ {2752610400 10800 1 EEST}
{2771359200 7200 0 EET}
- {2784578400 10800 1 EEST}
+ {2784664800 10800 1 EEST}
{2802808800 7200 0 EET}
- {2816028000 10800 1 EEST}
+ {2816114400 10800 1 EEST}
{2834258400 7200 0 EET}
- {2847477600 10800 1 EEST}
+ {2847564000 10800 1 EEST}
{2866312800 7200 0 EET}
- {2878927200 10800 1 EEST}
+ {2879013600 10800 1 EEST}
{2897762400 7200 0 EET}
- {2910981600 10800 1 EEST}
+ {2910463200 10800 1 EEST}
{2929212000 7200 0 EET}
- {2942431200 10800 1 EEST}
+ {2941912800 10800 1 EEST}
{2960661600 7200 0 EET}
- {2973880800 10800 1 EEST}
+ {2973967200 10800 1 EEST}
{2992111200 7200 0 EET}
- {3005330400 10800 1 EEST}
- {3024165600 7200 0 EET}
- {3036780000 10800 1 EEST}
+ {3005416800 10800 1 EEST}
+ {3023560800 7200 0 EET}
+ {3036866400 10800 1 EEST}
{3055615200 7200 0 EET}
- {3068229600 10800 1 EEST}
+ {3068316000 10800 1 EEST}
{3087064800 7200 0 EET}
- {3100284000 10800 1 EEST}
+ {3099765600 10800 1 EEST}
{3118514400 7200 0 EET}
- {3131733600 10800 1 EEST}
+ {3131820000 10800 1 EEST}
{3149964000 7200 0 EET}
- {3163183200 10800 1 EEST}
+ {3163269600 10800 1 EEST}
{3181413600 7200 0 EET}
- {3194632800 10800 1 EEST}
- {3213468000 7200 0 EET}
- {3226082400 10800 1 EEST}
+ {3194719200 10800 1 EEST}
+ {3212863200 7200 0 EET}
+ {3226168800 10800 1 EEST}
{3244917600 7200 0 EET}
- {3258136800 10800 1 EEST}
+ {3257618400 10800 1 EEST}
{3276367200 7200 0 EET}
- {3289586400 10800 1 EEST}
+ {3289068000 10800 1 EEST}
{3307816800 7200 0 EET}
- {3321036000 10800 1 EEST}
+ {3321122400 10800 1 EEST}
{3339266400 7200 0 EET}
- {3352485600 10800 1 EEST}
- {3371320800 7200 0 EET}
- {3383935200 10800 1 EEST}
+ {3352572000 10800 1 EEST}
+ {3370716000 7200 0 EET}
+ {3384021600 10800 1 EEST}
{3402770400 7200 0 EET}
- {3415384800 10800 1 EEST}
+ {3415471200 10800 1 EEST}
{3434220000 7200 0 EET}
- {3447439200 10800 1 EEST}
+ {3446920800 10800 1 EEST}
{3465669600 7200 0 EET}
- {3478888800 10800 1 EEST}
+ {3478975200 10800 1 EEST}
{3497119200 7200 0 EET}
- {3510338400 10800 1 EEST}
+ {3510424800 10800 1 EEST}
{3528568800 7200 0 EET}
- {3541788000 10800 1 EEST}
- {3560623200 7200 0 EET}
- {3573237600 10800 1 EEST}
+ {3541874400 10800 1 EEST}
+ {3560018400 7200 0 EET}
+ {3573324000 10800 1 EEST}
{3592072800 7200 0 EET}
- {3605292000 10800 1 EEST}
+ {3604773600 10800 1 EEST}
{3623522400 7200 0 EET}
- {3636741600 10800 1 EEST}
+ {3636223200 10800 1 EEST}
{3654972000 7200 0 EET}
- {3668191200 10800 1 EEST}
+ {3668277600 10800 1 EEST}
{3686421600 7200 0 EET}
- {3699640800 10800 1 EEST}
+ {3699727200 10800 1 EEST}
{3717871200 7200 0 EET}
- {3731090400 10800 1 EEST}
+ {3731176800 10800 1 EEST}
{3749925600 7200 0 EET}
- {3762540000 10800 1 EEST}
+ {3762626400 10800 1 EEST}
{3781375200 7200 0 EET}
- {3794594400 10800 1 EEST}
+ {3794076000 10800 1 EEST}
{3812824800 7200 0 EET}
- {3826044000 10800 1 EEST}
+ {3825525600 10800 1 EEST}
{3844274400 7200 0 EET}
- {3857493600 10800 1 EEST}
+ {3857580000 10800 1 EEST}
{3875724000 7200 0 EET}
- {3888943200 10800 1 EEST}
- {3907778400 7200 0 EET}
- {3920392800 10800 1 EEST}
+ {3889029600 10800 1 EEST}
+ {3907173600 7200 0 EET}
+ {3920479200 10800 1 EEST}
{3939228000 7200 0 EET}
- {3951842400 10800 1 EEST}
+ {3951928800 10800 1 EEST}
{3970677600 7200 0 EET}
- {3983896800 10800 1 EEST}
+ {3983378400 10800 1 EEST}
{4002127200 7200 0 EET}
- {4015346400 10800 1 EEST}
+ {4015432800 10800 1 EEST}
{4033576800 7200 0 EET}
- {4046796000 10800 1 EEST}
+ {4046882400 10800 1 EEST}
{4065026400 7200 0 EET}
- {4078245600 10800 1 EEST}
- {4097080800 7200 0 EET}
+ {4078332000 10800 1 EEST}
+ {4096476000 7200 0 EET}
}
diff --git a/library/tzdata/Asia/Shanghai b/library/tzdata/Asia/Shanghai
index 66bc4339..0fcf802 100644
--- a/library/tzdata/Asia/Shanghai
+++ b/library/tzdata/Asia/Shanghai
@@ -3,6 +3,8 @@
set TZData(:Asia/Shanghai) {
{-9223372036854775808 29143 0 LMT}
{-2177481943 28800 0 CST}
+ {-1600675200 32400 1 CDT}
+ {-1585904400 28800 0 CST}
{-933667200 32400 1 CDT}
{-922093200 28800 0 CST}
{-908870400 32400 1 CDT}
diff --git a/library/tzdata/Europe/Budapest b/library/tzdata/Europe/Budapest
index e660ad1..4b92c5f 100644
--- a/library/tzdata/Europe/Budapest
+++ b/library/tzdata/Europe/Budapest
@@ -2,17 +2,19 @@
set TZData(:Europe/Budapest) {
{-9223372036854775808 4580 0 LMT}
- {-2500938980 3600 0 CET}
+ {-2498260580 3600 0 CET}
{-1693706400 7200 1 CEST}
{-1680483600 3600 0 CET}
{-1663455600 7200 1 CEST}
{-1650150000 3600 0 CET}
{-1640998800 3600 0 CET}
- {-1633212000 7200 1 CEST}
+ {-1632006000 7200 1 CEST}
{-1618700400 3600 0 CET}
- {-1600466400 7200 1 CEST}
- {-1581202800 3600 0 CET}
- {-906771600 3600 0 CET}
+ {-1600470000 7200 1 CEST}
+ {-1587250800 3600 0 CET}
+ {-1569711600 7200 1 CEST}
+ {-1555196400 3600 0 CET}
+ {-906775200 3600 0 CET}
{-857257200 3600 0 CET}
{-844556400 7200 1 CEST}
{-828226800 3600 0 CET}
@@ -20,33 +22,32 @@ set TZData(:Europe/Budapest) {
{-796777200 3600 0 CET}
{-788922000 3600 0 CET}
{-778471200 7200 1 CEST}
- {-762660000 3600 0 CET}
+ {-762656400 3600 0 CET}
{-749689200 7200 1 CEST}
- {-733359600 3600 0 CET}
+ {-733276800 3600 0 CET}
{-717634800 7200 1 CEST}
{-701910000 3600 0 CET}
{-686185200 7200 1 CEST}
{-670460400 3600 0 CET}
{-654130800 7200 1 CEST}
{-639010800 3600 0 CET}
- {-621990000 7200 1 CEST}
- {-605660400 3600 0 CET}
{-492656400 7200 1 CEST}
{-481168800 3600 0 CET}
- {-461120400 7200 1 CEST}
- {-449632800 3600 0 CET}
- {-428547600 7200 1 CEST}
- {-418269600 3600 0 CET}
- {-397094400 7200 1 CEST}
+ {-461199600 7200 1 CEST}
+ {-449708400 3600 0 CET}
+ {-428540400 7200 1 CEST}
+ {-418258800 3600 0 CET}
+ {-397090800 7200 1 CEST}
{-386809200 3600 0 CET}
- {323827200 7200 1 CEST}
- {338950800 3600 0 CET}
- {354675600 7200 1 CEST}
- {370400400 3600 0 CET}
- {386125200 7200 1 CEST}
- {401850000 3600 0 CET}
- {417574800 7200 1 CEST}
- {433299600 3600 0 CET}
+ {323823600 7200 1 CEST}
+ {338943600 3600 0 CET}
+ {354668400 7200 1 CEST}
+ {370393200 3600 0 CET}
+ {386118000 7200 1 CEST}
+ {401842800 3600 0 CET}
+ {417567600 7200 1 CEST}
+ {433292400 3600 0 CET}
+ {441759600 3600 0 CET}
{449024400 7200 1 CEST}
{465354000 3600 0 CET}
{481078800 7200 1 CEST}
diff --git a/library/tzdata/Europe/Monaco b/library/tzdata/Europe/Monaco
index f887b0b..7428b2f 100644
--- a/library/tzdata/Europe/Monaco
+++ b/library/tzdata/Europe/Monaco
@@ -2,8 +2,8 @@
set TZData(:Europe/Monaco) {
{-9223372036854775808 1772 0 LMT}
- {-2486680172 561 0 PMT}
- {-1855958961 0 0 WET}
+ {-2448318572 561 0 PMT}
+ {-1854403761 0 0 WET}
{-1689814800 3600 1 WEST}
{-1680397200 0 0 WET}
{-1665363600 3600 1 WEST}
diff --git a/library/tzdata/Europe/Paris b/library/tzdata/Europe/Paris
index 4b22a09..7208e55 100644
--- a/library/tzdata/Europe/Paris
+++ b/library/tzdata/Europe/Paris
@@ -2,8 +2,8 @@
set TZData(:Europe/Paris) {
{-9223372036854775808 561 0 LMT}
- {-2486678901 561 0 PMT}
- {-1855958901 0 0 WET}
+ {-2486592561 561 0 PMT}
+ {-1855958961 0 0 WET}
{-1689814800 3600 1 WEST}
{-1680397200 0 0 WET}
{-1665363600 3600 1 WEST}
diff --git a/library/tzdata/Pacific/Fiji b/library/tzdata/Pacific/Fiji
index e316b93..a062913 100644
--- a/library/tzdata/Pacific/Fiji
+++ b/library/tzdata/Pacific/Fiji
@@ -29,7 +29,7 @@ set TZData(:Pacific/Fiji) {
{1547301600 43200 0 +12}
{1573308000 46800 1 +12}
{1578751200 43200 0 +12}
- {1604757600 46800 1 +12}
+ {1608386400 46800 1 +12}
{1610805600 43200 0 +12}
{1636812000 46800 1 +12}
{1642255200 43200 0 +12}
diff --git a/library/word.tcl b/library/word.tcl
index 0246530..58ff4dc 100644
--- a/library/word.tcl
+++ b/library/word.tcl
@@ -4,8 +4,8 @@
# strings. This file is primarily needed so Tk text and entry widgets behave
# properly for different platforms.
#
-# Copyright (c) 1996 by Sun Microsystems, Inc.
-# Copyright (c) 1998 by Scritpics Corporation.
+# Copyright © 1996 Sun Microsystems, Inc.
+# Copyright © 1998 Scritpics Corporation.
#
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
@@ -136,7 +136,9 @@ proc tcl_startOfNextWord {str start} {
proc tcl_startOfPreviousWord {str start} {
variable ::tcl::WordBreakRE
set word {-1 -1}
- regexp -indices -- $WordBreakRE(previous) [string range $str 0 $start-1] \
- result word
+ if {$start > 0} {
+ regexp -indices -- $WordBreakRE(previous) [string range $str 0 $start-1] \
+ result word
+ }
return [lindex $word 0]
}