lumenize
Version:
Illuminating the forest AND the trees in your data.
841 lines (719 loc) • 533 kB
JavaScript
/*
lumenize version: 1.2.0
*/
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"wlmLJI":[function(require,module,exports){
// Generated by CoffeeScript 1.10.0
/*
* Lumenize #
Lumenize provides tools for aggregating data and creating time series and other temporal visualizations.
The primary time-series aggregating functionality is provided by:
* Lumenize.TimeSeriesCalculator - Sets of single-metric series or group-by series
* Lumenize.TransitionsCalculator - Counts or sums for items moving from one state to another
* Lumenize.TimeInStateCalculator - Cumulative amount of time unique work items spend in a particular state
Simple group-by, 2D pivot-table and even multi-dimensional aggregations (OLAP cube) are provided by:
* Lumenize.OLAPCube - Used by above three Calculators but also useful stand-alone, particularly for hierarchical roll-ups
All of the above use the mathematical and statistical functions provided by:
* Lumenize.functions - count, sum, standardDeviation, percentile coverage, min, max, etc.
Three transformation functions are provided:
* Lumenize.arrayOfMaps_To_CSVStyleArray - Used to transform from record to table format
* Lumenize.csvStyleArray_To_ArrayOfMaps - Used to transform from table to record format
* Lumenize.arrayOfMaps_To_HighChartsSeries - Used to transform from record format to the format expected by the HighCharts charting library
And last, additional functionality is provided by:
* Lumenize.histogram - create a histogram of scatter data
* Lumenize.utils - utility methods used by the rest of Lumenize (type, clone, array/object functions, etc.)
*/
(function() {
var datatransform, tzTime;
tzTime = require('tztime');
exports.Time = tzTime.Time;
exports.TimelineIterator = tzTime.TimelineIterator;
exports.Timeline = tzTime.Timeline;
exports.utils = tzTime.utils;
exports.TimeInStateCalculator = require('./src/TimeInStateCalculator').TimeInStateCalculator;
exports.TransitionsCalculator = require('./src/TransitionsCalculator').TransitionsCalculator;
exports.TimeSeriesCalculator = require('./src/TimeSeriesCalculator').TimeSeriesCalculator;
datatransform = require('./src/dataTransform');
exports.arrayOfMaps_To_CSVStyleArray = datatransform.arrayOfMaps_To_CSVStyleArray;
exports.csvStyleArray_To_ArrayOfMaps = datatransform.csvStyleArray_To_ArrayOfMaps;
exports.arrayOfMaps_To_HighChartsSeries = datatransform.arrayOfMaps_To_HighChartsSeries;
exports.csvString_To_CSVStyleArray = datatransform.csvString_To_CSVStyleArray;
exports.csvStyleArray_To_CSVString = datatransform.csvStyleArray_To_CSVString;
exports.functions = require('./src/functions').functions;
exports.histogram = require('./src/histogram').histogram;
exports.multiRegression = require('./src/multiRegression').multiRegression;
exports.table = require('./src/table').table;
exports.OLAPCube = require('./src/OLAPCube').OLAPCube;
exports.anova = require('./src/anova').anova;
exports.distributions = require('./src/distributions').distributions;
exports.BayesianClassifier = require('./src/Classifier').BayesianClassifier;
exports.Classifier = require('./src/Classifier').Classifier;
exports.Store = require('./src/Store').Store;
exports.RandomPicker = require('./src/RandomPicker').RandomPicker;
}).call(this);
},{"./src/Classifier":11,"./src/OLAPCube":12,"./src/RandomPicker":13,"./src/Store":14,"./src/TimeInStateCalculator":15,"./src/TimeSeriesCalculator":16,"./src/TransitionsCalculator":17,"./src/anova":18,"./src/dataTransform":20,"./src/distributions":21,"./src/functions":22,"./src/histogram":23,"./src/multiRegression":24,"./src/table":25,"tztime":10}],"lumenize":[function(require,module,exports){
module.exports=require('wlmLJI');
},{}],3:[function(require,module,exports){
(function (process){
// Copyright Joyent, Inc. and other Node contributors.
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to permit
// persons to whom the Software is furnished to do so, subject to the
// following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
// USE OR OTHER DEALINGS IN THE SOFTWARE.
// resolves . and .. elements in a path array with directory names there
// must be no slashes, empty elements, or device names (c:\) in the array
// (so also no leading and trailing slashes - it does not distinguish
// relative and absolute paths)
function normalizeArray(parts, allowAboveRoot) {
// if the path tries to go above the root, `up` ends up > 0
var up = 0;
for (var i = parts.length - 1; i >= 0; i--) {
var last = parts[i];
if (last === '.') {
parts.splice(i, 1);
} else if (last === '..') {
parts.splice(i, 1);
up++;
} else if (up) {
parts.splice(i, 1);
up--;
}
}
// if the path is allowed to go above the root, restore leading ..s
if (allowAboveRoot) {
for (; up--; up) {
parts.unshift('..');
}
}
return parts;
}
// Split a filename into [root, dir, basename, ext], unix version
// 'root' is just a slash, or nothing.
var splitPathRe =
/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
var splitPath = function(filename) {
return splitPathRe.exec(filename).slice(1);
};
// path.resolve([from ...], to)
// posix version
exports.resolve = function() {
var resolvedPath = '',
resolvedAbsolute = false;
for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
var path = (i >= 0) ? arguments[i] : process.cwd();
// Skip empty and invalid entries
if (typeof path !== 'string') {
throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
continue;
}
resolvedPath = path + '/' + resolvedPath;
resolvedAbsolute = path.charAt(0) === '/';
}
// At this point the path should be resolved to a full absolute path, but
// handle relative paths to be safe (might happen when process.cwd() fails)
// Normalize the path
resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
return !!p;
}), !resolvedAbsolute).join('/');
return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
};
// path.normalize(path)
// posix version
exports.normalize = function(path) {
var isAbsolute = exports.isAbsolute(path),
trailingSlash = substr(path, -1) === '/';
// Normalize the path
path = normalizeArray(filter(path.split('/'), function(p) {
return !!p;
}), !isAbsolute).join('/');
if (!path && !isAbsolute) {
path = '.';
}
if (path && trailingSlash) {
path += '/';
}
return (isAbsolute ? '/' : '') + path;
};
// posix version
exports.isAbsolute = function(path) {
return path.charAt(0) === '/';
};
// posix version
exports.join = function() {
var paths = Array.prototype.slice.call(arguments, 0);
return exports.normalize(filter(paths, function(p, index) {
if (typeof p !== 'string') {
throw new TypeError('Arguments to path.join must be strings');
}
return p;
}).join('/'));
};
// path.relative(from, to)
// posix version
exports.relative = function(from, to) {
from = exports.resolve(from).substr(1);
to = exports.resolve(to).substr(1);
function trim(arr) {
var start = 0;
for (; start < arr.length; start++) {
if (arr[start] !== '') break;
}
var end = arr.length - 1;
for (; end >= 0; end--) {
if (arr[end] !== '') break;
}
if (start > end) return [];
return arr.slice(start, end - start + 1);
}
var fromParts = trim(from.split('/'));
var toParts = trim(to.split('/'));
var length = Math.min(fromParts.length, toParts.length);
var samePartsLength = length;
for (var i = 0; i < length; i++) {
if (fromParts[i] !== toParts[i]) {
samePartsLength = i;
break;
}
}
var outputParts = [];
for (var i = samePartsLength; i < fromParts.length; i++) {
outputParts.push('..');
}
outputParts = outputParts.concat(toParts.slice(samePartsLength));
return outputParts.join('/');
};
exports.sep = '/';
exports.delimiter = ':';
exports.dirname = function(path) {
var result = splitPath(path),
root = result[0],
dir = result[1];
if (!root && !dir) {
// No dirname whatsoever
return '.';
}
if (dir) {
// It has a dirname, strip trailing slash
dir = dir.substr(0, dir.length - 1);
}
return root + dir;
};
exports.basename = function(path, ext) {
var f = splitPath(path)[2];
// TODO: make this comparison case-insensitive on windows?
if (ext && f.substr(-1 * ext.length) === ext) {
f = f.substr(0, f.length - ext.length);
}
return f;
};
exports.extname = function(path) {
return splitPath(path)[3];
};
function filter (xs, f) {
if (xs.filter) return xs.filter(f);
var res = [];
for (var i = 0; i < xs.length; i++) {
if (f(xs[i], i, xs)) res.push(xs[i]);
}
return res;
}
// String.prototype.substr - negative index don't work in IE8
var substr = 'ab'.substr(-1) === 'b'
? function (str, start, len) { return str.substr(start, len) }
: function (str, start, len) {
if (start < 0) start = str.length + start;
return str.substr(start, len);
}
;
}).call(this,require("FWaASH"))
},{"FWaASH":4}],4:[function(require,module,exports){
// shim for using process in browser
var process = module.exports = {};
process.nextTick = (function () {
var canSetImmediate = typeof window !== 'undefined'
&& window.setImmediate;
var canPost = typeof window !== 'undefined'
&& window.postMessage && window.addEventListener
;
if (canSetImmediate) {
return function (f) { return window.setImmediate(f) };
}
if (canPost) {
var queue = [];
window.addEventListener('message', function (ev) {
var source = ev.source;
if ((source === window || source === null) && ev.data === 'process-tick') {
ev.stopPropagation();
if (queue.length > 0) {
var fn = queue.shift();
fn();
}
}
}, true);
return function nextTick(fn) {
queue.push(fn);
window.postMessage('process-tick', '*');
};
}
return function nextTick(fn) {
setTimeout(fn, 0);
};
})();
process.title = 'browser';
process.browser = true;
process.env = {};
process.argv = [];
function noop() {}
process.on = noop;
process.addListener = noop;
process.once = noop;
process.off = noop;
process.removeListener = noop;
process.removeAllListeners = noop;
process.emit = noop;
process.binding = function (name) {
throw new Error('process.binding is not supported');
}
// TODO(shtylman)
process.cwd = function () { return '/' };
process.chdir = function (dir) {
throw new Error('process.chdir is not supported');
};
},{}],5:[function(require,module,exports){
/*
* Copyright 2010 Matthew Eernisse (mde@fleegix.org)
* and Open Source Applications Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Credits: Ideas included from incomplete JS implementation of Olson
* parser, "XMLDAte" by Philippe Goetz (philippe.goetz@wanadoo.fr)
*
* Contributions:
* Jan Niehusmann
* Ricky Romero
* Preston Hunt (prestonhunt@gmail.com),
* Dov. B Katz (dov.katz@morganstanley.com),
* Peter Bergström (pbergstr@mac.com)
*/
if (typeof fleegix == 'undefined') { var fleegix = {}; }
if (typeof exports.timezoneJS == 'undefined') { exports.timezoneJS = {}; }
path = require('path');
utils = require('../src/utils');
exports.timezoneJS.timezone = new function() {
var _this = this;
var monthMap = { 'jan': 0, 'feb': 1, 'mar': 2, 'apr': 3,'may': 4, 'jun': 5,
'jul': 6, 'aug': 7, 'sep': 8, 'oct': 9, 'nov': 10, 'dec': 11 };
var dayMap = {'sun': 0,'mon' :1, 'tue': 2, 'wed': 3, 'thu': 4, 'fri': 5, 'sat': 6 };
var regionMap = {'EST':'northamerica','MST':'northamerica','HST':'northamerica','EST5EDT':'northamerica','CST6CDT':'northamerica','MST7MDT':'northamerica','PST8PDT':'northamerica','America':'northamerica','Pacific':'australasia','Atlantic':'europe','Africa':'africa','Indian':'africa','Antarctica':'antarctica','Asia':'asia','Australia':'australasia','Europe':'europe','WET':'europe','CET':'europe','MET':'europe','EET':'europe'};
var regionExceptions = {'Pacific/Honolulu':'northamerica','Atlantic/Bermuda':'northamerica','Atlantic/Cape_Verde':'africa','Atlantic/St_Helena':'africa','Indian/Kerguelen':'antarctica','Indian/Chagos':'asia','Indian/Maldives':'asia','Indian/Christmas':'australasia','Indian/Cocos':'australasia','America/Danmarkshavn':'europe','America/Scoresbysund':'europe','America/Godthab':'europe','America/Thule':'europe','Asia/Yekaterinburg':'europe','Asia/Omsk':'europe','Asia/Novosibirsk':'europe','Asia/Krasnoyarsk':'europe','Asia/Irkutsk':'europe','Asia/Yakutsk':'europe','Asia/Vladivostok':'europe','Asia/Sakhalin':'europe','Asia/Magadan':'europe','Asia/Kamchatka':'europe','Asia/Anadyr':'europe','Africa/Ceuta':'europe','America/Argentina/Buenos_Aires':'southamerica','America/Argentina/Cordoba':'southamerica','America/Argentina/Tucuman':'southamerica','America/Argentina/La_Rioja':'southamerica','America/Argentina/San_Juan':'southamerica','America/Argentina/Jujuy':'southamerica','America/Argentina/Catamarca':'southamerica','America/Argentina/Mendoza':'southamerica','America/Argentina/Rio_Gallegos':'southamerica','America/Argentina/Ushuaia':'southamerica','America/Aruba':'southamerica','America/La_Paz':'southamerica','America/Noronha':'southamerica','America/Belem':'southamerica','America/Fortaleza':'southamerica','America/Recife':'southamerica','America/Araguaina':'southamerica','America/Maceio':'southamerica','America/Bahia':'southamerica','America/Sao_Paulo':'southamerica','America/Campo_Grande':'southamerica','America/Cuiaba':'southamerica','America/Porto_Velho':'southamerica','America/Boa_Vista':'southamerica','America/Manaus':'southamerica','America/Eirunepe':'southamerica','America/Rio_Branco':'southamerica','America/Santiago':'southamerica','Pacific/Easter':'southamerica','America/Bogota':'southamerica','America/Curacao':'southamerica','America/Guayaquil':'southamerica','Pacific/Galapagos':'southamerica','Atlantic/Stanley':'southamerica','America/Cayenne':'southamerica','America/Guyana':'southamerica','America/Asuncion':'southamerica','America/Lima':'southamerica','Atlantic/South_Georgia':'southamerica','America/Paramaribo':'southamerica','America/Port_of_Spain':'southamerica','America/Montevideo':'southamerica','America/Caracas':'southamerica'};
function invalidTZError(t) {
throw new Error('Timezone "' + t + '" is either incorrect, or not loaded in the timezone registry.');
}
function builtInLoadZoneFile(fileName, opts) {
if (typeof fleegix.xhr == 'undefined') {
throw new Error('Please use the Fleegix.js XHR module, or define your own transport mechanism for downloading zone files.');
}
var url = _this.zoneFileBasePath + '/' + fileName;
if (!opts.async) {
var ret = fleegix.xhr.doReq({
url: url,
async: false
});
return _this.parseZones(ret);
}
else {
return fleegix.xhr.send({
url: url,
method: 'get',
handleSuccess: function (str) {
if (_this.parseZones(str)) {
if (typeof opts.callback == 'function') {
opts.callback();
}
}
return true;
},
handleErr: function () {
throw new Error('Error retrieving "' + url + '" zoneinfo file.');
}
});
}
}
//
//function myLoadZoneFile(fileName, opts) {
// var url = path.join(_this.zoneFileBasePath, fileName) + '.lzw';
//
// // If running in node.js
// if (fs.readFileSync) {
// url = path.join(__dirname, url);
//
// var ret
// if (fs.existsSync(url)) {
// ret = utils.lzwDecode(fs.readFileSync(url, 'utf8'));
// } else {
// throw new Error('Cannot find ' + url + ' from directory ' + __dirname);
// }
// return _this.parseZones(ret);
// }
//
// // If running in the browser assume tz files are "fileified" into the source and can be "require"d
// var files = require('files');
// var filesName = 'tz/' + fileName + '.lzw'
// if (files[filesName]) {
// return _this.parseZones(utils.lzwDecode(files[filesName]));
// } else {
// throw new Error(filesName + ' not found embedded in this package.');
// };
//}
function getRegionForTimezone(tz) {
var exc = regionExceptions[tz];
var ret;
if (exc) {
return exc;
}
else {
reg = tz.split('/')[0];
ret = regionMap[reg];
// If there's nothing listed in the main regions for
// this TZ, check the 'backward' links
if (!ret) {
var link = _this.zones[tz];
if (typeof link == 'string') {
return getRegionForTimezone(link);
}
else {
// Backward-compat file hasn't loaded yet, try looking in there
if (!_this.loadedZones.backward) {
// This is for obvious legacy zones (e.g., Iceland) that
// don't even have a prefix like "America/" that look like
// normal zones
var parsed = _this.loadZoneFile('backward', true);
return getRegionForTimezone(tz);
}
else {
invalidTZError(tz);
}
}
}
return ret;
}
}
function parseTimeString(str) {
var pat = /(\d+)(?::0*(\d*))?(?::0*(\d*))?([wsugz])?$/;
var hms = str.match(pat);
hms[1] = parseInt(hms[1], 10);
hms[2] = hms[2] ? parseInt(hms[2], 10) : 0;
hms[3] = hms[3] ? parseInt(hms[3], 10) : 0;
return hms;
}
function getZone(dt, tz) {
var t = tz;
var zoneList = _this.zones[t];
// Follow links to get to an acutal zone
while (typeof zoneList == "string") {
t = zoneList;
zoneList = _this.zones[t];
}
if (!zoneList) {
// Backward-compat file hasn't loaded yet, try looking in there
if (!_this.loadedZones.backward) {
// This is for backward entries like "America/Fort_Wayne" that
// getRegionForTimezone *thinks* it has a region file and zone
// for (e.g., America => 'northamerica'), but in reality it's a
// legacy zone we need the backward file for
var parsed = _this.loadZoneFile('backward', true);
return getZone(dt, tz);
}
invalidTZError(t);
}
for(var i = 0; i < zoneList.length; i++) {
var z = zoneList[i];
if (!z[3]) { break; }
var yea = parseInt(z[3], 10);
var mon = 11;
var dat = 31;
if (z[4]) {
mon = monthMap[z[4].substr(0, 3).toLowerCase()];
dat = parseInt(z[5], 10);
}
var t = z[6] ? z[6] : '23:59:59';
t = parseTimeString(t);
var d = Date.UTC(yea, mon, dat, t[1], t[2], t[3]);
if (dt.getTime() < d) { break; }
}
if (i == zoneList.length) { throw new Error('No Zone found for "' + timezone + '" on ' + dt); }
return zoneList[i];
}
function getBasicOffset(z) {
var off = parseTimeString(z[0]);
var adj = z[0].indexOf('-') == 0 ? -1 : 1
off = adj * (((off[1] * 60 + off[2]) *60 + off[3]) * 1000);
return -off/60/1000;
}
// if isUTC is true, date is given in UTC, otherwise it's given
// in local time (ie. date.getUTC*() returns local time components)
function getRule( date, zone, isUTC ) {
var ruleset = zone[1];
var basicOffset = getBasicOffset( zone );
// Convert a date to UTC. Depending on the 'type' parameter, the date
// parameter may be:
// 'u', 'g', 'z': already UTC (no adjustment)
// 's': standard time (adjust for time zone offset but not for DST)
// 'w': wall clock time (adjust for both time zone and DST offset)
//
// DST adjustment is done using the rule given as third argument
var convertDateToUTC = function( date, type, rule ) {
var offset = 0;
if(type == 'u' || type == 'g' || type == 'z') { // UTC
offset = 0;
} else if(type == 's') { // Standard Time
offset = basicOffset;
} else if(type == 'w' || !type ) { // Wall Clock Time
offset = getAdjustedOffset(basicOffset,rule);
} else {
throw("unknown type "+type);
}
offset *= 60*1000; // to millis
return new Date( date.getTime() + offset );
}
// Step 1: Find applicable rules for this year.
// Step 2: Sort the rules by effective date.
// Step 3: Check requested date to see if a rule has yet taken effect this year. If not,
// Step 4: Get the rules for the previous year. If there isn't an applicable rule for last year, then
// there probably is no current time offset since they seem to explicitly turn off the offset
// when someone stops observing DST.
// FIXME if this is not the case and we'll walk all the way back (ugh).
// Step 5: Sort the rules by effective date.
// Step 6: Apply the most recent rule before the current time.
var convertRuleToExactDateAndTime = function( yearAndRule, prevRule )
{
var year = yearAndRule[0];
var rule = yearAndRule[1];
// Assume that the rule applies to the year of the given date.
var months = {
"Jan": 0, "Feb": 1, "Mar": 2, "Apr": 3, "May": 4, "Jun": 5,
"Jul": 6, "Aug": 7, "Sep": 8, "Oct": 9, "Nov": 10, "Dec": 11
};
var days = {
"sun": 0, "mon": 1, "tue": 2, "wed": 3, "thu": 4, "fri": 5, "sat": 6
}
var hms = parseTimeString( rule[ 5 ] );
var effectiveDate;
if ( !isNaN( rule[ 4 ] ) ) // If we have a specific date, use that!
{
effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ], rule[ 4 ], hms[ 1 ], hms[ 2 ], hms[ 3 ], 0 ) );
}
else // Let's hunt for the date.
{
var targetDay,
operator;
if ( rule[ 4 ].substr( 0, 4 ) === "last" ) // Example: lastThu
{
// Start at the last day of the month and work backward.
effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ] + 1, 1, hms[ 1 ] - 24, hms[ 2 ], hms[ 3 ], 0 ) );
targetDay = days[ rule[ 4 ].substr( 4, 3 ).toLowerCase( ) ];
operator = "<=";
}
else // Example: Sun>=15
{
// Start at the specified date.
effectiveDate = new Date( Date.UTC( year, months[ rule[ 3 ] ], rule[ 4 ].substr( 5 ), hms[ 1 ], hms[ 2 ], hms[ 3 ], 0 ) );
targetDay = days[ rule[ 4 ].substr( 0, 3 ).toLowerCase( ) ];
operator = rule[ 4 ].substr( 3, 2 );
}
var ourDay = effectiveDate.getUTCDay( );
if ( operator === ">=" ) // Go forwards.
{
effectiveDate.setUTCDate( effectiveDate.getUTCDate( ) + ( targetDay - ourDay + ( ( targetDay < ourDay ) ? 7 : 0 ) ) );
}
else // Go backwards. Looking for the last of a certain day, or operator is "<=" (less likely).
{
effectiveDate.setUTCDate( effectiveDate.getUTCDate( ) + ( targetDay - ourDay - ( ( targetDay > ourDay ) ? 7 : 0 ) ) );
}
}
// if previous rule is given, correct for the fact that the starting time of the current
// rule may be specified in local time
if(prevRule) {
effectiveDate = convertDateToUTC(effectiveDate, hms[4], prevRule);
}
return effectiveDate;
}
var findApplicableRules = function( year, ruleset )
{
var applicableRules = [];
for ( var i in ruleset )
{
if ( Number( ruleset[ i ][ 0 ] ) <= year ) // Exclude future rules.
{
if (
Number( ruleset[ i ][ 1 ] ) >= year // Date is in a set range.
|| ( Number( ruleset[ i ][ 0 ] ) === year && ruleset[ i ][ 1 ] === "only" ) // Date is in an "only" year.
|| ruleset[ i ][ 1 ] === "max" // We're in a range from the start year to infinity.
)
{
// It's completely okay to have any number of matches here.
// Normally we should only see two, but that doesn't preclude other numbers of matches.
// These matches are applicable to this year.
applicableRules.push( [year, ruleset[ i ]] );
}
}
}
return applicableRules;
}
var compareDates = function( a, b, prev )
{
if ( a.constructor !== Date ) {
a = convertRuleToExactDateAndTime( a, prev );
} else if(prev) {
a = convertDateToUTC(a, isUTC?'u':'w', prev);
}
if ( b.constructor !== Date ) {
b = convertRuleToExactDateAndTime( b, prev );
} else if(prev) {
b = convertDateToUTC(b, isUTC?'u':'w', prev);
}
a = Number( a );
b = Number( b );
return a - b;
}
var year = date.getUTCFullYear( );
var applicableRules;
applicableRules = findApplicableRules( year, _this.rules[ ruleset ] );
applicableRules.push( date );
// While sorting, the time zone in which the rule starting time is specified
// is ignored. This is ok as long as the timespan between two DST changes is
// larger than the DST offset, which is probably always true.
// As the given date may indeed be close to a DST change, it may get sorted
// to a wrong position (off by one), which is corrected below.
applicableRules.sort( compareDates );
if ( applicableRules.indexOf( date ) < 2 ) { // If there are not enough past DST rules...
applicableRules = applicableRules.concat(findApplicableRules( year-1, _this.rules[ ruleset ] ));
applicableRules.sort( compareDates );
}
var pinpoint = applicableRules.indexOf( date );
if ( pinpoint > 1 && compareDates( date, applicableRules[pinpoint-1], applicableRules[pinpoint-2][1] ) < 0 ) {
// the previous rule does not really apply, take the one before that
return applicableRules[ pinpoint - 2 ][1];
} else if ( pinpoint > 0 && pinpoint < applicableRules.length - 1 && compareDates( date, applicableRules[pinpoint+1], applicableRules[pinpoint-1][1] ) > 0) {
// the next rule does already apply, take that one
return applicableRules[ pinpoint + 1 ][1];
} else if ( pinpoint === 0 ) {
// no applicable rule found in this and in previous year
return null;
} else {
return applicableRules[ pinpoint - 1 ][1];
}
}
function getAdjustedOffset(off, rule) {
var save = rule[6];
var t = parseTimeString(save);
var adj = save.indexOf('-') == 0 ? -1 : 1;
var ret = (adj*(((t[1] *60 + t[2]) * 60 + t[3]) * 1000));
ret = ret/60/1000;
ret -= off
ret = -Math.ceil(ret);
return ret;
}
function getAbbreviation(zone, rule) {
var res;
var base = zone[2];
if (base.indexOf('%s') > -1) {
var repl;
if (rule) {
repl = rule[7]=='-'?'':rule[7];
}
// FIXME: Right now just falling back to Standard --
// apparently ought to use the last valid rule,
// although in practice that always ought to be Standard
else {
repl = 'S';
}
res = base.replace('%s', repl);
}
else if (base.indexOf('/') > -1) {
// chose one of two alternative strings
var t = parseTimeString(rule[6]);
var isDst = (t[1])||(t[2])||(t[3]);
res = base.split("/",2)[isDst?1:0];
} else {
res = base;
}
return res;
}
this.zoneFileBasePath;
this.zoneFiles = ['africa', 'antarctica', 'asia',
'australasia', 'backward', 'etcetera', 'europe',
'northamerica', 'pacificnew', 'southamerica'];
this.loadingSchemes = {
PRELOAD_ALL: 'preloadAll',
LAZY_LOAD: 'lazyLoad',
MANUAL_LOAD: 'manualLoad'
}
this.loadingScheme = this.loadingSchemes.PRELOAD_ALL;
this.defaultZoneFile =
this.loadingScheme == this.loadingSchemes.PRELOAD_ALL ?
this.zoneFiles : 'northamerica';
this.loadedZones = {};
this.zones = {};
this.rules = {};
this.init = function (o) {
var opts = { async: true };
var sync = false;
var def = this.defaultZoneFile;
var parsed;
// Override default with any passed-in opts
for (var p in o) {
opts[p] = o[p];
}
if (typeof def == 'string') {
throw new Error('in init def==string')
parsed = this.loadZoneFile(def, opts);
}
else {
var ret
this.loadedZones['africa'] = true;
ret = utils.lzwDecode("Rule\tAlgeria\t1916\tonly\t-\tJunČ4\t23:00sČġ0\tS\nĀĂĄĆĈĊČĎĐččĖ\tOctĨĚ>=1ĞĠĢĤħ-ĪāăąćĉċĴ7đēĕėMarĞĝğĦĤ1ĦĨņĬʼnįŌĎ8ŏĔĶœŕ 9ŀřĥĢŝīňĮŋıĵĒŦŒŔ\t ĿŘłŮħĩűĭŊİč2ħŷő\tFebĜŬſśůƂŇƄšıƈťƋĸĺğƑģ\tńŞŲƅŢ2ĿƊŧź1ŗŁơƓƁƤƗŴƇƩŐĶęěƨƠŃĖƳŠƵ93ūƪėSepČŽƯŚŜƕşųƆǃDžƸėNovıŻƱƢƿƃǁǓ4ĝč45ĶApŕMĒĽĿ 2ŜǝǐƥƘǥĝdžķĹŻŤǰŜƣǠǒŢǦƛĶLjNJďǜǿǟƖǡŢ7ƷŸĄǪĞǧžưǏǀȂıȐȅLJljĞĐȗƾŅȁƦȜŎǹœĕ Đ 0DzșȦǶ97ȩǖǺƞǯȰůȀȍțč7ŤȪź2ĝżȱƔȚȧɁɃȸȇĞ2ŻƯǞȥȿɌ98Ɖȸǩŕ2ǧȯɉƲȳǂɚȞȹ\t3ǯDZȽƿZĒňfĉca/ʼniĈŃ:1DZɼ ėLMTČ8Ď Ũż5 ɡ01\n\tʐȼ9:ƼėPʂŵ1ʇŔżʎʐƢŜȎ\tWE%sʃǥ0 ƍbǰʊǾĢʏʐǝʢCʥʧı46 Ɲʋ7ʲʠůėʤʨ95ʻJanǰ9ˀǝėʶ˅63 ɝż4ˀȼħʢʤʦ˅ȶʼĹǰʞʳʡțʶ˞Ȝ9ˡtǰ6˙˦ȧ˝ʸč8ʚȫˎŜːET\nɯne˕tlˊtic/Cape_VĈd́-ś34ġ4ɿ\tʁ˅0ʿʟ-ɬń\tCV˅42 ȇˀ̠ɢ̣VȘʊʽ15̡̫Ķ̤˟ʊǘvʮʋ̡̫ˏ̮˽˿ɱɳɵNdjamenŌĦɻ̨ʀʘĴ2˹˂ʣA˟˫̳˘ʟǝǝWA̰ıɚʛrʋ8̢ͣ̈́͘ɰĄɲ̇ɵAbi͊ˊĖȰďġ8̛̙ŵ͗ʟʌ̢Gʂ\nLink˕ͲɴɶͶˋAΎɵB͌ako\tΈΊΌΔ͇ΐͷ͋ΓΕ/ΗnjāΜΉΡ͵Σˊίͳ̉ĒΙrĕΝήΠεαΒδΏDΙźλΟΦοΤρɵFreetowěφϋπνΏLo͍ʐϕϙʹΑϊϠ/ǘuΙchotĺϟψϢγϤOϧgadougϸάΞϖωϱΦSao_TϜăϮΰϰΓ̃̅̇/St_HeĂ͏ΜƃEgypĺʩɧęlČǧ˚ƀŰƖКМО94ɛȒƝǜˁħȾĬЩНʹȑƋɝУвЦǴ\tжЫ4йȆȠȉХдăсʹɒǷǨȔżнdzƳыǥɒǹа2ŎшȌеЛзǥ3ʹǧǗǙбќɖўЪѣɧлч̭пѕˆȷȒȫČгѰєџЫ5Ŏč5ŤėаёѨѺѫѿɎѵaȬĿХѓЙѻı5ū˵ĿŹҌЦҏШґѿҔ96ѤĨȠ3ħɔщрҜҟij9ЬĶ҃ĿҦѝъҩ8їȸСȕҙȲқ҇əѢǹҸɼҺɊҐҽ8Ǥəҁ\tѶё͡һѪѠəǕҊȬijѹӅӑ9ħčҭҗбӎӄҼәȖʍ̢л̄stύiŻ˚ǎӡӐЫˆĞĢҡɐӨtThuŖȋѩҳѫƈ0ĐǹɐƼɆӾ҆зԂѴƋɐӺuǮӽɭӿҨԁĢ҉кϹ\tӸԐԓгҲԖԋĢӓԚgӴԟɕԊƞӥѭԛ1ħԈԔԫӴɧɐŪԩҚӱԵЮԎȠԝӻԩҧыƈƭɧѶ̴ԺӏԀԣՇӀĚȡՃԡՅʍǸҷΫɪՋӰՍԬՏɏՀaөԞԲԠŅͅͱΡ̊irΛɬ5ġ˫͔̜ʪƝˀ̷ыEʷ˽ƃGhˊƧӛЬɒȟNJ҄ǿʔħGH̰Ƴվրƙւ̧ĶDecɩҍȋΆͯ̀թξccrċ-˚:5͓͕̚ţˀ΄\t֏Зʦ˾ͰϤBissaӼ̓ġDZƈͿ֪ɾˉˋż́˺͚̺֬Хėֲ֛֝ϤNaլoͶĞʔ7ɻĐճƙ;СˀɔėE͛ıҤշ:ҤĶBס̦0ץȄėשAU˒ʟןр͛ЉεאגͶϾddֶ_͵abċΏխϤAsmŔ؆έχΡ؉דiϖσr_es_Ђ̄͌؇͈ב؊ؗϤDjibϸ̆آϥؤؖϖK͌pāϼμΦؕ؋ΦǬϵsՂخػؗInˊɶntր͏ĉvΛكذنوnζmoխْمهĊٗȫϫte͆εǬnխvİ֤:4Ł;ך18ҵ̫Ȱٰͽ̙M׀˫Ũٷٯ̖ҤͿR˟̨˸֮·ƃΉbyŢ5ф҂ǻՇ̷ԻăڎڐҒҶȒׂѧԉڍتڛѿҿȸ҃ūڗՌ̚ڣڑڞևԳڢڏڑǧԅңѸůژڬڵҒԄҷڱ֙ڳƖښŢҵͦĝėлڲӛګۆͦэəҡүнҧې˵ڷɜѐĐҎۏڭͦۀȒیĝ۞՜ڽڤəۢƜǻ Ѣ҅ڴ۩8ѾӒяũۃێۧۘə۴ʅҮۭ۸Ԫ۱Ţȵѭѐۥӗۅ۠Ӝԍۿĺ ܈ۄĬېՆڦҊŕӸӫӃɣ܊ھܕɧаܙĉוԳըϤTĉpolӬȰ֧ځֿ˅ƈͬۨċ˨˴ˆˍʟ̷נ˼ۑܴېܷ˅Ӛʛyʋ͟ʐܼрܾӜʻȇۮ״˥ů݁ջıȵˬ݇ץ͙պʃՆ̨̼żʪʰݑЦݔ˩ܕݘɟ̿Ħݚ̢ݜƤʛuĉ̆uŚəڝ۬Оں۹ܜĂݱݳiݵͦܖƋŨĞ܁щݿiݴĤԂԙԜբtSՑڪ՜ފތӴ0ԥƫܘޒޔƻԉͅ ٕ٠/œݲދށĤĠ5˚ܱı̝ˀ̖ĢޘޫӋU˩ƳǬխ֠ΛčDŽԷцɒ֭ڼoףޜѥǚĵ֭ҧ߇߉Пǹʬҹ߅ګߑcЬۚȒ̼ʄӭڡƖߙߛޮРՑ1Ȼ܉ĬߤҒԾސ2ūߏԡ߭č6܍ėƺɓČޖݽăߵҟ߸ɨё߳ԕࠀ7گƋߺɆߡڻߘٚ߈ߚȜࠉхֆߪܒ߿ࠐߒȵҫȶƫҘߗۧࠇ۫Ǩԛࠄ۰ߣࠚࠒɁࠂԆǽࠨ߬ࠪߛɂߧěࠧ߫࠙ࠫȵޏۋࠦɇ࠰࠹ࠑծԘ࠵бࠡ߾Ӌ࠲ޚ࠽ҢࠖࠍզࡋԂߋĘՑ࠷ࠎࠢࡓԤԮԧƼࠅࡒ࠺ࡄԶɄȬ߄ۦࡉ߭Ն߯࠾ԧ ߢ࠱ࡢԵړȓũѢࡈЧࡲࡃࡴߧТ՚ȯ܂ࠩࡳݞԵѢۋȔӸޠŻ߽ࡺࡂ߉ࢅڸNJקۮࡱࠒТƚ࠘ࡊࢄʍݸࠥ࡞ħݣоࡡࡼܟՐТ Ŏ࢝ࡑƃࡪʍބࢣѷࢌ࠸࢟ࢩࢳ\t؏xސࢊࡗұࠆ࡛ږ0ʕӋźࣀ࠶ࢍпࢲ՟ڞޕǽࣂࢨՖࢌࢷ࡙ࡩࣄߝࠊߨɇ࣓ࢱࣜࡾǛࢦ߆ࣄࠤ߹ࡗɠ࣡ࢃࢺȉࢫࢶࣦࠏࢠ1ࠂѶ࣭ࡻࣶࣕࣤǰࣙݼࢎࢹࣼࡍՉࡸࣺࡣࡍߺ࡚ࣽࣳࣵࡕӌ࣬ः࢘ʍࡕߺԹऎࣛࢠƚǹѮ߲ईकࡄञȸࣸɇ࣌ࣔखƼटȔߩɓऔࢲबदҋČȮऩझࢢӞऀࢧहࢺƟभɞࡸस࣮ࣕࠌृƐछंलࣝ۶ŻषࢸलĐࢽޝޑөࢋौ࡛࣍3ࣩɨߎढࢲ3ࠂ҃࣠ޢɰϖָ̊b̄nɴͺצȰ־ٳĎ˔ʽ2˯ډŜ߭˳˅ӇͨżॺʐɈ͙ˑۡॼࡋॾ٦ϖElבՑٮܯ4ٲ֩˅̕ ׂׅ͙ͮȜʻ˖ƭউůॽջ٦֞Ώœpuϑו։ްč0˔ٿܻ׆CؒϖফভoϖB८tyώظؓ٨̋াীuΪmbݲؑϽϤঽϑϖGࠐ֝خিϤHؐϤKiϵܬ়ৣঢ়ΦLuৎբhӬৢব৮ݵτИƖאmتǓҭॖօĻnԒॆĬ৾܄ǧਃࡶਅਇ२ΦWΊdϪekŮ8ʔ̘ٳʅ̨ʬ˹קLJটŔݭĘ̦̑ͤݏ־ݣਫdzਭʹͩƨݫʱষ͙SਵӜʪʈƨਫːעӜ̘˖ۮܴਊͶċͣ˞নϤLaϺɺ1Ġफ़লĎ˫̪͠׆ͮخীˊgu৵osী֢zza٬lĂ੫੭اϸضعΡ੬زΊفբa੶تώੳੵ੩৮ϖ৯ˊdেϚએث৪੪ઇغĊ͍κઍગΦPٚϑ-̼oনޥىReĚiĒɩٯś֧ਗ਼ߩছĚ׆RܾબٟىœhăĠуٯগˈʟ̢SCʃƳਾьਸ਼ࠕਐľṶ̑ԕѡʹۊࣈŕޠǮܥ३ϤJoտǹsrgɈܯਟ9ਡƎਣਫ਼ਥĨਿӚਫਾ֍ઢε૪૬૮૰ઘsĈӼخଇˊଉݲଋؽ̀uઓěɁࣈҘࡨंޔଜȜւ8۔ڕФऔତɁࡵлקଢпଭଝȵےନॐ࣊ђșܦΦKտrϑumযȼૉ֪ɪଁଛহݧĢʪׂʉż̀׆תخୀŔୃmϖęƳTsǓ߁ॊՊȣिƖୢnֶࡕߟٴƽࢂĬ୬୮ȃଟߕɟ୳ڼ୶ȃࡵ҃Ȯࡁ\tǢऻૢŻ߲ଳୡୣஇɧߟࣿࢯ୴ăஆȃࢴŹɞ߲ਈகஎ܆ŕऍ̷ҧॊज़୭ڧۭनऔюǥҡл٩ԒனƃலЬࠔڔࡰ࢞ȄशࡐஔஅஞȨɩࢥӮ୪୵ࠬ߂NJࠌ΄Ȥப୷ȜअवࡘȘۧ࠴ј܀ࡐௗӉࡆӯࡉٵݖૐաख़ࡗத௧۾Ʉɞஃŭ௧ӚՈࠗ௬Ԃॏ़ఁ௫ंఅௌȊſ௵İԂȢࡅஙक़ޓࡗ̡ఉпఋĢక0ӊܡޟచŭƣାΡʠЭܰਟ˶݅˰ޛʔҖ\tʗ˅હʈߩܴ݂");
_this.parseZones(ret);
this.loadedZones['antarctica'] = true;
ret = utils.lzwDecode("Zone Antarctica/Casey\t0\t-\tzĚ\t1969\n\tĢ8:0ĖĘAWST\t2Ħ9 OĊ 18 2ĥ0ġĢ11ĺė\tCAīĭ010 MĈķ5ķĹĦļ\tĤĦŁĩŅĮľıij2ĶĸĺŒľŀĘŃŘŇ2 Febĸ1Ĵ7ĺuŒŔħ\tŗT\nĀĂĄĆĈĊČĎDavisĕŁĚzĜ957 JanĴ3ŒŰŕĘDAVĬĝ64 NovŒŵƉƋğũūƕţ\tƙƛņ0İIJtĴŞŐĻĢ\t5ƬƮĬřʼnŋrĴʼnĮűƫƗƭƚƾŇŮƳĸƶŠƹƻLjƽņ1ŨŪŬ2ŮDžĦŲƹƖŵƽŹāăąćĉċč/ŋwsāƇĘƦĝ5ƟǙƓŒ6ƬMĩNjƱśƴĵŏǑĢǓŵǼWŸźăIndiƑ/KerguelenDZęěǴƸȅƬTFĬǤŻǧžǪƁumātDUrƄlș ʼnDzȞ947š0ƬPMƜƌŨƐƒ14Ƥƈȹ56ƠƢȽƼȰȥȋżǨſǫSyowaȜdzƌƎɅĸĠƹ3ƬSYOȥRuș\tTroȴư5\tmaxŁǁ\tlđtSuțĿǞĭŀCEī\nɬɮɰɲlư4ɶɸŁƳɼɾʀʂűĕŀUTCȦǦŽǩƀ/ʍɳƥěĮ0ŎǷǗƤŀʦʏ%sʠɕȩʤVostokɞɋƎDecĴ6ǹƬVOŅʵȨʣǫRothȔɝʨƊĝ7ɍ˂˄ĴŒ-ɦLjRɪĬ");
_this.parseZones(ret);
this.loadedZones['asia'] = true;
ret = utils.lzwDecode("Rule\tEUAsia\t1981\tmax\t-\tMar\tlastSun\t 1:00uċĥ0\tS\nĀĂĄĆĈĊČ79ċ995ĔĬepĚĜĞĠĢĤĦĨī-Įāăąćĉĸ96ĐĒļOctŀĝğġģĪŇĔŊĂ E-EurŎĴčďđēĕėęěŚŃ 0ĪĩĦĬšeţťŧũĸĶŐĻĕSľřłŜŶŹňŻŽŦŨijŐŒŭŕŗƈśĢƋīƍįżĀsijƀČĎĸ84ļApęďŵŷŅīĭƞ ƠƢƒƤďƤ3ƖŘƭƛ\tƝŋƴuơĉƣčƨČ9ďƅƇŲƉĢ2ĪsǀŠƳƵdžƷčĻNJnjĖĘƘŴǒĦǔưźǗDŽƶŏNJ2\tonlyļŰƘaŘ23ƯŷƲǂǘaLJ9ǭǯDZļƆĿǏSǶ\tǸŷǁŢǾȀƻƕůǠȈǢǓŸƱƎȐǚ9ƻNJƄĽȇŁƙ ǣ0ǔȎƟǩǙǫĹƔŔĕŖŘȖŜȧȩŠZǯăũ/Kabā\t4:36:48 ĕLMTċ890\n\tɕɄŹĕAFɏČ45ɔɖɅň\tɚT\nȺnȼij/Yerevaġǒ58Īɋ\tɍɜȁ4 ėy Ȧɠ\tǹɘ\tYERɻ57ɾĘʃɗ0ǃDžǿij ʈR%sɻNjʎr 31ʁȷʃʅīǦʘSʜʢȆȦ3ʥɷȜŏAMʚʜ5 ʭ2ɽȦǓʐŷəɎŐ7ʿĦʓǪĊʴʶȋ012ʞȦʸʽǤ˅ɣʴɦƞɤzɮ˃œŮǟűȤŴʑșǧŋ˚˜NJ7˞ƼǡŜ5ȍȹȻɤɫBakĨǹČ:ʻɸɺĸ˽ɿʣʰʆBAKʋʍŰ˕ˇȭa ̆KˋǝːʡʣʾɕʄǺŹ̑ʪŐʢAugʠɓ̙ʦ̍ʕʳZ̓ĹˏʭȈǶʮĪ˕ƩZʜ6̴ōƒA̫ʛ˃̴A˛ę̼ʶŻ\tDh˷Ċ2ĦķȃDzĕJŃČȋʦ˥Ǽİ͈͊ˌ0͎ǰ͇͐ecʄďʻ˱ʼnɨɪĉ/͚kĊɇˍɈʒɌ˂1ɑ̥ɕ˰5ǹ͌ļH͵94ʢȳʃɇ3ɣBUʊĸ4ˏ̂1ɟ̙˰·ļI̞ɝ̮ľ΅ɢļΉČ5ʬľ̤ΛʆDACɻ7ʢŰȦ̸̙ͰΈDɏ͌͝ΥīͭĊBDͩͅ˴ͫThimphĨͺɶɆ˾4ʍ̡̣ΐʃΓɣΖɻ8ʍ΄ΰˀ\tBTɏɧ˳Indĉn/C͉goǔɄ49Ͳļ˿Č0˄ΒϛIO̷ηΕϹϠɩοa/BrĠei\t7Ʌϯ4ͳɹ26ʞʃЉΔĕBNɻ3ʯ̙ɶ̅ИϾͪЁRɲϪǯ\tɇͦЌϋɜ88Ч˼ϭɣRЏЯΆΈΊɻʎyʃϯʆJΗʸ̂ʠΛЕĖ˂͆S͉ngΌī͏ļ͒ŜƻƿǦDыэяɝʧǞȳńǀ˱͘ăьФΌďђȔƬŒїŷљ˙PRCƦŒѫǟDz ƨѯŹѱ˧ѳѵƤŒǝȅƇś>=1ďƿȚѲѴƦ˫҅əƫĬĠ҉1Ɯ̛θРЀ/ѧю͉ЇН˰4ƻʹɻˍʃНƱћ\tC̬Ϯҫŷҁүν˳ȽUЄmqЇͺŶͽҨ̀8ϻĕXJ˘˧HKѩǮ͟ƩҕďǹΔǦѥ\tӋӍѸȆʄīӓƜǖӊӌɝѷӏҔęͽӞ͗͆ӘӣӎȄĕD͢ċ̚ΔȪӗӢ˫ѸƪƬƻөӕӫӸύӮ͠ӱͣΔөӶӬ8ԄdzaDzǭӿǻԁΌԍΠѠƗȵӴӟʼn˙ԋ5Ȃӥ\tѡ2ĻԉӠİԋϮĸͻӐę҈ҊԜӪԟӸԮѸNovӳԨԞӡԭljőƨѬҖnҘԍԓŹӖԠƨѸѡʡԳԊԶǜՂļԹԻԱӒΜՒĸ6Ք7ŒӦՅҘŒՉҎԿČ՞ƁաԤƗՙե՛ԩăԋ7ƻѸԆӜԳԀԵƁ͞ӯѹգ=ՈΜջը9ƂՎծҗҊհӵ˲ϿȽHǯg_K֓ЈɅɇлӂϳɽȳΤМŷӘӋұʢԆˑоϛскʸʭϑ֡Ź֣̒ʛ͆TaiwɲΌӤտɿċĻѽҜ˙ֶָֺӭ։ƽѣƌ˦İֹׄġɝӺԣӼֿʧѰֵַΌגտӳҍă׆ԌԭǞ־Ҍқ͇יׅאצԘ˭תӖפׯԡԎՄ׳חѾכΠǭΠՃ\tןǕךץԮΠķբ؆ј؊Ք6ԙס؈՝ўؔѓ͓ז˥ѿ؉ׯ7Ձ7ȡה؏ט׃أƁئȡѡ؆էآؙĵվ͒͠lנءףحضխؖѤҝȽׄpІ\tНαЫɐő Jɲʁ1ҳрWт3Ϙŗٓ֩ртɞʹΣ2ʢŝĦٕīҶִ˙ėcaĨթƹőǭՄկպԔ٬aٮٰőٲ6ןՙՑղǟٻ՝նԣǴٶׁעڅٯ՝ՍډǠٶզڍ٭ڏթĻѸڊ1ѮӖڗټժͤ؟Ӷڢ՝҄ևǞהڔքٸ˧کթګΫ˭گ֎Ծİڳևևڮڝ׀ڠ͆ڼ7ھյڷۂڧڄۆئ˫Ȳ֊ՆҊԧձںăۆ՟ېɤҕՙەӔڱڻٺژևԗč˖ۋڌڡۣټ7ۦЮۊۓΐیͨҸɫکДɄٍ͌Čˎِْģ٧ڎĨMO̬Ĺ ֧͌܃ҵҰ٫˧CyƫDŽƁښדӑіۄ˙ܒܔǥևܗտرǭסۗүܓЄܟՠفשۃŹօİܝܩիفرزڄܲܕĵҒۧԯցتՊܹ͆ܪם͠ӛԦ۵݂ܨܺۥܵƗܤͧ݊ܞս˝ǍȣųġܥݒܳƸŐԍՄԛ۫مɫNicϫŏǒ1ͼɊ֜ȁʢģ4ʃȧܧݓEE܈ɊȆݴŷ̺ŏݸͅLinkҞݥݧƒƐoو/ވݨaݣπbiliĈȋ:5ϯҋ۽ЭЯɴޜǞTBЏɽх2̄ɣޤỈВ̙ʑ̨ũ ެ܈άĘʠ٤ʤ̦ެтʝӼʁ9ުʖGݹ̾Ǭ߄ŤƐƀ߇܈ɽ̯ˢňߌſƒߏ߉ȯ ֟ȵ̴Ǧ߇̊ߞްɷߖƑŏߙδĦɽєȦϵɕ̧ʲĊ߫͜фߤߓ̗٦ߦʆ߇ɦξȽDޕң˼ǒۼݮۿّnְٜޫLкˏFebȦʢȌɕпɣ֫Ό֭٢ЛࠚϛTࠐիмʁࠡيϛWޭA͜ʒ֮ʍƮ࠙\tࠛļࠤࠀ۷֖ͫlͮtĊͺݬޞЮϒޚͼɣͿкŗчиΟΎԐģΑΜĕϕΌΙpࡅ۠Źࡘɝʸ֟֯ࡕшϕР Ƚّͮr֘ϴ:ۿ֜86ώ̢ģЯЉˎΝЏ3܊̲͢ύࡰީ̙ЉӁ\tJAVЙˏГࡖ\tࠬB࡙ːǸٟٝࠜࠟpʮшԖм܃ĕࢠΠʒɿ࢞ɣࢥՂʆࡧȽPǯtϥ˷֘1ࢇɣϲɒɊࢨࢆࡰࢹļP3ࢎԺࢩļࢫлࠋȦ߃̙࠶࢚͑١࢜ࢿ࢟IɝࢽԐࢣࣘԭࢧࣜࣖࢪࣟթݳࠎࣉ࠭ƦɊ࣌܂ࢿࢮࣘࢰ۸͊ơǠЉʌ֙۽ȁࡸޚДլMࣄࣆvࣝࠬTΘ ࠓࠕ ࣓࣎ࠢٞ֬࢝ࣨࢤࣲّ࠭ͫyapŧĊϯ2ǒɉࣺࣅ ࣏ࠫޭΌߑΣ࣮ࠢшΨтٿࣩ࢘ӉİIrץۯƦɣǴ٣؟ؐ˙शसԍڥऽؗ͆ुؤط҆Ŀ͔ॆीषׯ۱ӚƇǸیӖै̟ܬԐĢܚܯث˧क़Ǭƃԏӧݐफ़ॏץNjॣݖȋ०ӟॗॐƓग़ӧׂ݀ॠॲNJּ݆ܷ॔ॱ४ܼĹ।८ाय़वॹĹঁ؍Ȣॎॸֺεёڒॵঅ२এɳĦտ݇ॾेॲεͥĦҧˠؼঞঐĦড0ণ݇९؇ধঘ0ڑֽǠॅদ३ॼĿশ״র߷ॴথ१ॷইন0ܡূ॰িεृওȋॶস͜ৎছॽॖৌ͍ˌҋঃटকৄăक़εķ͌ড়७ঘࡻڛؽ\tৢˍԢ়ঝƻȡ़মिগ৺ˍȡভ৸ˍॻঢ়৯ڞفজਆ˫ঋ৽য়ˍਓˍঋਅ৩ৡট0ͽ৭ঔڌৰ৲ਣԣਏਟৱਡऽ͌ॕՄ২ষਙਯਢব॔মسਠনʻুঽৠਭोਐ৪ˌ݈ਰۛਖਦੋਢۛਞلਇ2ԍਰਕ৮ਗਧਮਢਝৗਬ৲Δ͌Րਲ৾আ਼ঘফǞাਇࣅˌКਊੜੳ੦ਸ৶ੈ੫ੴƨ੦ৼ੩খ੦ফਹ੬Ȱ˟़ੲએੀযࠁɫTehॲͼҥࢻڞʰԦɈTόί߲IRт7ʍथɡ࡞ॲબ̬ĶʰΔक़વܐqƦ৴͠ש३ાƤھƧײઌुૅčڈęՐૄƦՁ8بӑૃএૌŐɣӛԛưȸॿګɒঃૠȘઽख़εۛהģ̚Ǥؠধૌ५૭˭૰ʦૢޒЁ˶ghdadޙࣸЌϱ͵ͷݽࣸɆࡼɻͶުƩт8ࡑнળaાAͅ˙ZiЦѝفєѢ˧ଝଟࡐऩՖԺଣଥଞׯҦف૯ͥİଦରբ૰ତଶଯࠞଲӑڟৃਘଽଧɞفן૰ݵ\tଷֻୀѭޙୃৰׇԣ৷ମુज़ॕƿݵDାࣚƇଵă୕װঋোଜ୭ग़Ѻচ͠ةୂੁୄ୪୳5۴͖ୌ୫Ρବ͆ஈѪୗଫড়ஆڍஈીܾͽݵ૪ଧڥ͔ஓӖஈӑǭங੪୍ணӾଭହࢉ͓ढ़ୣஜறӛࡻਬஈৈ؝א୲ஜ७ড়ਉ͑ŴழூঌԈம݅୩னஜ১ஔ୳إଡɂ ˫଼خݎƽௌஇۜӧҚுܖଲ̢ڦேଧӻӑѼ୫௺ਪƇ۴௸॑ௐשԍ௦అ୦Ŀઌ௯וఉఐఌċ௫௹ଡ଼ܾҙய࣫ఖѻఏ୳ɑஊӵతॊ७ʠణଧ૦ਤȋܮவ୳యד௶Аభׯ५రਾఔవஏ৵ୱ௳ॢఽķిమఫযŐੂ୫ȞడలĹறଳఞ௧NJసఈఊॣరనమ௮ӛబఄॳరః౩ௐஹ్௬మઑ˪ఖ1ੱౚčਿ௱ళNJఛౌŐపఒȦ୰்ಂ౬৺ஊ౿ಐசಘڥ ҄ಖାঠஊऌ˥ಜಗఖਾǦ౷ోত2ķǦನಣĦರѡఎಭఙಱԗ͜ಾಹȟಢЦεҕುೈಫೆ௮ౝઅ௧ε௮ಹಁటεŒऻǠFri҉హಶ0ௐಹீౄĦಐಮ௩ĢĻୋ಼͜ಓ॔ਓஃుதęೌˍആഃೖ৳ুೢ=೦ഊ৬ఁ়ಕഏಝˍȒȱতഓഛಆ௳৹ˬۑȴߓೳźઘगɮDŽaĂmޙ͌ޚɽࡲࡄ̙ࠇŶଆ͑ଏ഻ŷIଛ˧ّpץɉ୵ܿಛநൈൊۦஉ७ȉt҉ରہ۳ൎೕࢉच؊ўրڂ೧മЁTokyo࠵ࡰɶޛଇЬϗࡿcࢁΐŞल࣑Ьُ࣭ٔदрC٘ٚtࠍऎī൚ࢉെİJorଁؤಾଢ్ܰăඐඒसȟܠૉݚ˙කඓ௨ܻԏDzӖජसௐ݉ඡඑඣඥஞථേධूదಅԴඵඛؤಉඹӶඪ॑ݢදƦƗܷܦෂѶఠբഢԲෆරනčɣѡි͆Ƥ־ౣୃඩබഁఒ2ܛ४ഌ؎෪ෝख़়॓ԝෲెܘƬඹࢉෳॢNJণේೣҘපඏกĹඝಃෑฆී෫ฉఖෛౘශชĺݞถזȸนعృǥۡม͜ٴঌǏഓพǕภಘತݠŁρŇ૩ฦัಷสǴǏึȋˤεೃݏಀȨฯඣ್ஞలฟ์౫ǎŁอƛ๑ํĦೞഋ˭ฬೣฮธݫفոͽච෬৫ƨȓতเφโฑวഠѡЇ๘๋൪/Amđɳ˼ǹ4സЎЙංɕݵށִAlđtDz˰डݮ́ࡒʂ϶ʆAࢻ·ِĠࠖη߅ĉࡨɍӅɤࢻȁຣߴສʵ̾ːࡣаຜɺૼ/QyzylබɃ˼ĤԡࣺຘʀບલɣKI̶ĸຟ߯٣ࡅʆ໊໌Ƹࡨƫඉ\tດ໓ࡋඈबີ້໋ϖˏ߁Ċ໓ຨປ໔Ĺ֦ࢀઢļQYȁ܀ࠌČжʱȬ̩Ċ̽߬েຳࡔ࠹ɫAqtobăɶാຆ̀ާນࢅ່Ʃ̈Йʒຈ໙ϛ̇ϞƦ̠໗༦ໝߜٛα༞༧໖ʟ༫ˆຮ༦ࡕຜ༟̟൸ģ༤༹ༀƀAQTˋາέິƩཉ༌С༐ڏͼŅઠަࠧເʆFOࡏ໎ມ໐ĕཟࡏ6ࠩཏƅHEϖໞ໘༲ཬિ༶໘ຮS༼ངʫཁ༽ʒ༺ཉ܈߸ʟȵ̌྅ཊັĦྈࡓ໑˖དຸOषغઞб൵༙ཛ༜ཝɣΊA༠ຠࠌཤྃļྡྷྲྀ༸ྡྷ༮֟༱ϛྪཱུ༣ླྀཆƒྡྷ̬ɑБ˓ЯޱຮྻߚNj̴ĕྴ֧̔ྂྠԤRଚྏ༆ཌྷ༈ཫ࿏ྣ͆KyrgົŐھőܾԱล݁˙࿚ขȯݡݑz˝૧ഫǒୌຸ߭ۖBޗhkeކɄɵбໄ༚ໆྟ࿖FRUྤ༢ອྐྵລထU̘̕ྨǦမ̠ࡶ̖࿀ྒྷ\tKGཋྐࡨࡶˎຩါऴăROԂଢ୨௲İံး౾ఘӖှΌ൜ೊௌಜ၃ɝಳĺ੯҇೮ဵ့࣠ಥ୷ွၓױ৭Ѻந၉ĺ௮־ ౘ၈ၘၟడైၞ5ఆၝၥၫఖధജၪܼ6ೠDzڂఉၵؚՙၐౙၗӸϗැ൦၏ൟੂၞႄƤݟقցփাƆoɂɶ෩ޚสࢻ0ɊྶҳшKтࠊ܁༣࣐ࢉඅЙඇ໘Ⴅࠝࡠऑ ӄඃ້т5༚ʟྦྷࠪΔ၃ֳɻؔုϐЯ࠶Ⴚҷ།ͫP൯юङюࠪ࠘Ѝႚႜ༪༣ωႲˏඁൽႦආ༯ໟႤ֪࣒ϏȦࣧඊļႠ߬ΐႾࡓŵƛ႞დ͆Lࠔɲଧȋႀხbჰׯჲ͠ԥทڄჷჹ̀෮ఒ၇ูᄀnჱᄃՏจăᄇჱರ़ၜ˧ᄎჺಸƗႀӶᄕ̀ಾהਲ਼˙ᄛČॕċჿჯᄈ՝רज़ඨჭᄩᄬඟᄔᄱؤರଢᄟӖᄢڽƁۛرᄌɹᄷƁඝયඦػᄠᄶჸᄪƁהၳᄼᄰᅍଧहᄥᅒ๋ᄡᅅƤ੍ᄮਗᄽᅜLjख़ഩᄦᅃᄾЭאᅡᅔᄁෟൌఝුİᄾ૦ॢȔටᅭᅛᅕᄗŘ้ᅚᅌᅯซനഫᅳ쨔ౖಈᆇᄵᅴᆊķᆎ۶Ⴤ૽ІЄǷࠆɷഹޠŷᄛຌဴBඑɩ൰Č3ՔᆀӀ٨ӖNᆦrᆨໍᆬǞոಚݚͩࡨɫKuലa_Luτŧа4֚Бݮˍཱޚ˰݈ƅ༆߯ࡹऻຝЙࡾზ࣯ҚͽMຝ٘БᇞɕࣁůᇛѩႮ༣ДᇚࠥईऊགთႬуऑေࣣdzᇪ༵ᇦࠪʆMYϟᆽȽᇀcςࢇĤ࢈ࢻАޯᇧBའᇜ܃ᆳᆧe൰ሑʙߚлᇲ࿌Ⴋ࣒֮ྟҬΝሒཱུᇽሣůሁҝϢϤɲ/ėlϤveϬഷᆞ༘ͶഺɡႴϛऀႼЯ࿖Mࢌ\tۅ֓oغƺజᅺڲቆቈ્ො٬ปิݘቌڻቔᅝቖหᆕቓюቇ͜ᄃה̰ᆜᅋቚቢغತೝᆍŚȊܦMቔεተቨᅓቡϪቬਃᆅ฿ȤቱĖትኀኃŘᆼ࠺Ё֒vଃͰΆᇌሸɒʸϏຩHOቃĵႰሏŹቴቫӗኜჃནUěɲჸǶࡹДˏᇍኘ̢ࢭྡLྣᅏ܃ኢቾ\tUኦҞϨoiჸlsֺДҬࣺ༆ኙᇟྩΪኟᇾኵƺ༶लኺባCኛိႛလኹቔዚ܇ຍȾǶhdχɈĤڞໄቀફགྷҥȡNPϟƳP˷ޗಯஊԱע ዹkዻᅾցۗጂዺĝ္؞ᆈጋጄግ͝ପԻቒǂጃጅ၅ƬၣԔȿषሆЇۻɶࡱኖϴϔٟ࡚ጭ˥ᇶࡢ࿕ደʋ࢜·ဧĕKAࡏΫ྾ྒྷጒጝ\tPႻቄƳEptLJʌᅱၮᄓŢፋܓፎǚፐΠႍ೬ᄌţፌፗȮɵൌျቼǂፕፍፏ။ࡴᅉ૰ฦ፞ፖ፩՝ઊĿᆖƎ፧፠Ū6೫ƗૹᆏżዹĂĝބăNJྐܾฝᎂሴࢴϿᎇೂ˭ᎋᎀጋᎃᎏă๎ԣጊᎍᎄϿಟ᎕᎘͜ϴܾ፤යŢᎦᎅᎨ፝ᎯᎡఖึൗബലᎎᎰ্ቹt๗᎖ᎽᎵႛడጚᎮᎼᎠ᎙ᄥෛ˥ȪᏅᏍഀਿᄒᏔᎧ௵ќᏊᎁᏌᏛഈ׳ƹ፯ᎴᏎড়ӻ௶ᎬᏓᏩብ௶ᅙᏚᎾᏣങչᏋ᎗ࡻኂĝแͦቩᏠᏽᎵഘూऽƎᏰധᏐฏખᏯᏡ˟ฅഔᐓղᐉĻᐂᏂᐅᅓGaz͋ࣀ႘ྜϳʒϙຉൃାݸкࣛʀິȧ፰፨ފ߈Ⴜʍᇗ༈ݵൄ܈གྷຊෳᆣಌݽˆᏰᑈ্ყಲʁცൂʆᐴ࣓ᑊʒᑌᐽഀᑘļᑕ࠲Ƌ༣ᐹᑚိޝჟݵĕᑟ৳ᑘᐝŌᐽຸHࠔrೇ˼Ӏণႚᐯࡌᑓīᑕࣚࠧᐸߧ፟ƀᑈթᐿມၢᑝᑃ࿅ᑅŷᑛᎇᑯᑦ઼ăPςଌԸᒘᒚໍऊᅊበҀᒡಙጀӖᒙޕՀቈᅃᒭᅗᄻᎭᒠᒮኞಫොėnޕĊ-ൻၫሷϲƧɽ֧ʡٕޱࡲ܉ΏბҴᒡPHұଔᇴٟɽዒፆᓓᓕዣᆘູኬૐ˼Ͱݭኖ܌߽ɣGમვĠଐəʪ\nރޅᆾͫQᓣᓶ૽aજַߔRiङdh૱ɇໃݮύຳს૱˖ᓲᓴkᓺ/ᔁᔃhᔒAdeġᓳބᔑȽᔔଂᔖሄuֹitຸSބgचඑăᔇᇒʸᇍʢᇽᔯ˼ᇕʸᇗᇭሽᇻȞᇝႣኴѣᇡᇣЙᇥᕀࢿ࢈ᇢᇰџᇬࣈᇩᕋሜࠔᇳႱѓሠΣᇸሏшᕊႼኲ̣ऌᕎĬGᇏረᕡདྷዀቇomb൰˰˻˽ᆟࡅ˻ੳůᇕዲጷ࣭ጶధહHጯᑗ϶ৱ࣒ࡢ྿ȧጱࡗБ̂Ԧᑑ̳ϚшL̈ƓლήᖏጻϚʆᖓ༅Б߁ღƮᖙࡤጮᆤSȮͽᄣণ൝ҘኅᖦೣŪᖩȁคےงቲыᖧ፻ರᄞ፥İᖰȮ6ጇ೭ᆁᗀᖺڇ፳ᅉᗅᗁ፻ಾӛᎀĬᗈࣦቑᎺᖹᖱᗊᅘīᖸ˙ᗎڪஊਾ൨ӖᗠڴܴᅦᗅӶᗦőܼहᅸӳᗤᗙȮᅈᒻᗘᗟᗕቐቜբᖾᒸᗔᗚᗼႎᗪڄᗬࡳفᒤᗲᗹᘁᗾᗫᗺႄႈڍᘇܼᅪᅦՐᗞ˧ᘇǴ۴ᘌᘞᘓǠᘜᖯᘥᗗᘝᗇᘎశտةᘖᗥᗺᘯᗒ፷ᘍȮ఼ృᗿᗬ५ᅷႎᏮᘆᘴᖼೊჵูᘿಾᄑᒟᘀᘺᗐ॔ჾܦᘿՁᄯᘹŪীᅦᙃᙓᘴঁႍᐡኢᙍᘿᎈ೪ᎫᙘᘤᗚቮᄥᒷᘒᙬᎶరᙥᗈᒝԻउฏᏟᙎ͋ĦᅐҕᏑᆈᙽᙸᒥᗆѦᙶᏏᙴᚃᗠᏜഅᎊᙻᙵᙱࡻᐠȕ๖ᚎᚊᆓԚᚙݑDađscܕࠇᕯኰᓨᆠՊᗈᆣຸDDŽэ༓ເᆫࢄဌྞጼ͇U٘༡ལ༣ٌߴ܊ᚾရέဥဟѰᚾဢႮ9sᚼTӈቄ˶юk൭ᇉǣཙ൶ĥޥɻۼӼᕁࡗΩᔜᓵȽᛘgᛚᔞɫᒙᄈm_Pᔚᔅ᛫ᛱͫᛮᛰᔒViᔚࢴɲăຸćhᔫჸŘǹͻɅᚬሌဍ̃ᓪHနᛁፃ༺ེᛇᛉᖐ່࿎A࿅෩ྌဗĊધ܈ვْဦཥ\tધᕨࠂuჸЇዬᜏе࿇\tᓬɦᔐᔒᚳ᜵ᔒMDŽٮŘᔨᚥĘͮϣເ႗ͻᚺިS˗ໍᛀྦྷϛᝓĎྫྷʴྰ༰ᛂࠣᜡᕣႝ࿎ရʭྭ࿎U༄ᚼᝯᜲઙĜစᜂᚷЉޝທᜑཛྷ࿖आᚿྥຢᖚ྄ᜧᜰᜡʟ࠴ྸʔƀកᝫफចណྺᝰߊᜯᝳखo_Ϩi_Mބᔅࡹ֚Ⴭᕷຠl໘ឥPડໆᔻʆIΩᓊࠗʦࣝIγࠞᔋ̲࠴ሟऐᝬྟᇙΕ឵בឺូΠᔹāឫϷះĺᛐិឿЯᕦុΪ៍ࠩៅᛩT");
_this.parseZones(ret);
this.loadedZones['australasia'] = true;
ret = utils.lzwDecode("Rule\tAus\t1917\tonly\t-\tJan\t 1\t0:0Ě1ĝ0\tD\nĀĂĄĆĈĊČĎĐĒ\tMar\t25Ĵġě\tSĥāăąćĉ42čďđēĕėęķ0ĢĠŌģļħĿĪłńĮēıij29ŋĢĢĻĦľĩŁŃĭņĺepĴČ2ĸŎĢĤšĨŀ943Ŕ4įř\tlastSuėŭŏşőŢŴŶŖŧOctĘŷƄōĸĤZĎe Ŀtralia/DIJwiʼn8:Ŷ:20 ēLMTĈ895 Feb\n\tƻ 9ĸēACSƱ1Ƴ9 ıyƺƼƾ3Ģœǁ%sTƇĄWĪ7ŹŦįƍƏŽſƁƃġŀƔǕAǗĉ7ĶǛŘIJĺƂ>=ĚƒćƆŲǧĪ8ŷǬ\tǝżžƀƂŝǤŏűĽǖǹǚŅźǮǡDZdzǣĹŠȇǸĉĊƋįNovĈŬȑůŐǷǨ99ťȋǭijȎDzȃȒǦǗƫ06ȘēDecƐȬȠȆŒȯŌŬŌŜȨǿǠȂǴȭȢĴȾɉ08ǜƎɃȁǢŌȄŰ\nƖnƘƚƜƞƠPerthĘ7ƨ3ƪ4ƭ\tƯDŽƳƵȵcNjĘƧŏǐWǒDŽŵ3 Jāɱ ɳǏǗǧɷɖƗƙĆƛƝƟ/EucŽɲ:35ƪ8ɩɫƲƴ ɯɾƧ4ĶǐCɶǓŔɺɼlʝƨʠʂʢʄǷQǘĚǼǾǟɑȹǥʯǘȦŗ\tƷbɐǡȬǶȔʰĉƳĪȗēʴȀˁɆȺǦ˅ȤōȤŃɂȪȐɓɇȇHoƞdađȖŃȖŷˊɏʵˍȟʸ˛˝i˟ˡȤŷȖŹ˖ǰȫɆƆɗəʈɛʋBrisbĖă1Ĝ1ƄʖƮưʙ5ɱ̆ĸǐEɷʱ̏ĜɴʰA̓Ǔʅɘʇſ˽ƠLƥdemĖ ƽ:5ʔ56ʗ̌Džƴ̖̑ĩ̔̚ǩ1̴̘Ą̛ɸȥɻɽƻĈ̗Ģ˜˞ˠ̽ʮȔSʱǹĶ˦ǞˌɅ˪ȅǦ͍ˆȲʳɏĉʷ͖Ƿ͘98ȿ0Č͑ˀ͔˙ˏ͠ʺȳʽƸū˂ĺ͗ǘ˲͐͢İȍ˶˘0ǵͳ͙ͬˈĢ˵nȏĶ˸Ϳ͌ˈʲȧijƑȑ˃Œ͡ȥͮŻ2ŃΈȓΓˈǻŻȞ˙ΒľΔȊʼΗĢΚʹȖ·ŌŻ˨ͩͽ˚ΜȰ͚ApŚͲΛΤɋĬΟǮαɒγΣĄ͍Ȱɍ̧xįιȩͻμʹω\tϋɎƏ˗͞ɕ˺̟ʉɜ/ḀŽˮăƾ14ƪƬ̋ɬʚʾɱƾŏǀǂϫLJljϮʒǏ̶C̸97̺̓ǍǏ͍Ǒ̜Ƿɸ6πʼǾϘˎ˫ŒІɍǼΰ͓τ;νĄЏ͏ϖͨДĈЍľІŜ̹ȌϏ΅=ɍΪЅͭǼʾЛϑЩǩͶ8Ě΄ȏЮȔɸ8ˣ͢˥ΎЭШзȉǹȲд˷ΑΉЎтͮЊͻ·͕ɕЯ͢ČȖн˗эчПǹЈƌɏȪΘϙȡрˆɍѓКσѡȻњȖğȤɁǽўϐЌ͟ѣȤdzήУоцЖAƱȰĢǼągѺͪОЗɋĚϕͧЋюѢшζͮώǯХͼЕǦѾɊБςГжҏŌϊaόǀκғеΪϛɚʊƠ˜̃ɠ\tƾ4ϥуɪ̱ɭ Sũ̻є̚ǃĪ1̯ǝ̩1̩ƒҺНɴEDɸċƶƸӆ̒ϻЇӏƱ̷̜Ҩ˼Ҫ/Cur̀Ϥʒʔ2ɍϪ̍ҷҹ̓̐ϰ̽ҽĉҿ ӁęӄġӆȠ̚ӊҾ7ӍƹӨͅų͊ʤ̹́ʨӼ̑Ӕ̾ǦV͎ˆˋɄМͫȔԉǩʻŧЬѨпŒԒϼбίͺҔҝľԚ8ȲѦф1їυљĄԢԤёКіѩԈǹѥѮѧҜѳяԑˈ˴ѕѲѻԲάɋԝijԗՀǷԉѿґu҃Ն҅Ѵԙ҈οԶԎԱՈɋηʼҒҌјѼՉҙρՅԷՇԺϓҊĄҤ՜ԩ՞ɋҠҢѰϗԿՏϚʆҩϞMelboӜ̞Ǎƾ52̰ϫƵϭԄɴ̶̾̕ևǏԉӕǔǷNԊͷՔʶԸҎľ֒ԓͮЬ2ΡիǦ֚ԛǹгԾԟԘ֙ǹԔύթղ֑֠ǹԜѹժҖְˆѯŻ֨Ą֢ԣъ͜Ŝ֗Ѫֽћˈѯԍ֖ҍׄA֢9˓ƴֳֵ֮ȔȲȰՄ҄֯וɋҀθՌךɔׅ֘Ȱѷͥ֕˩ճףґ֧֭դŒ֒ȰќѹՎכײխϔҡ֬ФҦױ֩զҋדӇմ̞նʋSydɘˡ̗ϧցփӥֆƻөϸć֏ؖӽ֏̝˻̠ә˿oken_Hill̪ĵƨ̊ҴքӺӆǀEӬƳ̯҂ 23϶ӪǁظȤLjˠ϶ǎӾЃɸϽنǏ֒ىםٌχĄϺЄȇLH֤сͧ؆ף֪ٗЙԦŝδăٟԋ׀͒ՕƒěϷַֹٞ٘͢ԞΆ٣φ٦͢ՙѝƏ͝٫Ĝهׄٷׇͣרβ٬ٿǕٷˈיժ٤ɪٯȤחѸɂٜٶ٘Պҁנڕ٭ڀڗŌצͦհךچԹħٟҐҁׯƅԪڧՠΧқ٪ĸږէ՛֮ڎڮɌկыװƅڜؠϜ̡/LordةowƘ̐36Ϩ̲ؓօӎύطиӃř̴هٟٗʄҨntIJƎicƠıcquIJiƘєz۱ʙLJȚvصӫӋӀƎӂӲŌӴ̑ӉӋӹ̵ؙؕ̈́֊ӭLJώۼ ͅsɱ۰۲Łʖřؼ̎ۖӐԀ9ӒܘԆ̔ƫ̆ƙκ̩ɨ ɦ۾ӨȠŘIҽۂIndƟnӚh̀ſ̧ćɤ0ŭؒӤۓش̓ܺєCXƱؠ\tܯܱĖӚocoćې֞ƨєʘĉܨƻېهēCC݆ŲFijiˈԴȤșțҥхŏȠЖݠݢڃՊēԖҜܧŞĒǕݮݣȰŜǼ۵ĴׂŮĸݭݡݺĞמڰբՕݵĹ-ݸބɉ̆ސмھDZ2ͼٝރݯܠΌވݩĚދގޚĞΙĞмňޞɍޠݷݟޏܠΦŧި˗ЧڳެȇݹސŹէݾڍݬޢޅԧڼįь\tޫލ˺\tPacifۦ/1Ġ̬ƨɨܾĊƵӁ26̏٫FJ̔݇ߋߍߏc/GambۮijƭƧ5ҰرݕĊւǝɾ-ϯєGǍߤߌߎߐř۫esžƭϥʀے߶ӯƎ߹ЀźAR݆߉ߥࠂߨTahitݣࠉ̫ƧӮߘ̈ࠎtɱ-ؗįTAHࠕƗߊࠁߧߩ۬mĒϦƪůے84ɨɯܦϾnjʒࠌĞ۷Gҽѿʛȶؼؾۖݛhܭ̣nk ࠗ࠳G࠵ࡖ࠲ߐSaipĖۂࡗߐࠚƜwaĘߓʒƄߗزĪࡆ̓ę٫ēGIL̞ࡤߨEܰɟbӜņ2ϧƫࡅࡁ࠷ࡴߊHOيLJ߸̓ࠩܪࢋࢍڋɾ1ދēPࢌǔϛࡻ/Kì̧ࠞࠞ࠷ĜśۑߘࡱƻࠩĜ4ݔINࢎࠦࠨࠪƮࢲ̿ܗƼ࠸ӪLࢹࡣߨıjӜoĈĠࢄذࢇ̏MĪ6ࠏӨࢊ࣏࢝ʆ࢟KࡨjƝeƥࣈĝƾࢆࢫ࢈Ӫ࣑࣓ࣗࠧ̈ƿ\tKWѽΝʇgؼ0ߞ࣯ࣗࣁߦߐChuuk܅ͥĝߴ̱ࣦӽݛHUࡹƘ࢟Pohnpࣟ܅3ܼւ࣯ࣥ࣍POࢳ\tࣼ࠘ࢠݏƜ̅Ĝ5ߔ̯जܩ࣯KOӬܛࣹ࣫ӪरलȤझशऱࣘɘ࠱ࣽߨNaӜu࣡अࢰࠌޖɻ̨ԧझݚ\tNࠔŔւܕ्Ͽ࣯Jल࠽ࣵęࢻ࣡ॏ॑ࢴϵ࣯ࣕॡǕNCǘђϼӣģȶޞ٬ݫނ१३ǩԴ7ѯ֝ČӽޡŲ२ˈٹįɯࡪѡЖॿȖɂؼͲ߈࠰࢟Țumeࡩࣧʔ4इӋւňęࡎؖȠॿ२͋ħNZĪ֞ͮݾ חށŏআথĉӢΖǮ Źٽİ१যȥԴ3ޓѱХۀهমদС9়גҔԨĹMসĪ3ŹŁһҤڕষॾহŔєҸŪڛূ্ŁঁŇĖॼԪতǘްݧȜִٝׄࣿaɡ߫২নݨҌʟעׄ১ǩǫݳڲ՝Ǖ৯ৱ࠶৻֜ͰՆ৷ڎ৺ϼĶѤڄԏ҆ਂh৲ਅٛգਉԐণহ7ԭˇ٢ּਔϼਞٲхਉφˇ͛ձিՖȇਢٱ٨ݩਙ҆ڊҐڿγਚăਲਸՐăΩɊԦԨהħੂѦ״ৈٴŭ০থէס৭ਁਓਃՓਜ਼ũѺੇڥਖ਼ҟ߂ңਧҕڎੂկڷװĻ࢞ࣂϟʎkŽܰय़ϯݕԣʖ۵ӄॎĢ১তϻ4̯ছęवઇথઉӖࣙੑŭܾ࢘࣋ં ؼࣹ߁ऌAग़ઌ̨।ʟ\tੂCHAʄࡓࡕ࢟ącĖdƙۢۤࠞۧ/McMӜdoਁoإǘАݾ̈ॱŞ٭HЖCૄःǩˉ֦еލŲૐૅਗՕॼ્੶ઔी/RIJotĎgࡩࢮࡃĝईࢬࢧ٭ݛKيઃțࡳࢶӽःCK۠Niuă:ĉݓ࣭࣌ࣉєNऎĪपࢶĠॠॶࠦӂକ॥ऎࠀȚrf˝Ġܽݖࣦଦ˕ॐईଔमॠFيɨߛӹܻӳƓŏNFलǪلrӄ܍Ӆșଳސߚۻୄହঞ॥ଳण࠳ߋŽॅ߱ɤ̮ƻįPWए࡛ऒɠ_Mۇࠆby̪গଌચ8ࣸॗ୬ङଢ଼Mҵ̳ࡏߊGୠ࢟Bռ૬ƥvثĂęࢨગब8୯ɾ߳ɩP୵ք۷P॓Ԃक़ग़ƵػޖஒஔޯࡋcؼʖؼॆєBǃߐPࠝۧࢢė-ʞࢨϩउࠨƧॏPडȖʖ܋̩֞ͅஷञܭୢago_ߋைࡪŭ3ɤࠥચॸԂ̩फ़ଉΘઙவߓଜӪNलЇܢrलǺજૺǎįSࡒƥરோ௱ୡतMˮࡨNJŲWψކͮੜѨӽĚׄސޜŧ՛ৰеϧڬЖఄޛ˨ৰ߆Ůףఎޤ੫ը੭\tఋݶড়ݴకƕतιƟ்ʒܧ૱ɬʧଜߜ̫இߵ\tल5୰ࢭࣧĢఄSܟĞӃśؼఝދఄଂࡺ࡙a˟lۧnƝ૯গࠌࠥӪSBएितFakaoଣ࠷ࣉؑశ࢈ଉӪTఅܦిĈ࢙\tȇT૫ঔԵਭɣঅǕಁn૬םলijټцಀಂಌץ৪॰٫ŲಉಋಕȰଭިಛৰapॅ࣮ଋࣤவ࣮ƫࠫŁࣦ౼TಲѮ̏ދಥ౽OऐFƂafuࢦଧېନߵಮࢊTV࢟W౨̅ŎݑঘࡰࣦࢊࣲǕVĖ۬tлఐŪĵોޘೞৰೡ࠼Իфؽ೦ॽȇೝn೫৩ͧ೯ఁॳŲೳЙѬ௫џŷভ೨೪ˈк߃ৣഃħഉˢਵഏഅ˹ଃEfৰଊɦࠣচौঝ\tഓೠനUߣࠖج́Ĉગӡழೊ࣯Wୈ");
_this.parseZones(ret);
this.loadedZones['backward'] = true;
ret = utils.lzwDecode("Link\tAfrica/Nairobi\tĄĆĈĊAsmera\nĀĂĔćĉ/AđdjanēąĢĊTimbuktuĞāăAĚĭĤrgentāĊCatamarĉĄĻĖĽĿŁŃ/ComodRivadaviĝğĹŎģAŞăōěŏAtkŢĸŪļAľŀłnĊBuŀos_AĎesŲŏźżžƀrƂķĠĺūŦŵŒŸŔņňŊŌƎļŅŇʼnŋŰƍťėłkoůĪƙŏŕĜl_HŊbourƌŤƏėƑŷńordĐaƄģƪƽbƟƵļįjuĩƿǀĊEnsŀŝDžǍ/IndšƓǗǙNjpoliƃƨģFƻt_WayneƴǕǜǚĊDZǞǠǢǰǘDzǟǡsǯǤƷőƹ/JuljyǕȄȆǾơǖǹNj/KnoxǕȑȓ_INȋƶȐŶucky/LƱǢŠlleǕȤuȦiȨǮţǕŴȁœMŀƽzƿǿ/ȷǘoȺțLJƻoŁoīȌMɅtƊalɂŏŚo_BĜncɇȼPǧɓAcƊɐƐȵƓǂƾǕRŽŊioɡĮiljNjɈȜSĩŇȘsabeɏȲȼDŀvěɲļShipďȠɭ/ɛrǨof_SpčƧȌVĎgāǯPacifĈĤȟklĩdĄŁƗłģSƱth_ɛȩǾsšĤshgɹņīʶėʹkhʼdʵʷKǠůŇʾʷŅlcutŇˆĊʅĩg˃ĒĄʿŔhɅgqāg˔/˖n˘čˌńhu˧kˢˤD˃ů˪/Dʞĉˤ˦˨˚ĘʷƮrđnˤUrumˡ˵KaʹʻƳɽ˜̋ʰʼnǘůņ̔dĶ̐ʷMʞa̖˛̝̟ɬ̜ĊHɓCʆ_Māh̢˕čgɅˤJěuɸȩm˵TɻſŠvˤTʆmpˬ̼̈́IJˤ̞ůsɸr˵Ulj˧ʲʧ˗̄ʦĩDŽƕ͐˾ĊUʦnɔņƻǾt͡ʬ/FŊoȪĄͧɵʢͫěͭǯEƲope/OslɇͯͨʢJĩ̬ǫŀǾ̸ɌɎʷSydǭȇAΊƫʷACTΉsǡ˕ΏΑĄΔΌń͚ěĜΚΜʷȤƼƭowȪΓΛΕĊLHIΨγ˥ΟeΒΝċSWθΣ˶ŊwāΡβτNǧhσοɕǢDŽǭωΩĊQŻŀ;ʧϏΖdɻčϟϕιʮˑώɽξ˿ƾʎϣτŤ̔šϝĊȷlưƲϔαϖ/ʘctƻϲϨϊοPěʰīϩĊWƂtϳ/ɕƥŀƭȯlϭοYĩɘχnŸʋɒɔɖɘ\tɕazȯĤɟȱűȼόďn˃ēФЦl˶eЭɅ˃ʋɴɓʝuͿУĜг/ĚЍɽɉNj̸бсЧЋΛʋƮǡfaȔ\tŅŸŞĤͰŒcʋWānʇegіNjљCŶƫОѣŃēїǓух-ɴsˊchewĩʋTɄɆѮѦǎхě̃чȜEdŗɆĪѯљɊ˭Ňʛ҆ʄǨJohǐѥјĊNѹfƱǘ͡˅ғŏVЙƱʁ͐ҍĊʝʟʡѝҤģRѬŸҀқ˥̌ѶѸѺ҅ЫȌWʆte˞rǑҚѰYij̴ұ̱Œa̳іʆȩŔɋāŶɎʜʞʠʢфΛʂӑȯͻӝӂrIϛǘѐşɱіuDŽǾĕǁčďēEgypцűͷďͺ˶ӭǡĪ\tEƁͶӽȤȿԁӻͻBɻѓяȲԋӽ̪ǢŃ̡ԓͻįĜsǻԅӼͻԈƽԁGBԟԌȣɅԣēԥ-ԃɠԒtc/GMTē\tԵT+0ͶԲԴԶԸԺ-ԽԱԳԺՂԶՅӺԿՈԬƊŀχѷˤ̨͔ˈ˧ēՕgƤ˧ͦԳҳykĨŠăIcϠӨ̦/̽hɖēIɖ̵̷̹e̻\tӦĜɻʋ΄ʼnĖēսč˹իѽȡ΄ʔҽĠҭӛԳKѺĨȩψ֏a֑eҒЫӰĮćǻ˚ĀbyǔȼLjNJҵ\tȷxĈoЏ֕aЭӂʋ̞Ⱥћ֧e֩ɘ֬ĨSƲֱֶ֪_Citȇ֪֨ԴŀěӘȲүʣȠҢ\tNZәҮʢ̪ņ˃շג-CHAΙӌеnҩēČŜj̥Ы˜˻˙ēPRCה֍ʌҗnͺ˚ʢɛŸͺײʝ̳͕ӐԳɴŗǔ˝uijӚT̆kזˬ،\t؉ИpԧӽǪӅawǠϜԒԆԡϒɅءʎuʻɼתʷϯѢ˚ROױիSeƱЕ\tسK˺ˢaǟƊēSؿفЪĠԙǖΛ͚оēTƲkμԾԳUΘԸٕנҾȜAɗӄӏȪUSĤʦѵ֢Ȍŧaũ١٣eˑǚʋP˞ŀiѕ٫ŴizɅ٦ȜԕĉӐ\t٫ѨŁѪסǴǛȎǶƃ٫ӣ-چٻļҝw_Yƻăڌ҃r֊ă؉ՕǠо̖٫ƮѺiiʋڏȐȒȔ٫ڏѳŇrّʋɿɌoׂē٫̭ѷiʻڛǕɿףӟڸҠґڽȼȤƈ˧ɻƂڀ٢ؓԳмӏɇ٫؆oǔEԿUTCٗۜٓ/ۛڷѡҩ̹؛ͻɊsКēWѳU۠ۢԸZڠ");
_this.parseZones(ret);
this.loadedZones['etcetera'] = true;
ret = utils.lzwDecode("Zone\tEtc/GMT\t\t0\t-\tĉT\nĀĂĄĆ/UTCČĎĐĚCĔāăąćUCċčď\tħēLinkėćĒČČĒ\nįıijęěĶļUniversalĹİIJĥĽĜĶōZuluŊĻōĵŐĘGreenwichŖŌśĊĿŘĊ-0ťļřČŪT+ŭĺŦĴŨŚŸTŭĕĤŧT-14\tƃīĒƂƄĢĖŲƂ3ƅƏĐƈ13ƋſŻƂ2ƅƚƒū12Ɩůƞ1ƅƤƝƁ11ơƍ1ĎƭƇƞŽģƢƁ9\tƶƧ-9ƫƀ-8\tƿƹ8ƼƘ7\tdžƹ7DŽĈū6\tǎƹ6Njƈ5\tǕƹ5ǓūƄƄƹ4ǚƁƏƑđūƕžƴ-ƚƜǤƁƠǧƬƅưƨǠ+ƦƦǬǵǴƜǫĒ+ǮƳŲ+ƑǣǽǦȀƀ+ǝǝǸǟǯȈǗǗǸǙȎŻ+ǐǐǸǒȔnjųLjLjǸNJțǽǁǁǸǃȢĊ+ƸƸǸƻȨųƯƂĞǸƭǴƩďȷƧǵƪȯǵƜƟDzȾ");
_this.parseZones(ret);
this.loadedZones['europe'] = true;
ret = utils.lzwDecode("Rule\tGB-Eiră1916\tonly\t-\tMaĔ21\t2:00s\t1ğ0\tBST\nĀĂĄĆĈĊģčďđēĕ\tOct\t ĜĞĠĢĦGMĪĬăąćĉċč7ĐĒĔĖAprļ8ĝĥĢĤĠħĩīāŇįŊIJ1ōĵŐ\tSepģōĿġ\tłńŞĭňİŋ1ŖŦķĘŔ24ŗŀģĥŜŅşĮʼnıČŸŎĶĖũū3ĦŮŁĄŲņƇŶţ9ƌŧż\tƑƀůŚĦĨƅŴšƉčƛźƎŪĝƛƓŰƕƦŠƈŋ2ĦƬėaŽŖƱƣƄųƵƙČƸƜķĹĻ25ơƔŃƴƘŢDžĜƺŒŔ 3ǍƂśƥǂǑƩěLJĖljļǙƱűǐŵǒ922ǢƻŽďƿƃǝƗǪǠǮƺǤ ƾŘƲǏǞǷƷǙǕœŨun>=ĎǚǀǵƆȂIJ2ǙDžſƭūSȈȊȌǧƳȁƨƷſȅŔșȉ=ưǾȎŝǶȠȒnjDžďőȆȥțDzȩǴȫȐȭDžȯ93ŖǣĺȇȦǮȝȀȬƶȒťŏķǖɃȊȨƁȪǩȻǬŖDžƛȲȤȚȋȶɒȸɔɉČƠȣɏȧȍɠȟɢȾĜɣǮɚɦȜȷǜȹƧɫ3ȄɌɰȴɧdzɴɡDŽȾȢɺ\tɎɼɲɟɿɪʁ3njɥɼɑƢɩɈʌďɣōɻɜʈʒʊʔǫȿǯʆɜʑřʓȺɷƫʄʢȦʛʥʝʧʌʩƍ\tNovɱɞůǨʋǫ4ƹʄFebɦȓɨʯɶʁ4ǔʄĘĔɼǮƣĢŮħDɵǃʽɭ94ǙőugɦƛˑǛƤ˖ǟŋ4ː˚ȖʅȳɜːǾ˓B˕ʀʽʃʳƏʸˣʮˤ˴Ʃ4ʎʪȆMđȊ˯Ɓ˱˳ʼ˾̀ʳJāˠ˺ˣǁʞ̋IJ4ȱĸɂˏǚʻ̔˧Ĵ́ɛȦʤ̒ȏˈʽɋʳƞʭ̥˥ȑČ4̩ŧɎ1Ȕ˰Ǵ̞̖̲̉ɍ˞ģĦˢɓ̊˧̼Ėʵʷ ɅǾ̝ʰʽŹˌƼģſɾ˼̖̓͏ʳǤ3ľ͋Ȟ̺̰ʲ̳Ȇǘˆ͕͟˚͡LjɂƠɆƖ͍Ʃ5̀95ɯˬ̢ț͓ɳͦͯŋͱIJʹͪĻˏ͜Ɓ̧͌Ͱɹʳʫȵͥ̓ͼͿȔ96ĦɁˮ̜͞ΏČ5˶͢ͷɽͺΎ·ͽȽ5̘ɝ̦˗ͰͅͶ͔̐άͽɗͳəίʇʹ˻β˦IJΓʡ˭̣Ϊ̮ɕ6˙6˜ǰ\tlastȥσ˽ŋφξɀ̙ΖɄǦ͝ɇΚΒſČ6ʘϊʇ̤͂ͧ6͘ŧˁ˃ƋαΫνČ7˩8Δϣʚκ̭ϒIJϲIJϴ˄Ϛ΅ΙΣϽ˙ͳŻ͑όώϐƣuϹ̓Ľ98˙8ηǤˏ̶ĠЎΆγБ9ͲЇΕ˄̆0ЛȞZđăEurope/Lđdđĕ0ğĤ15 ĖLńģ8̱ Dec Ľчзŀ\n\tэ ъłȭ%řΒ8 lj͉7ьюǀĖƥϻ1їĺǘѡ͉ĥuћļѐνѓIJΒѩяƃEUƳ/ǝLink\tЫЭЯбгеѽЮаJersey\nѸѺѼЬ҄ҀnдnҏѾаGu҇n҉ҋҍѻ҃ѿвғ҂ҐѿIsĂ_of_Ęn\nШnЪҦаDublѹж:Njĥм\tоTрϴ A˞ч2ѩ-зҾěӀDпƊ6 ˍ͉ѥŮӋӍ5ҽѡǀIĩţӔјшѦыэѪƃȑѭǓухч6ѰѫȑǏ/ӠӃ̰0 ϫ͉лӦ0Ӳƃӟӡ̰ӣѣ ӔӿԁśĖǏ̻ӕƼĽԉәӨѱśԃӸ˚7 ͇ӉӉĥԋϵԎ̰іǖĽіԊԕӳȭӵӷϕѢtљѰѝ\tԮϱѡј͛ԟКԡνԭԄ9ѯԪѲѴԿǐѳϻōČϾʙʬļЍ̒SǞՈϱή˸ЊϏȈՏѧƲ-ՓѴϱϩϿĽ՛К՝՟ϻˡՁnjȗϋύՙҕĽ՜ΔըՋĜmaxЈŔϐղզǀՒƗՔՁďոպТս՚տХէƗWćЬՉϽϵΨĜλւƆѽ֓ƺկվˢմ֏֑Ŕաǯǻ֣֗ĕǞ֜֒ϱժСŨƮ֊ձ֬՞֥֝ն\tևջծЋ́ƃ֚ĭ֧֯օֽչϿֶեʺ֭ƗC֦ӢπŔͬ3ԂׄǞגֻij֩ɂդ֎ƆלְŌţϖɎ̃ʬnjӿ֙כדƊՊčϖ˸țȝֹפױ˚ʿΊͣ֗αׅăץ˨ǯ͇ļǮףĭ؆̖ΉƝ͑2ƛ؍ցװם˛ןĻ ſ؍ؚ֤ϟ˚լίȋ؋Ρ\t̰ؐΝգ،ؙצ˿ǯ˸Ȍؠאآצ7׳ՌθʚتʉĦجخ9ؾطֵ֡سב7բТסَؼ7ֲئׁ֠ձٕ؏ГֈϊؗךُםΒ٢ٌٝ͝ĭEِؿ֕ρțөԗ٧Ɔٲםىًٜ֟ٸĦءٱِْϗՏڂ؎Ъِٙķٛհڊڄڌם١־Ėƞ٥ѫؘփ٪ڗڈښƃړ\tĀssiaţή̎lډȓיśM˥ڦڨڪײǯфcĝŖԖڃėͮĭڵکרǯˍƟľ˓˓M̹Ɔۃڷ״يūعǀǀڳǐۏƚۆęۈĝטśۋۍۂuڧۄƊͩĖڭډӿ̒ڳDǞۙۧʡ̾عѫĦڳK۰ۤڶȒˋʳϫ͒۞ڱ۷SۯƗ۱Ǭ۾ؓŽƒ۟ƒƃڳMۺۥېǡٿūסڛܐ܅ܓۼǓ۫۶ػۣܔЅϽ˫Ɏܙ܃ŨܝۦВДω֪ڒܣă܈сѮĜխ٥ٞܵۻܮ8ȽčֿܻثܭېǬۛռ֡a؝ڰٹśج܈݈ܗ׀Ϗ؋ڋڥܾ݇Ǧ01ϵڙ٭كʜم݆ѮΑֳڐվܼݛܥČ٪Ƹݠ٬ځغ՞ҲăWEӃŰՄ\tݺѓĪݸحݻэǀؐCEށұЩėޅ̒ؐMފsނލEޏ˓ՈޗދƗAlbanܮʾǯ̎ҕȌܚݐǞޞޠޢې؈ƺ؊͉ƟڣܴʅޟޡޣֿؒؕơՑޫޮؑו̿śڤެې7ذژۜ؞ݽݏݦޝ߁ܮߌܠܢٰă߉߂ϱ̌ؓĔդީߓƆߝߖߠرߑڿߛޭߖ̠̪ߏǮߤܬߔ߯ߋ߱ŧǻǙߚ߀߸֞͐ߢŖߵجߧߋήǻߴ߭ࠇϻڇۇԈ߫߷ߊࠏߘĜ߾ࠕߞوۨƻߢnjࠅ߿ֱࠖےƟڃࠌࠣࠜϾƺࠑ߽ܫࠆߕېࠬʄǻſࠚߦ࠲ܦɥ2ďࠢࠛܿ܊ڏƮ2ō࠸ĭࠎՋǹࠂ؋ࠓڜ࠹ࠀࡊߘ߇ࡉВɰƋࡐࠤࡘ࠘ࠓ߈࠺Ջߍίߣ࠰ތҳҖґTĉޡċ:ČҽӺнӒč4ѩԴމԙʾ ަԒࡹƃࠎމށܧࡾāࢁśՈࢄޔࡩҴҗ/AҤrrڪъ6ğ4ӀӂIJݟѩѫĖݺࡼӔƏǘԀӨࡺޅՋлżѤԻࢧކݾࢌǐӇώrܮdžɥ njޫۤtࢷܕŧظЁࠍࢿࣁ̖ߺɍȆ1ل߶ߦࣉޣʖ˚ϖЗقݭࢵࣀޣήܩϸࡏࡈࣔޯڇ̴ǽ࣑ࠆࣤ֔߄ࠒࣣࢶܿࣃࡃū2ࠄࠩރҡаViennڷğӜӏࡵӸЕ3ӆœࢉĦވޓԙƸऋʅ࣫ࢳ̖ӺԦӥƓऑऍࢅ̰лग2ࢯsऑއEՀ˿उrĽठऑĖࡻ࣋ऑࣜ࣊औնऑࢋऎࢎѿMѹsѻĤͱࡱӔअӄࢰƂ;ژࡶžԐyӉѩ˓ĖޗԙƑࢇnӗѩݙژSK̖ѡࡿࣶचדऴ˪ࢇlч3क़ƃۙ۸/ۮѮॆख़ėज़ܸԐऩԺबӨ˓ǀޗՀč ࢥؕडॏƃ॑ࢪՁठࢭঁھढॹܫॼԙǬॿŪљщŘঃśۙޛޔĝݟѡউԛॸэॱFޅݲ࢚ј࠽чˑ३Ԍॲ۹ƗBelgiumۅ࠭͑ ؖѐׯরলশۅ۲ТSٷݎࣇǞষ۲হǗľাƆৌুǬࣳĖ܀࣏܂ࣩোীৎȒڈ˅Ɣ߭ৗৣܟ܁২ࠔৢূ৭࠵ɂNjয়ি্৴Ǭࡋ߲Žࢼৱĭ৫৽ǭɊϿtৈਃڤਆ˅࠼݅৻ȒࡥƞৰăਐȮ࣭͓ਃਝħ৳࡚࣌ŭਣٺਅਦਉࢺưਫުਖ৬ɖ߄ਜਬਞਮDžεʠΗݶৡৼࠞɎǡ٦ਲ਼৲IJɤ̡ģǙߥਭੌɣࡂ࡚ؖࢽ৽3Ξǥݤਗɣ࡙ϊ࠽ʂ࣭ڽਗ਼ੋȾߩߎזਕੱਵ3ਨίČ੩ਤਟʗਡਥ੬ʠ৮ࡅ࣎ď࣒ઍੜࠞ؊ੂਜ਼ޤƺ܀৸جઁ˪ࠦŤ੩ਏ਼إ࣭زઔછੴִۓઑݭઢ̗ۛĔઘੰભ࣋ߘōੂࣹҵѶrۻলŁࡱ7:॔ॄŸϴ࢟ૈϵBӒЕঈęপपԠӨࢠݿআ࣏Ԝʶч8भބԙĎौھॡ֝ॣŸvĽӞЍ્ǜਮހছӹ૦Ƹংࢨƃछ।ࢥǘऑਟॣؾशѴࢳোā˟ࠥ৮͛৹੪ħଊթࡠעਏՋͲ8͵ʆেةଐBଗВ˸କଡ࠻ʄଥઽ˓մિSҬۦૈט8ૌૻΦ:ΦķI˚૭ࢦগϵ॒̖ठԝ͉१ࢱś૽ࡼ5ૢयझनԞǘঅԙ٘ॵࢮପচԙଚp͉ԉୢܸؐୢټ֒୯ݰњࢊѴכzхh̖યܩࣨݥઓcझ؉ʶрΘ߭Cஆஈ˚ࠑ࣡અஏ͠ਊࣚٯ̰ࣟȆdžહஅடࣗஂஇ̖એǗϥךґPgҚݽ5ે4࢚ହͱ્ஹ:ķPୂԸĺ૩֒ॣ୨ĽঠङૻஐބजࠝଆࢍƗфnոrिמহષਢࡨࣾȌݔחࠩƼજࡌкڊਤ௦પઋă௵௮௷Ǖ۴௬௶ԅશ۫த\tݔٔంƆఊ௯ήࠑ؟ఈ̻۳ଋĦઙఐԤఆ௹ఉఞఋఠ˟Ǽદ֭ݸ ࣺ/C҄nhagࣾөुૹହПԁࡴحୂ࢚JޡপԳƃగொୌডحॢऎୗ్Ԕќైదѻॣௗޕҳӆtόntic/FƼoăӌҽે0Ӂࡶ0іౄॖ11ԽࢡআГԽՈǐThƆݰІ͵ݢځॺైǞಃಅՁಇࣴݕϐଯతಎĭݰݞ0Χٶଞܫ܆ƆಗŋȾজಛݴڑಕجಢಥōڠƞɼஂ̒ಠĭಫƸ0ಭ͆ʇݦమAm҇౧a/Dޡ௦sవvॖ-й4ுీ࢜ӓ॥͉ૡӨ-ॱWG୦खœӰࢯӋݙಀGՂэȀಿುࢷcೄScoĊsbysȈdмĤࡅାठijॠॐح֔ԓ-˓ވ૾ГୟؕӋॻౠeӆ೫ೃ/Godtవ˃ҽ࢘Φ࢛ࡶڭೕೡݿഅଘഇೠೢѴދ೪ೂ೭/ಫ-ʍğіനāപśಫAശޖીTalҺࣿƂ39ബॆĤബTധіϫைŔ૫9॥ࢁ൚ভ൜एঞęୢଡ଼कӆӈԈবݡॳ̰ѡࢥкൠ̖࢚ঀӊӨݙ५ज़७܅Ͻൣউഈӧэಋࢊथ୦ൣঀ࢚ഋד୴ՁіൽୱݰൣԹѥെॆഃୈಶठӼěѼसƗFѹd߄ɅචଐඬĒޡද̰ਫ਼Ͽϟ௫Ɔඵථܦࡒੵಓ՚උ௺\tභශВ͵ݫ՚ݙରോHૄѹkiൔ4ൣହّ૦͛ේηHॊ൪ҋ୷Ħғඩ8२෨ѼකދҟऺаුlڨѺෘరżࣽవmҰණncŷަ৯ਲFฃฅהৄڈ಼ৰڤฌޡฎڸઉৠขถŷࠐબăตคŷࠞƞդਹઌรญƷঢ়บஃجฤทܠ১ิƷϊਸชత۽ืਂఏĭโDžයස৸สซอȒ˩ਿฑଝਔЂ่߭Ǭ੦ۇ੨ํแ๏ȕ݉Ư৹பǬͣั๘੨ɥથำઊਰපࣦ࣎ฝȒமজਤ๘֧Ʌเநઅຂ๊ࡦຆยຉȾ๚ؔๅป3ࡥܩਪຒຂયƞ௪ນ็ປࣧຌหຓล੍ǗǦງǞຂฟDZສ๎ດຘาຳປખϭู๗௰ۿ˂ĝఁߒດˊడѫۋໍǻઑ࣯ฬໍຏศ়ƃ໒ผອඹஊ͈،ݙກຖŽਖ਼ໞܐ໓˚੦࠶ǥບໍຝͣੑۊีூǺנڽەຍǗફ۠ضݔعැฺ7ஓؔ༁ດ༒ࠦ੨ଧݷිளƼiૅ0ൔऄआॾࢭкক࢞ğ༤ܹ\t൪ऩ౹༫౺༭śโಁ൮ࡿୡௐऌோӇgӽ෩๏༼ୖ൷୫ǀโ୶ĦषޜȐ҇ոnષஒ࣐ຽǶཚޡཝવ؝ŭๆŇལཛྷఘசੀՎݭGཬཥຯļďາརrཛཱུఆ౹ǚໟཙཻཤఘƺจઅཱིྃనϭຒྋོລഗଳvࣽtރஉĝའܒņॿʶྛྜྷݔž߆̀ྥྚeྜލྞʄગனէலѿrஸטࣶദ༧ईǖ൹ொࢬोԩཕྯྦྷލொӱཁĄུൺଘଈ෴రZЬ౧రଡషҰమరGiblt͑౮ěҽൖӅཆঽཉѬєஹୗ࿊̒म౽ൾཕȁĊхŋޥ̏ ࡆ༖Ňငีဇ࠙ලŴဎ˧ພࡎྊပධޱ༏߭Gရ̰ࠧမຫဢeစ߃ཧļ࠷ဓဍဪี྆ဉဒ໋جဩါΛຏࠋࡕအဣو༅ģဿཡȐ၂7ય؊੨ঽݚ်ี༙΄၇နဲŋၒ৶Ļݳི၉׳ّ࣍ΟၔၐၘՖࡄϸڤၥࠗྪſඳၪ၉դൔးဃၗଓྪʑ၏၂࠴ຄډ໘Ąၼତࡄࣷ၀हరAടࣾʥຜ࿁рͳௌ࣏őധӔഩ࿀Ԗ༸ඊӪရඕˊୗƑऑၫொ࢚गࡸၫඕ౾ޚඪƆHȈgƼཝƋࢺ֗ྉຫႳnႵrႷڇظઑဠǞႽႿႷ௲ၵƗჇႶۚဝʷྫ߬Ⴔაྴ߲ߢ๕ྭႼიჀྵသ֗ࡇăსఅྗ\tშཥࣖෛՎజĭჯͨၡɦకຒჷΛ̴ମჽრཝ;ိ˅ჵყᄄͿؤ5ئ๛ੑႀჾͳᄍئܳ߭ᄓିဵҕ಼ھଐᄚձღხᄋΛڬ՚ᄞ༂ჟႾკͳၧū٥Ⴥᄧଣ࣭ઑᄬಾ༞ྺudaЯώƂĎࡳႏŸП࿅ඛ״ऑჷொѡगೖကᅍᄋӺঀԨကབྷƆIฅවڸฐঢ়มჍᅠᅢ්ธၚĝ֫ူԵᅪ෫Ɗεʷ۔ᅰᅡলᅫ܉ଟਤᅻᅣᅾᄜ۞ڤᆃᅽ຺࠼ᅧპᆊᅳȾࠞǤଦಕ߭ᆑමǯઞ໊ᆏతᆙकढ़ķ؊̛֘ݚᆡ൵ධසᆦ׃ຫᆩᆬقᆧᆂᅲᆚ؈ఠ̅،ָǞᆰ̱ξϢ֖ᇀᆔͫఛᆾƗᆰ;Ϡ̘ࣙɄᆽཪᅱᅼᆒϡืؖᆾಿౣޡ౦౨RҊkjaྚѻ್ҽϖПᅒĕӟᆷԵSϨঠফՃভϜĭIĶӓဈձࡔၕăᇼൎႷܲ၎ᆉᇽႷྲྀࡧჭህᇾק௩ࠨ๖ᆿሌস֧͐ሕሃԵመᅴۚᆻةሊሑߙຒሦǡ၎ᆂሟึ།ƛሤᆘሱໆŧจ௲ሯઅራدતဋሖᇌሷ၄ෆᆠቄતࠡᇔሾཞ৮ሪሷለנၩሥሷఓ͑ިቑሆ྅ᅭࢻ߫৩ሗቜྎ˃ਛቛሒ4ڇᄗݭቍ6ࣖϨЈˎˮ၆ଐቮተη˸ˏትላባΒࠞจሏᆟجቍ7ۇႀኅႃᄲݣᄥኅ˙ϼߎታᇒဧᆐሱ7ᄣ̒ችሒϼိኂᆨኘ੦ኁሂቶኣϻ˫ኛኘਙۜ၍ဌሞቾ၊ሀၿቨཝኴՕಒስቢኞ༓ĔƠሼᆯኘၟηۇቻበኧኳቫנ့৺ᅠኘࠞ˸ዂྐྵаRoುݽෛାृ༦рቯௌǭ્ዝିĖRୂईୋѥ࿑ራొୄౕখ࿑ᅔدዯመᅘ࿖स࿘ીዙዛరVೃҰዾጀґnҮ༠noǞLྚ࠳ֲ̘ಉڑઠጒጔܿኻݣાᄼዘiႵ࢘ຜķ൘ૈጨ˫ዩԥೞ༪൙ጮ̒LՀ૬ཎ୍ĠጷየധൣगӘཐጭૈśጹආ࿈फ୬ૻፈķጰȒӔӖ౹൬ඩࡼख൰ൿബ۸ढ़ዸᅓགྷ૾ோј̵൲ݮۼ