diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 5a324ed03302..1d8b8adf58ce 100755 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -17,6 +17,7 @@ Cu.import("resource://gre/modules/NotificationDB.jsm"); ["AddonWatcher", "resource://gre/modules/AddonWatcher.jsm"], ["AppConstants", "resource://gre/modules/AppConstants.jsm"], ["BrowserUITelemetry", "resource:///modules/BrowserUITelemetry.jsm"], + ["BrowserUsageTelemetry", "resource:///modules/BrowserUsageTelemetry.jsm"], ["BrowserUtils", "resource://gre/modules/BrowserUtils.jsm"], ["CastingApps", "resource:///modules/CastingApps.jsm"], ["CharsetMenu", "resource://gre/modules/CharsetMenu.jsm"], @@ -3773,16 +3774,13 @@ const BrowserSearch = { openUILinkIn(this.searchEnginesURL, where); }, - get _isExtendedTelemetryEnabled() { - return Services.prefs.getBoolPref("toolkit.telemetry.enabled"); - }, - _getSearchEngineId: function (engine) { if (engine && engine.identifier) { return engine.identifier; } - if (!engine || (engine.name === undefined) || !this._isExtendedTelemetryEnabled) + if (!engine || (engine.name === undefined) || + !Services.prefs.getBoolPref("toolkit.telemetry.enabled")) return "other"; return "other-" + engine.name; @@ -3804,25 +3802,12 @@ const BrowserSearch = { * item was in the suggestion list and how the user selected it. */ recordSearchInTelemetry: function (engine, source, selection) { - const SOURCES = [ - "abouthome", - "contextmenu", - "newtab", - "searchbar", - "urlbar", - ]; - BrowserUITelemetry.countSearchEvent(source, null, selection); - - if (SOURCES.indexOf(source) == -1) { - Cu.reportError("Unknown source for search: " + source); - return; + try { + BrowserUsageTelemetry.recordSearch(engine, source); + } catch (ex) { + Cu.reportError(ex); } - - let countId = this._getSearchEngineId(engine) + "." + source; - - let count = Services.telemetry.getKeyedHistogramById("SEARCH_COUNTS"); - count.add(countId); }, recordOneoffSearchInTelemetry: function (engine, source, type, where) { diff --git a/browser/base/content/test/tabs/browser.ini b/browser/base/content/test/tabs/browser.ini index dbe4997a49e0..7771e0a6efb3 100644 --- a/browser/base/content/test/tabs/browser.ini +++ b/browser/base/content/test/tabs/browser.ini @@ -1,2 +1,4 @@ [browser_tabSpinnerProbe.js] skip-if = !e10s # Tab spinner is e10s only. +[browser_tabSwitchPrintPreview.js] +skip-if = os == 'mac' diff --git a/browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js b/browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js new file mode 100644 index 000000000000..3316042116f8 --- /dev/null +++ b/browser/base/content/test/tabs/browser_tabSwitchPrintPreview.js @@ -0,0 +1,23 @@ +const kURL1 = "data:text/html,Should I stay or should I go?"; +const kURL2 = "data:text/html,I shouldn't be here!"; + +/** + * Verify that if we open a new tab and try to make it the selected tab while + * print preview is up, that doesn't happen. + */ +add_task(function* () { + yield BrowserTestUtils.withNewTab(kURL1, function* (browser) { + let tab = gBrowser.addTab(kURL2); + document.getElementById("cmd_printPreview").doCommand(); + gBrowser.selectedTab = tab; + yield BrowserTestUtils.waitForCondition(() => gInPrintPreviewMode, "should be in print preview mode"); + isnot(gBrowser.selectedTab, tab, "Selected tab should not be the tab we added"); + is(gBrowser.selectedTab, PrintPreviewListener._printPreviewTab, "Selected tab should be the print preview tab"); + gBrowser.selectedTab = tab; + isnot(gBrowser.selectedTab, tab, "Selected tab should still not be the tab we added"); + is(gBrowser.selectedTab, PrintPreviewListener._printPreviewTab, "Selected tab should still be the print preview tab"); + PrintUtils.exitPrintPreview(); + yield BrowserTestUtils.waitForCondition(() => !gInPrintPreviewMode, "should be in print preview mode"); + yield BrowserTestUtils.removeTab(tab); + }); +}); diff --git a/browser/components/extensions/schemas/windows.json b/browser/components/extensions/schemas/windows.json index dd333cedc4d2..f74cded680bc 100644 --- a/browser/components/extensions/schemas/windows.json +++ b/browser/components/extensions/schemas/windows.json @@ -273,10 +273,10 @@ "description": "A URL or array of URLs to open as tabs in the window. Fully-qualified URLs must include a scheme (i.e. 'http://www.google.com', not 'www.google.com'). Relative URLs will be relative to the current page within the extension. Defaults to the New Tab Page.", "optional": true, "choices": [ - { "type": "string" }, + { "type": "string", "format": "relativeUrl" }, { "type": "array", - "items": { "type": "string" } + "items": { "type": "string", "format": "relativeUrl" } } ] }, diff --git a/browser/components/extensions/test/browser/browser.ini b/browser/components/extensions/test/browser/browser.ini index c72456b46f23..0e4f8bdd9f4e 100644 --- a/browser/components/extensions/test/browser/browser.ini +++ b/browser/components/extensions/test/browser/browser.ini @@ -92,6 +92,7 @@ tags = webextensions [browser_ext_windows_create.js] tags = fullscreen [browser_ext_windows_create_tabId.js] +[browser_ext_windows_create_url.js] [browser_ext_windows_events.js] [browser_ext_windows_size.js] skip-if = os == 'mac' # Fails when windows are randomly opened in fullscreen mode diff --git a/browser/components/extensions/test/browser/browser_ext_windows_create_url.js b/browser/components/extensions/test/browser/browser_ext_windows_create_url.js new file mode 100644 index 000000000000..3f783840fd6d --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_windows_create_url.js @@ -0,0 +1,84 @@ +/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set sts=2 sw=2 et tw=80: */ +"use strict"; + +add_task(function* testWindowCreate() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + permissions: ["tabs"], + }, + + background() { + const EXTENSION_URL = browser.runtime.getURL("test.html"); + const REMOTE_URL = browser.runtime.getURL("test.html"); + + let windows = new class extends Map { // eslint-disable-line new-parens + get(id) { + if (!this.has(id)) { + let window = { + tabs: new Map(), + }; + window.promise = new Promise(resolve => { + window.resolvePromise = resolve; + }); + + this.set(id, window); + } + + return super.get(id); + } + }; + + browser.tabs.onUpdated.addListener((tabId, changed, tab) => { + if (changed.status == "complete" && tab.url !== "about:blank") { + let window = windows.get(tab.windowId); + window.tabs.set(tab.index, tab); + + if (window.tabs.size === window.expectedTabs) { + window.resolvePromise(window); + } + } + }); + + function create(options) { + return browser.windows.create(options).then(window => { + let win = windows.get(window.id); + + win.expectedTabs = Array.isArray(options.url) ? options.url.length : 1; + + return win.promise; + }); + } + + Promise.all([ + create({url: REMOTE_URL}), + create({url: "test.html"}), + create({url: EXTENSION_URL}), + create({url: [REMOTE_URL, "test.html", EXTENSION_URL]}), + ]).then(windows => { + browser.test.assertEq(REMOTE_URL, windows[0].tabs.get(0).url, "Single, absolute, remote URL"); + + browser.test.assertEq(REMOTE_URL, windows[1].tabs.get(0).url, "Single, relative URL"); + + browser.test.assertEq(REMOTE_URL, windows[2].tabs.get(0).url, "Single, absolute, extension URL"); + + browser.test.assertEq(REMOTE_URL, windows[3].tabs.get(0).url, "url[0]: Absolute, remote URL"); + browser.test.assertEq(EXTENSION_URL, windows[3].tabs.get(1).url, "url[1]: Relative URL"); + browser.test.assertEq(EXTENSION_URL, windows[3].tabs.get(2).url, "url[2]: Absolute, extension URL"); + }).then(() => { + browser.test.notifyPass("window-create-url"); + }).catch(e => { + browser.test.fail(`${e} :: ${e.stack}`); + browser.test.notifyFail("window-create-url"); + }); + }, + + files: { + "test.html": ``, + }, + }); + + yield extension.startup(); + yield extension.awaitFinish("window-create-url"); + yield extension.unload(); +}); diff --git a/browser/components/translation/cld2/cld-worker.js b/browser/components/translation/cld2/cld-worker.js index 0391c8945526..b06021bfea6d 100644 --- a/browser/components/translation/cld2/cld-worker.js +++ b/browser/components/translation/cld2/cld-worker.js @@ -1,114 +1,86 @@ -'use strict';var d;d||(d=eval("(function() { try { return Module || {} } catch(e) { return {} } })()"));var aa={},m;for(m in d)d.hasOwnProperty(m)&&(aa[m]=d[m]);var ba="object"===typeof window,ca="function"===typeof importScripts,ea="object"===typeof process&&"function"===typeof require&&!ba&&!ca,fa=!ba&&!ea&&!ca; -if(ea){d.print||(d.print=function(a){process.stdout.write(a+"\n")});d.printErr||(d.printErr=function(a){process.stderr.write(a+"\n")});var ga=require("fs"),ha=require("path");d.read=function(a,b){a=ha.normalize(a);var c=ga.readFileSync(a);c||a==ha.resolve(a)||(a=path.join(__dirname,"..","src",a),c=ga.readFileSync(a));c&&!b&&(c=c.toString());return c};d.readBinary=function(a){a=d.read(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a};d.load=function(a){ia(read(a))};d.thisProgram||(d.thisProgram= -1 0) var gc = undefined");else if(ba||ca)d.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},"undefined"!=typeof arguments&&(d.arguments=arguments),"undefined"!== -typeof console?(d.print||(d.print=function(a){console.log(a)}),d.printErr||(d.printErr=function(a){console.log(a)})):d.print||(d.print=function(){}),ca&&(d.load=importScripts),"undefined"===typeof d.setWindowTitle&&(d.setWindowTitle=function(a){document.title=a});else throw"Unknown runtime environment. Where are we?";function ia(a){eval.call(null,a)}!d.load&&d.read&&(d.load=function(a){ia(d.read(a))});d.print||(d.print=function(){});d.printErr||(d.printErr=d.print);d.arguments||(d.arguments=[]); -d.thisProgram||(d.thisProgram="./this.program");d.print=d.print;d.C=d.printErr;d.preRun=[];d.postRun=[];for(m in aa)aa.hasOwnProperty(m)&&(d[m]=aa[m]); -var u={ra:function(a){ja=a},la:function(){return ja},Q:function(){return t},I:function(a){t=a},Z:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?u.k:"i"===a[0]?(a=parseInt(a.substr(1)),assert(0===a%8),a/8):0}},ia:function(a){return Math.max(u.Z(a),u.k)},ua:16,Ma:function(a,b){"double"===b||"i64"===b?a&7&&(assert(4===(a&7)),a+=4):assert(0===(a&3));return a}, -Da:function(a,b,c){return c||"i64"!=a&&"double"!=a?a?Math.min(b||(a?u.ia(a):0),u.k):Math.min(b,8):8},n:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),d["dynCall_"+a].apply(null,c)):d["dynCall_"+a].call(null,b)},F:[],da:function(a){for(var b=0;b=B&&!ka()?(A=b,0):b},K:function(a, -b){return Math.ceil(a/(b?b:16))*(b?b:16)},Ja:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},T:8,k:4,va:0};d.Runtime=u;u.addFunction=u.da;u.removeFunction=u.qa;var C=!1,la,na,ja;function assert(a,b){a||D("Assertion failed: "+b)}function oa(a){var b=d["_"+a];if(!b)try{b=eval("_"+a)}catch(c){}assert(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}var pa,qa; -(function(){function a(a){a=a.toString().match(e).slice(1);return{arguments:a[0],body:a[1],returnValue:a[2]}}var b={stackSave:function(){u.Q()},stackRestore:function(){u.I()},arrayToC:function(a){var b=u.H(a.length);ra(a,b);return b},stringToC:function(a){var b=0;null!==a&&void 0!==a&&0!==a&&(b=u.H((a.length<<2)+1),sa(a,b));return b}},c={string:b.stringToC,array:b.arrayToC};qa=function(a,b,e,f,h){a=oa(a);var r=[],z=0;if(f)for(var E=0;E>0]=b;break;case "i8":G[a>>0]=b;break;case "i16":H[a>>1]=b;break;case "i32":I[a>>2]=b;break;case "i64":na=[b>>>0,(la=b,1<=+ua(la)?0>>0:~~+xa((la-+(~~la>>>0))/4294967296)>>>0:0)];I[a>>2]=na[0];I[a+4>>2]=na[1];break;case "float":ya[a>>2]=b;break;case "double":za[a>>3]=b;break;default:D("invalid type for setValue: "+c)}}d.setValue=ta; -function Aa(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return G[a>>0];case "i8":return G[a>>0];case "i16":return H[a>>1];case "i32":return I[a>>2];case "i64":return I[a>>2];case "float":return ya[a>>2];case "double":return za[a>>3];default:D("invalid type for setValue: "+b)}return null}d.getValue=Aa;d.ALLOC_NORMAL=0;d.ALLOC_STACK=1;d.ALLOC_STATIC=2;d.ALLOC_DYNAMIC=3;d.ALLOC_NONE=4; -function Ba(a,b,c,e){var f,h;"number"===typeof a?(f=!0,h=a):(f=!1,h=a.length);var k="string"===typeof b?b:null;c=4==c?e:["function"===typeof J?J:u.R,u.H,u.R,u.p][void 0===c?2:c](Math.max(h,k?1:b.length));if(f){e=c;assert(0==(c&3));for(a=c+(h&-4);e>2]=0;for(a=c+h;e>0]=0;return c}if("i8"===k)return a.subarray||a.slice?K.set(a,c):K.set(new Uint8Array(a),c),c;e=0;for(var l,p;e>0];c|=e;if(0==e&&!b)break;f++;if(b&&f==b)break}b||(b=f);e="";if(128>c){for(;0>0];if(!c)return b;b+=String.fromCharCode(c)}};d.stringToAscii=function(a,b){return Ea(a,b,!1)}; -function Fa(a,b){for(var c,e,f,h,k,l,p="";;){c=a[b++];if(!c)return p;c&128?(e=a[b++]&63,192==(c&224)?p+=String.fromCharCode((c&31)<<6|e):(f=a[b++]&63,224==(c&240)?c=(c&15)<<12|e<<6|f:(h=a[b++]&63,240==(c&248)?c=(c&7)<<18|e<<12|f<<6|h:(k=a[b++]&63,248==(c&252)?c=(c&3)<<24|e<<18|f<<12|h<<6|k:(l=a[b++]&63,c=(c&1)<<30|e<<24|f<<18|h<<12|k<<6|l))),65536>c?p+=String.fromCharCode(c):(c-=65536,p+=String.fromCharCode(55296|c>>10,56320|c&1023)))):p+=String.fromCharCode(c)}}d.UTF8ArrayToString=Fa; -d.UTF8ToString=function(a){return Fa(K,a)}; -function Ga(a,b,c,e){if(!(0=k&&(k=65536+((k&1023)<<10)|a.charCodeAt(++h)&1023);if(127>=k){if(c>=e)break;b[c++]=k}else{if(2047>=k){if(c+1>=e)break;b[c++]=192|k>>6}else{if(65535>=k){if(c+2>=e)break;b[c++]=224|k>>12}else{if(2097151>=k){if(c+3>=e)break;b[c++]=240|k>>18}else{if(67108863>=k){if(c+4>=e)break;b[c++]=248|k>>24}else{if(c+5>=e)break;b[c++]=252|k>>30;b[c++]=128|k>>24&63}b[c++]=128|k>>18&63}b[c++]=128| -k>>12&63}b[c++]=128|k>>6&63}b[c++]=128|k&63}}b[c]=0;return c-f}d.stringToUTF8Array=Ga;d.stringToUTF8=function(a,b,c){return Ga(a,K,b,c)};function Ha(a){for(var b=0,c=0;c=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++c)&1023);127>=e?++b:b=2047>=e?b+2:65535>=e?b+3:2097151>=e?b+4:67108863>=e?b+5:b+6}return b}d.lengthBytesUTF8=Ha;d.UTF16ToString=function(a){for(var b=0,c="";;){var e=H[a+2*b>>1];if(0==e)return c;++b;c+=String.fromCharCode(e)}}; -d.stringToUTF16=function(a,b,c){void 0===c&&(c=2147483647);if(2>c)return 0;c-=2;var e=b;c=c<2*a.length?c/2:a.length;for(var f=0;f>1]=a.charCodeAt(f),b+=2;H[b>>1]=0;return b-e};d.lengthBytesUTF16=function(a){return 2*a.length};d.UTF32ToString=function(a){for(var b=0,c="";;){var e=I[a+4*b>>2];if(0==e)return c;++b;65536<=e?(e=e-65536,c+=String.fromCharCode(55296|e>>10,56320|e&1023)):c+=String.fromCharCode(e)}}; -d.stringToUTF32=function(a,b,c){void 0===c&&(c=2147483647);if(4>c)return 0;var e=b;c=e+c-4;for(var f=0;f=h)var k=a.charCodeAt(++f),h=65536+((h&1023)<<10)|k&1023;I[b>>2]=h;b+=4;if(b+4>c)break}I[b>>2]=0;return b-e};d.lengthBytesUTF32=function(a){for(var b=0,c=0;c=e&&++c;b+=4}return b}; -function Ia(a){function b(c,e,f){e=e||Infinity;var h="",k=[],y;if("N"===a[l]){l++;"K"===a[l]&&l++;for(y=[];"E"!==a[l];)if("S"===a[l]){l++;var x=a.indexOf("_",l);y.push(q[a.substring(l,x)||0]||"?");l=x+1}else if("C"===a[l])y.push(y[y.length-1]),l+=2;else{var x=parseInt(a.substr(l)),r=x.toString().length;if(!x||!r){l--;break}var Ab=a.substr(l+r,x);y.push(Ab);q.push(Ab);l+=r+x}l++;y=y.join("::");e--;if(0===e)return c?[y]:y}else if(("K"===a[l]||v&&"L"===a[l])&&l++,x=parseInt(a.substr(l)))r=x.toString().length, -y=a.substr(l+r,x),l+=r+x;v=!1;"I"===a[l]?(l++,x=b(!0),r=b(!0,1,!0),h+=r[0]+" "+y+"<"+x.join(", ")+">"):h=y;a:for(;l=a)return!1;for(;B<=A;)if(B=a)return!1;a=d.reallocBuffer(B);if(!a)return!1;d.buffer=buffer=a;Pa();return!0}var Va; -try{Va=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),Va(new ArrayBuffer(4))}catch(Wa){Va=function(a){return a.byteLength}}for(var Xa=d.TOTAL_STACK||8192,B=d.TOTAL_MEMORY||2097152,M=65536;MM?2*M:M+16777216;M=Math.max(M,16777216);M!==B&&(B=M);assert("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"JS engine does not provide full typed array support"); -d.buffer?(buffer=d.buffer,assert(buffer.byteLength===B,"provided buffer should be "+B+" bytes, but it is "+buffer.byteLength)):buffer=new ArrayBuffer(B);Pa();I[0]=255;assert(255===K[0]&&0===K[3],"Typed arrays 2 must be run on a little-endian system");d.HEAP=void 0;d.buffer=buffer;d.HEAP8=G;d.HEAP16=H;d.HEAP32=I;d.HEAPU8=K;d.HEAPU16=Na;d.HEAPU32=Oa;d.HEAPF32=ya;d.HEAPF64=za; -function Ya(a){for(;0>0]=a[c],c+=1}d.writeStringToMemory=sa;function ra(a,b){for(var c=0;c>0]=a[c]}d.writeArrayToMemory=ra; -function Ea(a,b,c){for(var e=0;e>0]=a.charCodeAt(e);c||(G[b>>0]=0)}d.writeAsciiToMemory=Ea;Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(a,b){var c=a&65535,e=b&65535;return c*e+((a>>>16)*e+c*(b>>>16)<<16)|0});Math.Ha=Math.imul;Math.clz32||(Math.clz32=function(a){a=a>>>0;for(var b=0;32>b;b++)if(a&1<<31-b)return b;return 32});Math.ya=Math.clz32;var ua=Math.abs,xa=Math.ceil,wa=Math.floor,va=Math.min,O=0,gb=null,hb=null; -function ib(){O++;d.monitorRunDependencies&&d.monitorRunDependencies(O)}d.addRunDependency=ib;function jb(){O--;d.monitorRunDependencies&&d.monitorRunDependencies(O);if(0==O&&(null!==gb&&(clearInterval(gb),gb=null),hb)){var a=hb;hb=null;a()}}d.removeRunDependency=jb;d.preloadedImages={};d.preloadedAudios={};var P=null,kb=[function(a,b){throw"Array index "+a+" out of bounds: [0,"+b+")";}],Qa=8,w=Qa+1097840;$a.push();var P="cld-worker.js.mem",lb=u.K(Ba(12,"i8",2),8);assert(0==lb%8);d._i64Subtract=mb; -function nb(){return!!nb.g}var ob=0,pb=[],Q={};function qb(a){if(!a||Q[a])return a;for(var b in Q)if(Q[b].U===a)return b;return a} -function rb(){var a=ob;if(!a)return(R.setTempRet0(0),0)|0;var b=Q[a],c=b.type;if(!c)return(R.setTempRet0(0),a)|0;var e=Array.prototype.slice.call(arguments);d.___cxa_is_pointer_type(c);rb.buffer||(rb.buffer=J(4));I[rb.buffer>>2]=a;for(var a=rb.buffer,f=0;f>2],b.U=a,(R.setTempRet0(e[f]),a)|0;a=I[a>>2];return(R.setTempRet0(c),a)|0}d._memset=sb;d._bitshift64Shl=tb;function ub(a,b){ub.g||(ub.g={});a in ub.g||(u.n("v",b),ub.g[a]=1)} -var vb={};function wb(a){d.___errno_location&&(I[d.___errno_location()>>2]=a);return a}var xb=1; -function yb(a,b){zb=a;Bb=b;if(!Cb)return 1;if(0==a)S=function(){setTimeout(Db,b)},Eb="timeout";else if(1==a)S=function(){Fb(Db)},Eb="rAF";else if(2==a){if(!window.setImmediate){var c=[];window.addEventListener("message",function(a){a.source===window&&"__emcc"===a.data&&(a.stopPropagation(),c.shift()())},!0);window.setImmediate=function(a){c.push(a);window.postMessage("__emcc","*")}}S=function(){window.setImmediate(Db)};Eb="immediate"}return 0} -function Gb(a,b,c,e,f){d.noExitRuntime=!0;assert(!Cb,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Cb=a;Hb=e;var h=Ib;Db=function(){if(!C)if(0>k-6&63,k=k-6,c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[r];2==k?(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h&3)<<4],c+="=="):4==k&&(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(h&15)<<2],c+="=");z.src="data:audio/x-"+b.substr(-3)+";base64,"+c;l(z)}};z.src=v;Yb(function(){l(z)})}else return p()}});var c=d.canvas;c&&(c.O=c.requestPointerLock||c.mozRequestPointerLock|| -c.webkitRequestPointerLock||c.msRequestPointerLock||function(){},c.X=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},c.X=c.X.bind(document),document.addEventListener("pointerlockchange",a,!1),document.addEventListener("mozpointerlockchange",a,!1),document.addEventListener("webkitpointerlockchange",a,!1),document.addEventListener("mspointerlockchange",a,!1),d.elementPointerLock&&c.addEventListener("click",function(a){!Qb&& -c.O&&(c.O(),a.preventDefault())},!1))}}function Zb(a,b,c,e){if(b&&d.L&&a==d.canvas)return d.L;var f,h;if(b){h={antialias:!1,alpha:!1};if(e)for(var k in e)h[k]=e[k];if(h=GL.createContext(a,h))f=GL.getContext(h).ta;a.style.backgroundColor="black"}else f=a.getContext("2d");if(!f)return null;c&&(b||assert("undefined"===typeof GLctx,"cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),d.L=f,b&&GL.Ka(h),d.Na=b,Rb.forEach(function(a){a()}),Sb());return f} -var $b=!1,ac=void 0,bc=void 0; -function cc(a,b,c){function e(){Pb=!1;var a=f.parentNode;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement||document.msFullScreenElement||document.msFullscreenElement||document.webkitCurrentFullScreenElement)===a?(f.V=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen||document.msExitFullscreen||document.exitFullscreen||function(){}, -f.V=f.V.bind(document),ac&&f.O(),Pb=!0,bc&&dc()):(a.parentNode.insertBefore(f,a),a.parentNode.removeChild(a),bc&&ec());if(d.onFullScreen)d.onFullScreen(Pb);fc(f)}ac=a;bc=b;gc=c;"undefined"===typeof ac&&(ac=!0);"undefined"===typeof bc&&(bc=!1);"undefined"===typeof gc&&(gc=null);var f=d.canvas;$b||($b=!0,document.addEventListener("fullscreenchange",e,!1),document.addEventListener("mozfullscreenchange",e,!1),document.addEventListener("webkitfullscreenchange",e,!1),document.addEventListener("MSFullscreenChange", -e,!1));var h=document.createElement("div");f.parentNode.insertBefore(h,f);h.appendChild(f);h.g=h.requestFullScreen||h.mozRequestFullScreen||h.msRequestFullscreen||(h.webkitRequestFullScreen?function(){h.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null);c?h.g({Oa:c}):h.g()}var hc=0;function ic(a){var b=Date.now();if(0===hc)hc=b+1E3/60;else for(;b+2>=hc;)hc+=1E3/60;b=Math.max(hc-b,0);setTimeout(a,b)} -function Fb(a){"undefined"===typeof window?ic(a):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||ic),window.requestAnimationFrame(a))}function Yb(a){d.noExitRuntime=!0;setTimeout(function(){C||a()},1E4)} -function Xb(a){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[a.substr(a.lastIndexOf(".")+1)]}function jc(a,b,c){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200==e.status||0==e.status&&e.response?b(e.response):c()};e.onerror=c;e.send(null)} -function kc(a){var b=P,c=lc;jc(b,function(a){assert(a,'Loading data file "'+b+'" failed (no arrayBuffer).');c(new Uint8Array(a));jb()},function(){if(a)a();else throw'Loading data file "'+b+'" failed.';});ib()}var mc=[];function nc(){var a=d.canvas;mc.forEach(function(b){b(a.width,a.height)})}function dc(){if("undefined"!=typeof SDL){var a=Oa[SDL.screen+0*u.k>>2];I[SDL.screen+0*u.k>>2]=a|8388608}nc()} -function ec(){if("undefined"!=typeof SDL){var a=Oa[SDL.screen+0*u.k>>2];I[SDL.screen+0*u.k>>2]=a&-8388609}nc()} -function fc(a,b,c){b&&c?(a.sa=b,a.oa=c):(b=a.sa,c=a.oa);var e=b,f=c;d.forcedAspectRatio&&0>2]}var uc={};function L(a){L.g||(A=Ma(A),L.g=!0,assert(u.p),L.u=u.p,u.p=function(){D("cannot dynamically allocate, sbrk now has control")});var b=A;return 0==a||L.u(a)?b:4294967295}d._memmove=vc; -function wc(a,b){sc=b;try{tc();var c=tc(),e=tc(),f=0;wc.buffer||(wc.buffer=[]);for(var h=wc.buffer,k=0;k>2],p=I[c+(8*k+4)>>2],q=0;q 0) var gc = undefined");else if(ba||k)c.read=function(a){var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText},c.readAsync=function(a,b,d){var e=new XMLHttpRequest;e.open("GET",a,!0);e.responseType="arraybuffer";e.onload=function(){200== +e.status||0==e.status&&e.response?b(e.response):d()};e.onerror=d;e.send(null)},"undefined"!=typeof arguments&&(c.arguments=arguments),"undefined"!==typeof console?(c.print||(c.print=function(a){console.log(a)}),c.printErr||(c.printErr=function(a){console.warn(a)})):c.print||(c.print=function(){}),k&&(c.load=importScripts),"undefined"===typeof c.setWindowTitle&&(c.setWindowTitle=function(a){document.title=a});else throw"Unknown runtime environment. Where are we?";function fa(a){eval.call(null,a)} +!c.load&&c.read&&(c.load=function(a){fa(c.read(a))});c.print||(c.print=function(){});c.printErr||(c.printErr=c.print);c.arguments||(c.arguments=[]);c.thisProgram||(c.thisProgram="./this.program");c.print=c.print;c.u=c.printErr;c.preRun=[];c.postRun=[];for(g in aa)aa.hasOwnProperty(g)&&(c[g]=aa[g]); +var aa=void 0,t={V:function(a){tempRet0=a},R:function(){return tempRet0},w:function(){return p},o:function(a){p=a},H:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===a[a.length-1]?t.q:"i"===a[0]?(a=parseInt(a.substr(1)),assert(0===a%8),a/8):0}},O:function(a){return Math.max(t.H(a),t.q)},W:16,la:function(a,b){"double"===b||"i64"===b?a&7&&(assert(4===(a&7)),a+=4):assert(0=== +(a&3));return a},ea:function(a,b,d){return d||"i64"!=a&&"double"!=a?a?Math.min(b||(a?t.O(a):0),t.q):Math.min(b,8):8},h:function(a,b,d){return d&&d.length?(d.splice||(d=Array.prototype.slice.call(d)),d.splice(0,0,b),c["dynCall_"+a].apply(null,d)):c["dynCall_"+a].call(null,b)},l:[],K:function(a){for(var b=0;b=w&&!ga()?(v=b,0):b},F:function(a, +b){return Math.ceil(a/(b?b:16))*(b?b:16)},ka:function(a,b,d){return d?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},C:8,q:4,X:0};c.Runtime=t;t.addFunction=t.K;t.removeFunction=t.U;var ia=!1;function assert(a,b){a||y("Assertion failed: "+b)}function ja(a){var b=c["_"+a];if(!b)try{b=eval("_"+a)}catch(d){}assert(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}var ka,la; +(function(){function a(a){a=a.toString().match(f).slice(1);return{arguments:a[0],body:a[1],returnValue:a[2]}}function b(){if(!l){l={};for(var b in d)d.hasOwnProperty(b)&&(l[b]=a(d[b]))}}var d={stackSave:function(){t.w()},stackRestore:function(){t.o()},arrayToC:function(a){var b=t.n(a.length);ma(a,b);return b},stringToC:function(a){var b=0;null!==a&&void 0!==a&&0!==a&&(b=t.n((a.length<<2)+1),na(a,b));return b}},e={string:d.stringToC,array:d.arrayToC};la=function(a,b,d,f,l){a=ja(a);var O=[],P=0;if(f)for(var x= +0;x>0]=b;break;case "i8":B[a>>0]=b;break;case "i16":pa[a>>1]=b;break;case "i32":C[a>>2]=b;break;case "i64":tempI64=[b>>>0,(tempDouble=b,1<=+qa(tempDouble)?0>>0:~~+ta((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)];C[a>>2]=tempI64[0];C[a+4>>2]=tempI64[1];break;case "float":ua[a>>2]=b;break;case "double":va[a>>3]=b;break;default:y("invalid type for setValue: "+ +d)}}c.setValue=oa;function wa(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return B[a>>0];case "i8":return B[a>>0];case "i16":return pa[a>>1];case "i32":return C[a>>2];case "i64":return C[a>>2];case "float":return ua[a>>2];case "double":return va[a>>3];default:y("invalid type for setValue: "+b)}return null}c.getValue=wa;c.ALLOC_NORMAL=0;c.ALLOC_STACK=1;c.ALLOC_STATIC=2;c.ALLOC_DYNAMIC=3;c.ALLOC_NONE=4; +function xa(a,b,d,e){var f,l;"number"===typeof a?(f=!0,l=a):(f=!1,l=a.length);var h="string"===typeof b?b:null;d=4==d?e:["function"===typeof D?D:t.A,t.n,t.A,t.d][void 0===d?2:d](Math.max(l,h?1:b.length));if(f){e=d;assert(0==(d&3));for(a=d+(l&-4);e>2]=0;for(a=d+l;e>0]=0;return d}if("i8"===h)return a.subarray||a.slice?E.set(a,d):E.set(new Uint8Array(a),d),d;e=0;for(var q,r;e>0];d|=e;if(0==e&&!b)break;f++;if(b&&f==b)break}b||(b=f);e="";if(128>d){for(;0>0];if(!d)return b;b+=String.fromCharCode(d)}};c.stringToAscii=function(a,b){return Aa(a,b,!1)}; +function Ba(a,b){for(var d,e,f,l,h,q,r="";;){d=a[b++];if(!d)return r;d&128?(e=a[b++]&63,192==(d&224)?r+=String.fromCharCode((d&31)<<6|e):(f=a[b++]&63,224==(d&240)?d=(d&15)<<12|e<<6|f:(l=a[b++]&63,240==(d&248)?d=(d&7)<<18|e<<12|f<<6|l:(h=a[b++]&63,248==(d&252)?d=(d&3)<<24|e<<18|f<<12|l<<6|h:(q=a[b++]&63,d=(d&1)<<30|e<<24|f<<18|l<<12|h<<6|q))),65536>d?r+=String.fromCharCode(d):(d-=65536,r+=String.fromCharCode(55296|d>>10,56320|d&1023)))):r+=String.fromCharCode(d)}}c.UTF8ArrayToString=Ba; +c.UTF8ToString=function(a){return Ba(E,a)}; +function Ca(a,b,d,e){if(!(0=h&&(h=65536+((h&1023)<<10)|a.charCodeAt(++l)&1023);if(127>=h){if(d>=e)break;b[d++]=h}else{if(2047>=h){if(d+1>=e)break;b[d++]=192|h>>6}else{if(65535>=h){if(d+2>=e)break;b[d++]=224|h>>12}else{if(2097151>=h){if(d+3>=e)break;b[d++]=240|h>>18}else{if(67108863>=h){if(d+4>=e)break;b[d++]=248|h>>24}else{if(d+5>=e)break;b[d++]=252|h>>30;b[d++]=128|h>>24&63}b[d++]=128|h>>18&63}b[d++]=128| +h>>12&63}b[d++]=128|h>>6&63}b[d++]=128|h&63}}b[d]=0;return d-f}c.stringToUTF8Array=Ca;c.stringToUTF8=function(a,b,d){return Ca(a,E,b,d)};function Da(a){for(var b=0,d=0;d=e&&(e=65536+((e&1023)<<10)|a.charCodeAt(++d)&1023);127>=e?++b:b=2047>=e?b+2:65535>=e?b+3:2097151>=e?b+4:67108863>=e?b+5:b+6}return b}c.lengthBytesUTF8=Da; +function Ea(){return Fa().replace(/__Z[\w\d_]+/g,function(a){var b;a:{if(c.___cxa_demangle)try{var d=D(a.length);na(a.substr(1),d);var e=D(4),f=c.___cxa_demangle(d,0,0,e);if(0===wa(e,"i32")&&f){b=z(f);break a}}catch(l){b=a;break a}finally{d&&Ga(d),e&&Ga(e),f&&Ga(f)}t.k("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");b=a}return a===b?a:a+" ["+b+"]"})} +function Fa(){var a=Error();if(!a.stack){try{throw Error(0);}catch(b){a=b}if(!a.stack)return"(no stack trace available)"}return a.stack.toString()}c.stackTrace=function(){return Ea()};function Ha(a){0=a)return!1;for(;w<=v;)if(w=a)return!1;a=c.reallocBuffer(w);if(!a)return!1;c.buffer=buffer=a;Ka();return!0}var Pa; +try{Pa=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),Pa(new ArrayBuffer(4))}catch(Qa){Pa=function(a){return a.byteLength}}for(var Ra=c.TOTAL_STACK||8192,w=c.TOTAL_MEMORY||2097152,G=65536;GG?2*G:G+16777216;G=Math.max(G,16777216);G!==w&&(w=G);c.buffer?buffer=c.buffer:buffer=new ArrayBuffer(w);Ka();C[0]=255;if(255!==E[0]||0!==E[3])throw"Typed arrays 2 must be run on a little-endian system";c.HEAP=void 0;c.buffer=buffer; +c.HEAP8=B;c.HEAP16=pa;c.HEAP32=C;c.HEAPU8=E;c.HEAPU16=Ia;c.HEAPU32=Ja;c.HEAPF32=ua;c.HEAPF64=va;function H(a){for(;0>0]=a[d],d+=1}c.writeStringToMemory=na;function ma(a,b){for(var d=0;d>0]=a[d]}c.writeArrayToMemory=ma; +function Aa(a,b,d){for(var e=0;e>0]=a.charCodeAt(e);d||(B[b>>0]=0)}c.writeAsciiToMemory=Aa;Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(a,b){var d=a&65535,e=b&65535;return d*e+((a>>>16)*e+d*(b>>>16)<<16)|0});Math.ia=Math.imul;Math.clz32||(Math.clz32=function(a){a=a>>>0;for(var b=0;32>b;b++)if(a&1<<31-b)return b;return 32});Math.$=Math.clz32;var qa=Math.abs,ta=Math.ceil,sa=Math.floor,ra=Math.min,J=0,$a=null,ab=null; +function bb(){J++;c.monitorRunDependencies&&c.monitorRunDependencies(J)}c.addRunDependency=bb;function cb(){J--;c.monitorRunDependencies&&c.monitorRunDependencies(J);if(0==J&&(null!==$a&&(clearInterval($a),$a=null),ab)){var a=ab;ab=null;a()}}c.removeRunDependency=cb;c.preloadedImages={};c.preloadedAudios={};var K=null,db=[function(a,b){throw"Array index "+a+" out of bounds: [0,"+b+")";}],La=8,u=La+1097872;Ta.push();var K="cld-worker.js.mem",eb=u,u=u+16;c._i64Add=fb;c._i64Subtract=gb; +function hb(a){c.___errno_location&&(C[c.___errno_location()>>2]=a);return a}function ib(){return!!ib.b}var jb=0,kb=[],L={};function lb(a){if(!a||L[a])return a;for(var b in L)if(L[b].D===a)return b;return a} +function mb(){var a=jb;if(!a)return(M.setTempRet0(0),0)|0;var b=L[a],d=b.type;if(!d)return(M.setTempRet0(0),a)|0;var e=Array.prototype.slice.call(arguments);c.___cxa_is_pointer_type(d);mb.buffer||(mb.buffer=D(4));C[mb.buffer>>2]=a;for(var a=mb.buffer,f=0;f>2],b.D=a,(M.setTempRet0(e[f]),a)|0;a=C[a>>2];return(M.setTempRet0(d),a)|0}c._memset=nb;function ob(a,b){I.push(function(){t.h("vi",a,[b])});ob.level=I.length}c._bitshift64Lshr=pb; +c._bitshift64Shl=qb;function rb(a,b){rb.b||(rb.b={});a in rb.b||(t.h("v",b),rb.b[a]=1)}c._memcpy=sb;var tb=0;function N(){tb+=4;return C[tb-4>>2]}var ub={},vb={};function F(a){F.b||(v=Ha(v),F.b=!0,assert(t.d),F.f=t.d,t.d=function(){y("cannot dynamically allocate, sbrk now has control")});var b=v;return 0==a||F.f(a)?b:4294967295}c._memmove=wb;var xb=1; +function Q(a,b){tb=b;try{var d=N(),e=N(),f=N(),l=0;Q.buffer||(Q.b=[null,[],[]],Q.g=function(a,b){var d=Q.b[a];assert(d);0===b||10===b?((1===a?c.print:c.printErr)(Ba(d,0)),d.length=0):d.push(b)});for(var h=0;h>2],r=C[e+(8*h+4)>>2],A=0;A>2]=xb;vb[xb]=0;xb++;return 0},_emscripten_set_main_loop:Gb,_emscripten_asm_const_iii:function(a,b,c){return kb[a](b,c)},_pthread_setspecific:function(a,b){if(!(a in vb))return 22;vb[a]=b;return 0},___cxa_throw:function(a,b,c){Q[a]={e:a,U:a,type:b,Aa:c,aa:0};ob=a;"uncaught_exception"in nb?nb.g++:nb.g=1;throw a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; -},___syscall6:function(a,b){sc=b;try{var c=uc.ka();FS.close(c);return 0}catch(e){return"undefined"!==typeof FS&&e instanceof FS.S||D(e),-e.W}},_pthread_cleanup_push:qc,_time:function(a){var b=Date.now()/1E3|0;a&&(I[a>>2]=b);return b},___syscall140:function(a,b){sc=b;try{var c=uc.ka(),e=tc(),f=tc(),h=tc(),k=tc();assert(0===e);FS.Ia(c,f,k);I[h>>2]=c.position;c.na&&0===f&&0===k&&(c.na=null);return 0}catch(l){return"undefined"!==typeof FS&&l instanceof FS.S||D(l),-l.W}},___syscall146:wc,STACKTOP:t,STACK_MAX:Sa, -tempDoublePtr:lb,ABORT:C,cttz_i8:xc};// EMSCRIPTEN_START_ASM -var R=(function(global,env,buffer) { -"almost asm";var a=global.Int8Array;var b=global.Int16Array;var c=global.Int32Array;var d=global.Uint8Array;var e=global.Uint16Array;var f=global.Uint32Array;var g=global.Float32Array;var h=global.Float64Array;var i=new a(buffer);var j=new b(buffer);var k=new c(buffer);var l=new d(buffer);var m=new e(buffer);var n=new f(buffer);var o=new g(buffer);var p=new h(buffer);var q=global.byteLength;var r=env.STACKTOP|0;var s=env.STACK_MAX|0;var t=env.tempDoublePtr|0;var u=env.ABORT|0;var v=env.cttz_i8|0;var w=0;var x=0;var y=0;var z=0;var A=global.NaN,B=global.Infinity;var C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0.0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=0;var S=0;var T=0;var U=0;var V=global.Math.floor;var W=global.Math.abs;var X=global.Math.sqrt;var Y=global.Math.pow;var Z=global.Math.cos;var _=global.Math.sin;var $=global.Math.tan;var aa=global.Math.acos;var ba=global.Math.asin;var ca=global.Math.atan;var da=global.Math.atan2;var ea=global.Math.exp;var fa=global.Math.log;var ga=global.Math.ceil;var ha=global.Math.imul;var ia=global.Math.min;var ja=global.Math.clz32;var ka=env.abort;var la=env.assert;var ma=env.invoke_iiii;var na=env.invoke_viiiii;var oa=env.invoke_vi;var pa=env.invoke_ii;var qa=env.invoke_v;var ra=env.invoke_viiiiii;var sa=env.invoke_viiii;var ta=env._pthread_cleanup_pop;var ua=env._abort;var va=env.___setErrNo;var wa=env.___gxx_personality_v0;var xa=env.___assert_fail;var ya=env.___cxa_allocate_exception;var za=env.__ZSt18uncaught_exceptionv;var Aa=env._emscripten_set_main_loop_timing;var Ba=env._sbrk;var Ca=env.___cxa_begin_catch;var Da=env._emscripten_memcpy_big;var Ea=env.___resumeException;var Fa=env.___cxa_find_matching_catch;var Ga=env._sysconf;var Ha=env._pthread_getspecific;var Ia=env._pthread_self;var Ja=env._pthread_once;var Ka=env._pthread_key_create;var La=env._emscripten_set_main_loop;var Ma=env._emscripten_asm_const_iii;var Na=env._pthread_setspecific;var Oa=env.___cxa_throw;var Pa=env.___syscall6;var Qa=env._pthread_cleanup_push;var Ra=env._time;var Sa=env.___syscall140;var Ta=env.___syscall146;var Ua=0.0;function Va(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} +case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"===typeof navigator?navigator.hardwareConcurrency||1:1}hb(22);return-1}, +_pthread_getspecific:function(a){return vb[a]||0},_pthread_self:function(){return 0},_pthread_once:rb,_pthread_key_create:function(a){if(0==a)return 22;C[a>>2]=xb;vb[xb]=0;xb++;return 0},_emscripten_asm_const_iii:function(a,b,d){return db[a](b,d)},_pthread_setspecific:function(a,b){if(!(a in vb))return 22;vb[a]=b;return 0},___cxa_throw:function(a,b,d){L[a]={a:a,D:a,type:b,aa:d,I:0};jb=a;"uncaught_exception"in ib?ib.b++:ib.b=1;throw a+" - Exception catching is disabled, this exception cannot be caught. Compile with -s DISABLE_EXCEPTION_CATCHING=0 or DISABLE_EXCEPTION_CATCHING=2 to catch."; +},_abort:function(){c.abort()},_pthread_cleanup_push:ob,_time:function(a){var b=Date.now()/1E3|0;a&&(C[a>>2]=b);return b},___syscall140:function(a,b){tb=b;try{var d=ub.Q(),e=N(),f=N(),l=N(),h=N();assert(0===e);FS.ja(d,f,h);C[l>>2]=d.position;d.T&&0===f&&0===h&&(d.T=null);return 0}catch(q){return"undefined"!==typeof FS&&q instanceof FS.B||y(q),-q.G}},___syscall146:Q,STACKTOP:p,STACK_MAX:Na,tempDoublePtr:eb,ABORT:ia,cttz_i8:yb};// EMSCRIPTEN_START_ASM + +var M=(function(global,env,buffer) { +"almost asm";var a=global.Int8Array;var b=global.Int16Array;var c=global.Int32Array;var d=global.Uint8Array;var e=global.Uint16Array;var f=global.Uint32Array;var g=global.Float32Array;var h=global.Float64Array;var i=new a(buffer);var j=new b(buffer);var k=new c(buffer);var l=new d(buffer);var m=new e(buffer);var n=new f(buffer);var o=new g(buffer);var p=new h(buffer);var q=global.byteLength;var r=env.STACKTOP|0;var s=env.STACK_MAX|0;var t=env.tempDoublePtr|0;var u=env.ABORT|0;var v=env.cttz_i8|0;var w=0;var x=0;var y=0;var z=0;var A=global.NaN,B=global.Infinity;var C=0,D=0,E=0,F=0,G=0.0,H=0,I=0,J=0,K=0.0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=0;var S=0;var T=0;var U=0;var V=global.Math.floor;var W=global.Math.abs;var X=global.Math.sqrt;var Y=global.Math.pow;var Z=global.Math.cos;var _=global.Math.sin;var $=global.Math.tan;var aa=global.Math.acos;var ba=global.Math.asin;var ca=global.Math.atan;var da=global.Math.atan2;var ea=global.Math.exp;var fa=global.Math.log;var ga=global.Math.ceil;var ha=global.Math.imul;var ia=global.Math.min;var ja=global.Math.clz32;var ka=env.abort;var la=env.assert;var ma=env.invoke_iiii;var na=env.invoke_viiiii;var oa=env.invoke_vi;var pa=env.invoke_ii;var qa=env.invoke_v;var ra=env.invoke_viiiiii;var sa=env.invoke_viiii;var ta=env._pthread_cleanup_pop;var ua=env.___syscall6;var va=env.___gxx_personality_v0;var wa=env.___assert_fail;var xa=env.___cxa_allocate_exception;var ya=env.___cxa_find_matching_catch;var za=env.___setErrNo;var Aa=env._sbrk;var Ba=env.___cxa_begin_catch;var Ca=env._emscripten_memcpy_big;var Da=env.___resumeException;var Ea=env.__ZSt18uncaught_exceptionv;var Fa=env._sysconf;var Ga=env._pthread_getspecific;var Ha=env._pthread_self;var Ia=env._pthread_once;var Ja=env._pthread_key_create;var Ka=env._emscripten_asm_const_iii;var La=env._pthread_setspecific;var Ma=env.___cxa_throw;var Na=env._abort;var Oa=env._pthread_cleanup_push;var Pa=env._time;var Qa=env.___syscall140;var Ra=env.___syscall146;var Sa=0.0;function Ta(newBuffer){if(q(newBuffer)&16777215||q(newBuffer)<=16777215||q(newBuffer)>2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} // EMSCRIPTEN_START_FUNCS -function bb(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function cb(){return r|0}function db(a){a=a|0;r=a}function eb(a,b){a=a|0;b=b|0;r=a;s=b}function fb(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function gb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function hb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function ib(a){a=a|0;L=a}function jb(){return L|0}function kb(a,b){a=a|0;b=b|0;var c=0,d=0;d=980497+(a<<3&2040)|0;c=a>>>8;if(c&255|0)pd(b,c&255,l[d+5>>0]|0);c=a>>>16;if(c&255|0)pd(b,c&255,l[d+6>>0]|0);c=a>>>24;if(c|0)pd(b,c&255,l[d+7>>0]|0);return}function lb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,m=0,n=0,o=0;o=r;r=r+16|0;n=o+4|0;m=o;f=a+b|0;g=a+c|0;j=e+8|0;h=k[e+4>>2]|0;b=k[j>>2]|0;c=(i[f>>0]|0)==32?f+1|0:f;do{if(c>>>0>=g>>>0)break;k[n>>2]=c;f=l[1009576+(l[c>>0]|0)>>0]|0;k[m>>2]=f;c=c+f|0;f=wd(d,n,m)|0;if(f<<24>>24){k[e+32+(b<<3)>>2]=c-a;k[e+32+(b<<3)+4>>2]=f&255;b=b+1|0}}while((b|0)<(h|0));k[j>>2]=b;n=c-a|0;k[e+32+(b<<3)>>2]=n;k[e+32+(k[j>>2]<<3)+4>>2]=0;r=o;return n|0}function mb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;q=a+c|0;z=f+12|0;u=k[f+4>>2]|0;A=f+16|0;v=u+-1|0;w=d+16|0;r=d+12|0;y=a;s=e+16|0;t=e+12|0;h=k[z>>2]|0;g=k[A>>2]|0;p=a+b|0;while(1){if(p>>>0>=q>>>0){c=p;break}b=l[1009576+(l[p>>0]|0)>>0]|0;c=p+b|0;b=(l[1009576+(l[c>>0]|0)>>0]|0)+b|0;do if(b>>>0>5){o=sb(p,b)|0;a=k[d>>2]|0;m=k[w>>2]|0;n=(o>>>12)+o|0;i=(k[r>>2]|0)+-1&n;j=m&o;b=k[a+(i<<4)>>2]|0;if((b^j)&m){b=k[a+(i<<4)+4>>2]|0;if((b^j)&m){b=k[a+(i<<4)+8>>2]|0;if((b^j)&m){b=k[a+(i<<4)+12>>2]|0;if(!((b^j)&m))x=8}else x=8}else x=8}else x=8;if((x|0)==8){x=0;if(b){k[f+8040+(h<<3)>>2]=p-y;k[f+8040+(h<<3)+4>>2]=b&~m;h=h+1|0}}j=k[e>>2]|0;m=k[s>>2]|0;a=(k[t>>2]|0)+-1&n;i=m&o;b=k[j+(a<<4)>>2]|0;if((b^i)&m){b=k[j+(a<<4)+4>>2]|0;if((b^i)&m){b=k[j+(a<<4)+8>>2]|0;if((b^i)&m){b=k[j+(a<<4)+12>>2]|0;if((b^i)&m)break}}}if(b){k[f+16048+(g<<3)>>2]=p-y;k[f+16048+(g<<3)+4>>2]=b&~m;g=g+1|0}}while(0);if((g|0)<(v|0)&(h|0)<(u|0))p=c;else break}k[z>>2]=h;k[A>>2]=g;z=c-y|0;k[f+8040+(h<<3)>>2]=z;k[f+8040+(h<<3)+4>>2]=0;k[f+16048+(k[A>>2]<<3)>>2]=z;k[f+16048+(k[A>>2]<<3)+4>>2]=0;return}function nb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+16|0;C=D;t=a+b|0;u=a+c|0;B=f+8|0;b=k[B>>2]|0;A=k[f+4>>2]|0;v=C;k[v>>2]=0;k[v+4>>2]=0;v=C+4|0;w=d+16|0;x=d+12|0;y=e+12|0;z=e+16|0;g=0;c=(i[t>>0]|0)==32?t+1|0:t;do{if(c>>>0>=u>>>0)break;s=c+(l[979972+(l[c>>0]|0)>>0]|0)|0;s=s+(l[979972+(l[s>>0]|0)>>0]|0)|0;t=s+(l[979972+(l[s>>0]|0)>>0]|0)|0;t=t+(l[979972+(l[t>>0]|0)>>0]|0)|0;q=c;p=ub(c,t-q|0)|0;do if(!((p|0)==(k[C>>2]|0)?1:(p|0)==(k[v>>2]|0))){j=k[d>>2]|0;h=k[w>>2]|0;o=(p>>>12)+p|0;m=(k[x>>2]|0)+-1&o;n=h&p;c=k[j+(m<<4)>>2]|0;if((c^n)&h){c=k[j+(m<<4)+4>>2]|0;if((c^n)&h){c=k[j+(m<<4)+8>>2]|0;if((c^n)&h){c=k[j+(m<<4)+12>>2]|0;if(!((c^n)&h))m=8;else m=9}else m=8}else m=8}else m=8;if((m|0)==8){m=0;if(!c)m=9;else j=0}if((m|0)==9){c=k[y>>2]|0;if(!c)break;n=k[e>>2]|0;h=k[z>>2]|0;j=c+-1&o;m=h&p;c=k[n+(j<<4)>>2]|0;if((c^m)&h){c=k[n+(j<<4)+4>>2]|0;if((c^m)&h){c=k[n+(j<<4)+8>>2]|0;if((c^m)&h){c=k[n+(j<<4)+12>>2]|0;if((c^m)&h)break}}}if(!c)break;else j=-2147483648}k[C+(g<<2)>>2]=p;k[f+32+(b<<3)>>2]=q-a;k[f+32+(b<<3)+4>>2]=c&~h|j;b=b+1|0;g=g&1^1}while(0);c=(i[t>>0]|0)==32?t:s;if(c>>>0>>0)c=c+(l[980228+(l[c>>0]|0)>>0]|0)|0;else c=u}while((b|0)<(A|0));k[B>>2]=b;e=c-a|0;k[f+32+(b<<3)>>2]=e;k[f+32+(k[B>>2]<<3)+4>>2]=0;r=D;return e|0}function ob(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=r;r=r+16|0;F=J;u=a+b|0;A=a+(c+1)|0;H=f+12|0;g=k[H>>2]|0;B=k[f+4>>2]|0;I=f+16|0;b=k[I>>2]|0;C=B+-1|0;k[F>>2]=0;k[F+4>>2]=0;k[F+8>>2]=0;k[F+12>>2]=0;u=(i[u>>0]|0)==32?u+1|0:u;x=F+8|0;y=e+16|0;z=e+12|0;E=a;v=d+16|0;w=d+12|0;n=0;a=g;g=0;q=u;D=u;j=u;while(1){if(D>>>0>=A>>>0){c=D;break}c=i[D>>0]|0;if(c<<24>>24==32){t=u;p=wb(u,j-t|0)|0;s=L;n=F;o=x;do if(!(((p|0)==(k[n>>2]|0)?(s|0)==(k[n+4>>2]|0):0)|((p|0)==(k[o>>2]|0)?(s|0)==(k[o+4>>2]|0):0))){h=F+(g<<3)|0;k[h>>2]=p;k[h+4>>2]=s;g=1-g|0;h=F+(g<<3)|0;c=k[h>>2]|0;h=k[h+4>>2]|0;do if(!((c|0)==0&(h|0)==0|(c|0)==(p|0)&(h|0)==(s|0))){c=xb(c,h,p,s)|0;j=L;m=k[e>>2]|0;o=k[y>>2]|0;n=k[z>>2]|0;h=uf(c|0,j|0,12)|0;h=tf(h|0,L|0,c|0,j|0)|0;h=n+-1&h;j=uf(c|0,j|0,4)|0;j=o&j;c=k[m+(h<<4)>>2]|0;if((c^j)&o){c=k[m+(h<<4)+4>>2]|0;if((c^j)&o){c=k[m+(h<<4)+8>>2]|0;if((c^j)&o){c=k[m+(h<<4)+12>>2]|0;if((c^j)&o){c=n;break}}}}if(!c)c=n;else{k[f+16048+(b<<3)>>2]=q-E;k[f+16048+(b<<3)+4>>2]=c&~o;c=n;b=b+1|0}}else{c=k[z>>2]|0;o=k[y>>2]|0;m=k[e>>2]|0}while(0);q=uf(p|0,s|0,12)|0;q=tf(q|0,L|0,p|0,s|0)|0;j=c+-1&q;p=uf(p|0,s|0,4)|0;h=o&p;c=k[m+(j<<4)>>2]|0;if((c^h)&o){c=k[m+(j<<4)+4>>2]|0;if((c^h)&o){c=k[m+(j<<4)+8>>2]|0;if((c^h)&o){c=k[m+(j<<4)+12>>2]|0;if(!((c^h)&o))G=17}else G=17}else G=17}else G=17;if((G|0)==17){G=0;if(c){k[f+16048+(b<<3)>>2]=t-E;k[f+16048+(b<<3)+4>>2]=c&~o;b=b+1|0}}m=k[d>>2]|0;n=k[v>>2]|0;h=(k[w>>2]|0)+-1&q;j=n&p;c=k[m+(h<<4)>>2]|0;if((c^j)&n){c=k[m+(h<<4)+4>>2]|0;if((c^j)&n){c=k[m+(h<<4)+8>>2]|0;if((c^j)&n){c=k[m+(h<<4)+12>>2]|0;if((c^j)&n)break}}}if(c){k[f+8040+(a<<3)>>2]=t-E;k[f+8040+(a<<3)+4>>2]=c&~n;a=a+1|0}}while(0);m=D+1|0;c=i[D>>0]|0;o=0;h=u;j=m}else{o=n+1|0;h=q;m=u}c=D+(l[1009576+(c&255)>>0]|0)|0;if((b|0)<(C|0)&(a|0)<(B|0)){n=o;q=h;D=c;j=(o|0)<9?c:j;u=m}else break}k[H>>2]=a;k[I>>2]=b;H=c-E|0;k[f+8040+(a<<3)>>2]=H;k[f+8040+(a<<3)+4>>2]=0;k[f+16048+(k[I>>2]<<3)>>2]=H;k[f+16048+(k[I>>2]<<3)+4>>2]=0;r=J;return}function pb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=(c|0)<8?c*12|0:100;e=c*5>>3;e=(e|0)<3?3:(e|0)>16?16:e;c=a-b|0;if((c|0)<(e|0))if((c|0)<1)d=0;else{b=(c*100|0)/(e|0)|0;d=(d|0)<(b|0)?d:b}return d|0}function qb(a,b){a=a|0;b=b|0;var c=0.0;if(b)if(a){if((b|0)>(a|0))c=+(b|0)/+(a|0);else c=+(a|0)/+(b|0);if(!(c<=1.5))if(c>4.0)a=0;else a=~~((4.0-c)*100.0/2.5);else a=100}else a=0;else a=100;return a|0}function rb(a,b){a=a|0;b=b|0;a=((Jc(a)|0)&255)<<8;return a|(l[980484+b>>0]|0)|0}function sb(a,b){a=a|0;b=b|0;var c=0;do if(b){c=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;if((b|0)<5){c=k[120+((b&3)<<2)>>2]&c;c=c>>>3^c;break}else{a=a+4|0;a=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=(a<<18^a)+(c>>>3^c)|0;break}}else c=0;while(0);return c|0}function tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;do if((b|0)>=5){d=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;d=d>>>3^d;e=a+4|0;e=l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24;if((b|0)<9){a=k[120+((b&3)<<2)>>2]&e;d=(a<<4^a)+(d^c)|0;break}else{a=a+8|0;a=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);d=(d^c)+(e<<4^e)+(a<<2^a)|0;break}}else{d=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);d=d^c^d>>>3}while(0);return d|0}function ub(a,b){a=a|0;b=b|0;var c=0;if(!b)b=0;else{c=(i[a+-1>>0]|0)==32?17476:0;b=tb(a,b,(i[a+b>>0]|0)==32?c|1145307136:c)|0}return b|0}function vb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0;f=(i[a+-1>>0]|0)==32;e=f?c|17476:c;f=f?d:d;d=(i[a+b>>0]|0)==32;e=d?e|1145307136:e;f=d?f:f;switch(b+-1>>2|0){case 0:{b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=b;d=0;b=(uf(b|0,0,3)|0)^b;a=L;break}case 1:{h=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=uf(h|0,0,3)|0;g=L;c=a+4|0;b=k[120+((b&3)<<2)>>2]&(l[c>>0]|l[c+1>>0]<<8|l[c+2>>0]<<16|l[c+3>>0]<<24);c=tf(b|0,0,h|0,0)|0;d=L;b=tf((sf(b|0,0,4)|0)^b|0,L|0,j^h|0,g|0)|0;a=L;break}case 2:{j=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;g=uf(j|0,0,3)|0;h=L;m=a+4|0;m=l[m>>0]|l[m+1>>0]<<8|l[m+2>>0]<<16|l[m+3>>0]<<24;d=tf(m|0,0,j|0,0)|0;c=L;h=tf((sf(m|0,0,4)|0)^m|0,L|0,g^j|0,h|0)|0;j=L;a=a+8|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=tf(d|0,c|0,b|0,0)|0;d=L;b=tf(h|0,j|0,(sf(b|0,0,2)|0)^b|0,L|0)|0;a=L;break}case 3:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=uf(m|0,0,3)|0;h=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;c=tf(g|0,0,m|0,0)|0;d=L;h=tf((sf(g|0,0,4)|0)^g|0,L|0,j^m|0,h|0)|0;m=L;j=a+8|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=tf(c|0,d|0,j|0,0)|0;c=L;j=tf(h|0,m|0,(sf(j|0,0,2)|0)^j|0,L|0)|0;m=L;a=a+12|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=tf(d|0,c|0,b|0,0)|0;d=L;b=tf(j|0,m|0,(uf(b|0,0,8)|0)^b|0,L|0)|0;a=L;break}case 4:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;h=uf(m|0,0,3)|0;j=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;d=tf(g|0,0,m|0,0)|0;c=L;j=tf((sf(g|0,0,4)|0)^g|0,L|0,h^m|0,j|0)|0;m=L;h=a+8|0;h=l[h>>0]|l[h+1>>0]<<8|l[h+2>>0]<<16|l[h+3>>0]<<24;c=tf(d|0,c|0,h|0,0)|0;d=L;h=tf(j|0,m|0,(sf(h|0,0,2)|0)^h|0,L|0)|0;m=L;j=a+12|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=tf(c|0,d|0,j|0,0)|0;c=L;j=tf(h|0,m|0,(uf(j|0,0,8)|0)^j|0,L|0)|0;m=L;a=a+16|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=tf(d|0,c|0,b|0,0)|0;d=L;b=tf(j|0,m|0,(uf(b|0,0,4)|0)^b|0,L|0)|0;a=L;break}default:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=uf(m|0,0,3)|0;h=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;c=tf(g|0,0,m|0,0)|0;d=L;h=tf((sf(g|0,0,4)|0)^g|0,L|0,j^m|0,h|0)|0;m=L;j=a+8|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=tf(c|0,d|0,j|0,0)|0;c=L;j=tf(h|0,m|0,(sf(j|0,0,2)|0)^j|0,L|0)|0;m=L;h=a+12|0;h=l[h>>0]|l[h+1>>0]<<8|l[h+2>>0]<<16|l[h+3>>0]<<24;c=tf(d|0,c|0,h|0,0)|0;d=L;h=tf(j|0,m|0,(uf(h|0,0,8)|0)^h|0,L|0)|0;m=L;j=a+16|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=tf(c|0,d|0,j|0,0)|0;c=L;j=tf(h|0,m|0,(uf(j|0,0,4)|0)^j|0,L|0)|0;m=L;a=a+20|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=tf(d|0,c|0,b|0,0)|0;d=L;b=tf(j|0,m|0,(uf(b|0,0,6)|0)^b|0,L|0)|0;a=L}}j=uf(c|0,d|0,17)|0;j=tf(j|0,L|0,c|0,d|0)|0;m=L;h=uf(j|0,m|0,9)|0;m=tf(h|0,L|0,j|0,m|0)|0;m=tf(0,m&255|0,b^e|0,a^f|0)|0;return m|0}function wb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if(!b){b=0;a=0}else{c=(i[a+-1>>0]|0)==32;e=c?17476:0;c=c?0:0;d=(i[a+b>>0]|0)==32;a=vb(a,b,d?e|1145307136:e,d?c:c)|0;b=L}L=b;return a|0}function xb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=uf(a|0,b|0,13)|0;e=L;b=sf(a|0,b|0,51)|0;d=tf(f|b|0,e|L|0,c|0,d|0)|0;return d|0}function yb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=r;r=r+48|0;i=h+24|0;k[i>>2]=0;k[i+4>>2]=1097825;k[i+8>>2]=23;k[i+12>>2]=26;f=mc(a,b,c,i,0,d,e,h,f,g)|0;r=h;return ((f|0)==26?0:f)|0}function zb(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return mc(a,b,c,d,0,e,f,g,h,i)|0}function Ab(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if(a<<16>>16){d=a&1023;e=k[b>>2]|0;do if((e|0)>0){c=0;while(1){f=b+4+(c<<1)|0;g=j[f>>1]|0;c=c+1|0;if((g&1023|0)==(d|0)){c=5;break}if((c|0)>=(e|0)){c=6;break}}if((c|0)==5){b=g<<16>>16>>10;a=a<<16>>16>>10;j[f>>1]=((b|0)>=(a|0)?b:a)<<10|d;break a}else if((c|0)==6)if((e|0)>13)break a;else break}while(0);k[b>>2]=e+1;j[b+4+(e<<1)>>1]=a}while(0);return}function Bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if(a<<16>>16){d=a&1023;e=k[b>>2]|0;do if((e|0)>0){c=0;while(1){f=b+4+(c<<1)|0;g=m[f>>1]|0;c=c+1|0;if((g&1023|0)==(d|0)){c=5;break}if((c|0)>=(e|0)){c=6;break}}if((c|0)==5){j[f>>1]=g+2048&64512|d;break a}else if((c|0)==6)if((e|0)>13)break a;else break}while(0);k[b>>2]=e+1;j[b+4+(e<<1)>>1]=a}while(0);return}function Cb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;if((k[a>>2]|0)>4){g=0;do{f=j[a+4+(g<<1)>>1]|0;d=f<<16>>16>>10;d=(d|0)>-1?d:0-d|0;a:do if((g|0)>0){e=g;while(1){b=e+-1|0;c=j[a+4+(b<<1)>>1]|0;h=c<<16>>16>>10;if((((h|0)>-1?h:0-h|0)|0)>=(d|0)){b=e;break a}j[a+4+(e<<1)>>1]=c;if((e|0)>1)e=b;else break}}else b=g;while(0);j[a+4+(b<<1)>>1]=f;g=g+1|0}while((g|0)<(k[a>>2]|0));k[a>>2]=4}return}function Db(a){a=a|0;var b=0,c=0,d=0;d=i[a>>0]|0;b=(d&1)==0;d=b?(d&255)>>>1:k[a+4>>2]|0;if((d|0)>0){a=b?a+1|0:k[a+8>>2]|0;b=0;c=0;do{b=((i[a+c>>0]|0)==44&1)+b|0;c=c+1|0}while((c|0)!=(d|0))}else b=0;return b|0}function Eb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=c;c=0;a:while(1){if((c|0)<(g|0))f=c;else{c=0;break}while(1){d=f+g>>1;c=b+(d*12|0)|0;e=_e(k[c>>2]|0,a)|0;if((e|0)>=0)break;c=d+1|0;if((c|0)<(g|0))f=c;else{c=0;break a}}if((e|0)>0){g=d;c=f}else break}return c|0}function Fb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=181;b=0;a:while(1){if((b|0)<(f|0))e=b;else{b=0;break}while(1){c=e+f>>1;b=5776+(c<<3)|0;d=_e(k[b>>2]|0,a)|0;if((d|0)>=0)break;b=c+1|0;if((b|0)<(f|0))e=b;else{b=0;break a}}if((d|0)>0){f=c;b=e}else break}return b|0}function Gb(a){a=a|0;Ca(a|0)|0;je()}function Hb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=c+-3|0;a:do if((d|0)>(b|0))do{e=a+b|0;e=l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24;if((e^1010580540)+-16843009&(e&-2139062144^-2139062144)|0)break a;b=b+4|0}while((b|0)<(d|0));while(0);b:do if((b|0)<(c|0))while(1){if((i[a+b>>0]|0)==60)break b;b=b+1|0;if((b|0)>=(c|0)){b=-1;break}}else b=-1;while(0);return b|0}function Ib(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do if((b|0)<(c|0))while(1){b:do switch(i[a+b>>0]|0){case 61:break a;case 34:{e=b+1|0;if((e|0)<(c|0)){d=b;b=e;while(1){switch(i[a+b>>0]|0){case 34:break b;case 92:{d=d+2|0;break}default:d=b}b=d+1|0;if((b|0)>=(c|0))break b}}else b=e;break}case 39:{e=b+1|0;if((e|0)<(c|0)){d=b;b=e;while(1){switch(i[a+b>>0]|0){case 39:break b;case 92:{d=d+2|0;break}default:d=b}b=d+1|0;if((b|0)>=(c|0))break b}}else b=e;break}default:{}}while(0);b=b+1|0;if((b|0)>=(c|0)){b=-1;break a}}else b=-1;while(0);return b|0}function Jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=Ve(d)|0;a:do if((c-b|0)>=(g|0)){f=g+b|0;while(1){if((c|0)<=(f|0))break;e=c+-1|0;if((i[a+e>>0]|0)==32)c=e;else break}c=c-g|0;if((c|0)>=(b|0)){c=a+c|0;if((g|0)>0){e=0;while(1){if((i[c+e>>0]|32|0)!=(i[d+e>>0]|0)){c=0;break a}e=e+1|0;if((e|0)>=(g|0)){c=1;break}}}else c=1}else c=0}else c=0;while(0);return c|0}function Kb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Ve(d)|0;a:do if((c-b|0)>=(e|0)){c=c-e|0;b:do if((c|0)>(b|0))while(1){switch(i[a+b>>0]|0){case 39:case 34:case 32:break;default:break b}b=b+1|0;if((b|0)>=(c|0))break b}while(0);b=a+b|0;if((e|0)>0){c=0;while(1){if((i[b+c>>0]|32|0)!=(i[d+c>>0]|0)){b=0;break a}c=c+1|0;if((c|0)>=(e|0)){b=1;break}}}else b=1}else b=0;while(0);return b|0}function Lb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;if((c|0)<(d|0)){f=1;do{e=l[b+c>>0]|0;g=(l[984554+e>>0]|0)>>>(f*3|0);f=g&3;do if(g&4|0)if(!f){hf(a,i[984810+e>>0]|0);break}else{hf(a,44);break}while(0);c=c+1|0}while((c|0)!=(d|0));if(!f)hf(a,44)}return}function Mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((c|0)<(d|0)){b:while(1){switch(i[b+c>>0]|0){case 39:case 34:break b;case 32:break;default:{f=5;break a}}c=c+1|0;if((c|0)>=(d|0)){f=5;break a}}if((c|0)>=0){e=c+1|0;c:do if((e|0)<(d|0)){c=e;d:while(1){switch(i[b+c>>0]|0){case 39:case 34:break d;case 62:{f=8;break d}case 61:{f=9;break d}case 60:{f=10;break d}case 38:{f=11;break d}default:{}}c=c+1|0;if((c|0)>=(d|0))break c}if((f|0)==8)c=c+-1|0;else if((f|0)==9)c=c+-1|0;else if((f|0)==10)c=c+-1|0;else if((f|0)==11)c=c+-1|0;if((c|0)>=0){Lb(a,b,e,c);break a}}while(0);ef(a,1097825,0)}else f=5}else f=5;while(0);if((f|0)==5)ef(a,1097825,0);return}function Nb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0;o=r;r=r+32|0;n=o;d=i[a>>0]|0;l=a+4|0;e=k[l>>2]|0;c=(d&1)==0?(d&255)>>>1:e;if((c|0?(Db(a)|0)<=4:0)?(c|0)>0:0){g=a+8|0;h=a+1|0;f=0;do{c=of(a,f)|0;if((c|0)==-1){if(!(d&1))e=(d&255)>>>1}else e=c;c=e-f|0;do if((c|0)<17){vf(n|0,((d&1)==0?h:k[g>>2]|0)+f|0,c|0)|0;i[n+c>>0]=0;c=Eb(n,136,213)|0;if(c|0){Ab(j[c+8>>1]|0,b);Ab(j[c+10>>1]|0,b);break}c=Te(n,45)|0;if(c|0)i[c>>0]=0;if((Ve(n)|0)<4?(m=Eb(n,2692,257)|0,m|0):0){Ab(j[m+8>>1]|0,b);Ab(j[m+10>>1]|0,b)}}while(0);f=e+1|0;d=i[a>>0]|0;e=k[l>>2]|0}while((f|0)<(((d&1)==0?(d&255)>>>1:e)|0))}r=o;return}function Ob(a,b){a=a|0;b=b|0;var c=0,d=0;c=r;r=r+16|0;d=c;Lb(d,a,0,Ve(a)|0);Nb(d,b);ff(d);r=c;return}function Pb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=r;r=r+16|0;d=e;c=Ve(a)|0;if((c|0)<=3){$e(d,a);i[d+3>>0]=0;if((c|0)>0){a=0;do{f=d+a|0;i[f>>0]=l[f>>0]|0|32;a=a+1|0}while((a|0)!=(c|0))}a=Fb(d)|0;if(a|0){Bb(j[a+4>>1]|0,b);Bb(j[a+6>>1]|0,b)}}r=e;return}function Qb(a,b){a=a|0;b=b|0;switch(a|0){case 62:case 48:case 46:case 45:case 14:{Bb(4112,b);break}case 47:case 20:case 13:{Bb(4165,b);break}case 12:case 21:case 11:case 10:{Bb(4104,b);break}case 44:case 16:{Bb(4105,b);break}default:{}}return}function Rb(a,b){a=a|0;b=b|0;Bb(a+8192&65535,b);return}function Sb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=r;r=r+80|0;e=f;d=f+8|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;if((k[b>>2]|0)>0){c=0;do{g=j[b+4+(c<<1)>>1]|0;h=Gc(g&1023)|0;k[e>>2]=h;k[e+4>>2]=g<<16>>16>>10;We(d,985273,e);lf(a,d);c=c+1|0}while((c|0)<(k[b>>2]|0))}r=f;return}function Tb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+16|0;C=D;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;y=(c|0)<8192?c:8192;a:do if((y|0)>0){s=C+4|0;t=a+1|0;u=C+8|0;v=C+1|0;w=a+8|0;x=a+4|0;c=0;do{c=Hb(b,c,y)|0;if((c|0)<0)break a;d=c+1|0;if((d|0)<(y|0))c=d;else break a;b:while(1){switch(i[b+c>>0]|0){case 62:break b;case 60:{z=6;break b}case 38:{z=7;break b}default:{}}c=c+1|0;if((c|0)>=(y|0))break a}if((z|0)==6){z=0;c=c+-1|0}else if((z|0)==7){z=0;c=c+-1|0}if((c|0)<0)break a;if((((((!(Kb(b,d,c,985280)|0)?!(Kb(b,d,c,985284)|0):0)?!(Kb(b,d,c,985290)|0):0)?!(Kb(b,d,c,985298)|0):0)?!(Kb(b,d,c,985304)|0):0)?!(Kb(b,d,c,985309)|0):0)?(A=Kb(b,d,c,985312)|0,B=Ib(b,d,c)|0,(B|0)>-1):0){g=B;f=0;e=d;while(1){do if(A){if(Jb(b,e,g,985318)|0?Kb(b,g+1|0,c,985330)|0:0){z=25;break}if(Jb(b,e,g,985348)|0){d=g+1|0;if(!(Kb(b,d,c,985354)|0)?!(f|(Kb(b,d,c,985367)|0)):0){d=0;z=26}else z=25}else z=24}else z=24;while(0);if((z|0)==24)if(f)z=25;else{d=0;z=26}if((z|0)==25)if(Jb(b,e,g,985377)|0){d=1;z=29}else{d=1;z=26}if((z|0)==26){z=0;if(!(Jb(b,e,g,985386)|0)?!(Jb(b,e,g,985392)|0):0)e=g+1|0;else z=29}if((z|0)==29){z=0;p=g+1|0;Mb(C,b,p,c);q=i[C>>0]|0;f=(q&1)==0;q=f?(q&255)>>>1:k[s>>2]|0;c:do if(q|0){e=i[a>>0]|0;if(!(e&1)){e=(e&255)>>>1;g=t}else{e=k[x>>2]|0;g=k[w>>2]|0}l=f?v:k[u>>2]|0;d:do if(e>>>0>=q>>>0){m=g+e|0;n=l+q|0;o=g;if((e|0)<(q|0))break;h=m+(1-q)|0;if((h|0)==(g|0))break;j=i[l>>0]|0;e=g;e:while(1){if((i[e>>0]|0)==j<<24>>24){f=e;g=l;do{g=g+1|0;if((g|0)==(n|0))break e;f=f+1|0}while((i[f>>0]|0)==(i[g>>0]|0))}e=e+1|0;if((e|0)==(h|0))break d}if(!((e|0)==(m|0)|(e-o|0)==-1))break c}while(0);kf(a,l,q)}while(0);ff(C);e=p}g=Ib(b,e,c)|0;if((g|0)<=-1)break;else f=d}}c=c+1|0}while((c|0)<(y|0))}while(0);c=i[a>>0]|0;d=(c&1)==0;if(d)e=(c&255)>>>1;else e=k[a+4>>2]|0;if(e>>>0>1){if(d)c=(c&255)>>>1;else c=k[a+4>>2]|0;nf(a,c+-1|0)}r=D;return}function Ub(a,b){a=a|0;b=b|0;var c=0;c=(b|0)<32?b:32;a:do if((c|0)>0){b=0;while(1){if((i[a+~b>>0]|0)==32)break a;b=b+1|0;if((b|0)>=(c|0)){b=0;break}}while(1){if((i[a+(0-b)>>0]&-64)<<24>>24!=-128)break a;b=b+1|0;if((b|0)>=(c|0)){b=0;break}}}else b=0;while(0);return b|0}function Vb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;d=(b|0)<32?b:32;c=0;while(1){if((c|0)>=(d|0)){e=3;break}b=c+1|0;if((i[a+c>>0]|0)==32)break;else c=b}a:do if((e|0)==3)if((d|0)>0){b=0;while(1){if((i[a+b>>0]&-64)<<24>>24!=-128)break a;b=b+1|0;if((b|0)>=(d|0)){b=0;break}}}else b=0;while(0);return b|0}function Wb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0;j=a+b|0;e=k[c>>2]|0;if((b|0)>0){b=0;h=a;do{f=i[h>>0]|0;g=f&255;do if((f&255)>=192){if((g&224|0)==192){g=l[h+1>>0]|0|g<<8;a=2;break}a=i[h+1>>0]|0;f=i[h+2>>0]|0;if((g&240|0)==224){g=(a&255)<<8|g<<16|f&255;a=3;break}else{g=(a&255)<<16|g<<24|(f&255)<<8|(l[h+3>>0]|0);a=4;break}}else a=1;while(0);h=h+a|0;m=d+(e<<2)|0;f=k[m>>2]|0;k[m>>2]=g;b=((g|0)==(f|0)?a:0)+b|0;e=(g^e<<4)&4095}while(h>>>0>>0)}else b=0;k[c>>2]=e;return b|0}function Xb(a,b){a=a|0;b=b|0;var c=0,d=0;c=b&-4;if((c|0)>0){d=0;b=0;do{b=((i[a+d>>0]|0)==32&1)+b+((i[a+(d|1)>>0]|0)==32&1)+((i[a+(d|2)>>0]|0)==32&1)+((i[a+(d|3)>>0]|0)==32&1)|0;d=d+4|0}while((d|0)<(c|0))}else b=0;return b|0}function Yb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=a+b|0;e=k[c>>2]|0;if((b|0)>0){q=a;p=0;r=a;m=a;n=0;while(1){g=i[r>>0]|0;j=g&255;f=q+1|0;i[q>>0]=g;do if(g<<24>>24!=32)if((g&255)>=192){if((j&224|0)==192){h=r+1|0;i[f>>0]=i[h>>0]|0;j=l[h>>0]|0|j<<8;f=q+2|0;h=p;o=2;break}h=r+1|0;i[f>>0]=i[h>>0]|0;g=r+2|0;f=q+3|0;i[q+2>>0]=i[g>>0]|0;if((j&240|0)==224){j=(l[h>>0]|0)<<8|j<<16|(l[g>>0]|0);h=p;o=3;break}else{o=r+3|0;i[f>>0]=i[o>>0]|0;j=(l[h>>0]|0)<<16|j<<24|(l[g>>0]|0)<<8|(l[o>>0]|0);f=q+4|0;h=p;o=4;break}}else{h=p;o=1}else{m=(p<<1|0)>(n|0)?m:f;f=m;h=0;o=1;n=0}while(0);r=r+o|0;q=d+(e<<2)|0;g=k[q>>2]|0;k[q>>2]=j;e=(j^e<<4)&4095;if(r>>>0>=s>>>0)break;else{q=f;p=((j|0)==(g|0)?o:0)+h|0;n=o+n|0}}}else f=a;k[c>>2]=e;e=f-a|0;if((e|0)>=(b+-3|0)){if((e|0)<(b|0))i[f>>0]=32}else{i[f>>0]=32;i[f+1>>0]=32;i[f+2>>0]=32;i[f+3>>0]=0}return e|0}function Zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;o=r;r=r+16|0;m=o;h=a+b|0;k[m>>2]=0;n=re(16384)|0;rf(n|0,0,16384)|0;if((b|0)>0){j=h;c=a;l=a+1|0;d=a;e=0;f=a;do{g=j-f|0;g=(g|0)>48?48:g;while(1)if((i[f+g>>0]&-64)<<24>>24==-128)g=g+1|0;else break;p=Xb(f,g)|0;if((p|0)<12&(Wb(f,g,m,n)|0)<19){if(e){p=Vb(f,g)|0;e=g-p|0;f=f+p|0}else e=g;if((e|0)>0){wf(d|0,f|0,e|0)|0;d=d+e|0;g=e;e=0}else{g=e;e=0}}else if(!e){d=d+(0-(Ub(d,d-c|0)|0))|0;if((d|0)==(a|0)){i[a>>0]=32;d=l;e=1}else e=1}else e=1;f=f+g|0}while(f>>>0>>0)}else{c=a;d=a}c=d-c|0;if((c|0)>=(b+-3|0)){if((c|0)<(b|0))i[d>>0]=32}else{i[d>>0]=32;i[d+1>>0]=32;i[d+2>>0]=32;i[d+3>>0]=0}se(n);r=o;return c|0}function _b(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=r;r=r+16|0;d=e;if((b|0)<256)b=0;else{k[d>>2]=0;c=re(16384)|0;rf(c|0,0,16384)|0;if((Xb(a,256)|0)<64?(Wb(a,256,d,c)|0)<171:0)b=0;else b=1;se(c)}r=e;return b|0}function $b(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=r;r=r+48|0;x=y+32|0;t=y+16|0;s=y;q=0;do{d=j[a+568+(q<<1)>>1]|0;n=d&65535;do if(((((d<<16>>16!=-1?(o=k[a+616+(q<<2)>>2]|0,o|0):0)?(p=(k[a+808+(q<<2)>>2]|0)/(o|0)|0,(d&65535)<165&(p|0)<41):0)?(i=k[7224+(n<<2)>>2]|0,(i|0)!=26):0)?(l=td(a,i&65535)|0,(l|0)>=0):0)?(m=k[a+616+(l<<2)>>2]|0,m|0):0){d=(k[a+808+(l<<2)>>2]|0)/(m|0)|0;e=(d|0)<(p|0);if(!e?!((n|0)<(i|0)&(d|0)==(p|0)):0){f=q;g=0;h=l}else{f=l;g=1;h=q}z=e?p:d;e=m+o|0;z=ha((z|0)>41?z:41,e)|0;j[a+568+(f<<1)>>1]=-1;k[a+712+(f<<2)>>2]=0;k[a+808+(f<<2)>>2]=0;k[a+712+(h<<2)>>2]=e;k[a+808+(h<<2)>>2]=z;if(!(c|(e|0)>9&b^1))if(g){h=Gc(i)|0;z=Gc(n)|0;k[s>>2]=h;k[s+4>>2]=d;k[s+8>>2]=m;k[s+12>>2]=z;He(941120,985398,s);break}else{n=Gc(n)|0;z=Gc(i)|0;k[t>>2]=n;k[t+4>>2]=p;k[t+8>>2]=o;k[t+12>>2]=z;He(941120,985398,t);break}}while(0);q=q+1|0}while((q|0)!=24);f=0;do{d=a+568+(f<<1)|0;z=j[d>>1]|0;e=z&65535;if(((z<<16>>16!=-1?(u=k[a+616+(f<<2)>>2]|0,v=a+808+(f<<2)|0,u|0):0)?(w=(k[v>>2]|0)/(u|0)|0,(w|0)<=40):0)?(j[d>>1]=-1,k[a+712+(f<<2)>>2]=0,k[v>>2]=0,!(c|(u|0)>9&b^1)):0){z=Gc(e)|0;k[x>>2]=z;k[x+4>>2]=w;k[x+8>>2]=u;He(941120,985425,x)}f=f+1|0}while((f|0)!=24);r=y;return}function ac(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=c+616+(b<<2)|0;k[e>>2]=(k[c+616+(a<<2)>>2]|0)+(k[e>>2]|0);e=c+712+(b<<2)|0;d=c+712+(a<<2)|0;k[e>>2]=(k[d>>2]|0)+(k[e>>2]|0);e=c+808+(b<<2)|0;b=c+808+(a<<2)|0;k[e>>2]=(k[b>>2]|0)+(k[e>>2]|0);j[c+568+(a<<1)>>1]=-1;k[d>>2]=0;k[b>>2]=0;return}function bc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0;j=r;r=r+16|0;i=j;f=b^1|c;g=0;do{d=m[a+568+(g<<1)>>1]|0;b=Hc(d)|0;a:do if(b|0){h=g;do{h=h+1|0;if((h|0)>=24)break a;e=m[a+568+(h<<1)>>1]|0}while((Hc(e)|0)!=(b|0));b=(k[a+616+(g<<2)>>2]|0)<(k[a+616+(h<<2)>>2]|0);c=b?g:h;if(!f){l=k[a+616+(c<<2)>>2]|0;n=(k[a+808+(c<<2)>>2]|0)/((l|0?l:1)|0)|0;o=Gc(b?d:e)|0;e=Gc(b?e:d)|0;k[i>>2]=o;k[i+4>>2]=n;k[i+8>>2]=l;k[i+12>>2]=e;He(941120,985446,i)}ac(c,b?h:g,a)}while(0);g=g+1|0}while((g|0)!=24);r=j;return}function cc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;l=r;r=r+48|0;h=l+32|0;j=l+24|0;g=l+16|0;f=l;Ze(985487,34,1,941120);e=k[a>>2]|0;if((e|0)!=26){m=Fc(e)|0;e=i[d>>0]|0?1097825:985485;d=k[b>>2]|0;k[f>>2]=m;k[f+4>>2]=e;k[f+8>>2]=d;He(941120,985522,f)}e=k[a+4>>2]|0;if((e|0)!=26){f=Fc(e)|0;m=k[b+4>>2]|0;k[g>>2]=f;k[g+4>>2]=m;He(941120,985535,g)}e=k[a+8>>2]|0;if((e|0)!=26){g=Fc(e)|0;m=k[b+8>>2]|0;k[j>>2]=g;k[j+4>>2]=m;He(941120,985535,j)}k[h>>2]=k[c>>2];He(941120,985546,h);Ze(1017206,5,1,941120);r=l;return}function dc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var l=0.0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0;k[c>>2]=0;n=c+4|0;k[n>>2]=0;r=c+8|0;k[r>>2]=0;k[d>>2]=26;m=d+4|0;k[m>>2]=26;q=d+8|0;k[q>>2]=26;k[e>>2]=0;u=e+4|0;k[u>>2]=0;v=e+8|0;k[v>>2]=0;o=f+8|0;s=f+16|0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;k[f+20>>2]=0;k[g>>2]=b;i[h>>0]=0;t=j[a+568>>1]|0;switch(t<<16>>16){case 26:case -1:{f=0;break}default:{k[d>>2]=t&65535;d=k[a+616>>2]|0;k[c>>2]=(k[a+808>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+712>>2]<<10|0)/(d|0)|0|0);p[f>>3]=l;f=d}}d=j[a+570>>1]|0;switch(d<<16>>16){case 26:case -1:{c=0;break}default:{k[m>>2]=d&65535;d=k[a+620>>2]|0;k[n>>2]=(k[a+812>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+716>>2]<<10|0)/(d|0)|0|0);p[o>>3]=l;c=d}}d=j[a+572>>1]|0;switch(d<<16>>16){case 26:case -1:{d=0;break}default:{k[q>>2]=d&65535;d=k[a+624>>2]|0;k[r>>2]=(k[a+816>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+720>>2]<<10|0)/(d|0)|0|0);p[s>>3]=l}}c=c+f|0;d=d+c|0;if((d|0)>(b|0)){k[g>>2]=d;b=d}r=(b|0)<1?1:b;f=(f*100|0)/(r|0)|0;k[e>>2]=f;s=(c*100|0)/(r|0)|0;c=((d*100|0)/(r|0)|0)-s|0;k[v>>2]=c;d=s-f|0;k[u>>2]=d;if((d|0)<(c|0)){d=d+1|0;k[u>>2]=d;k[v>>2]=c+-1}if((f|0)<(d|0)){k[e>>2]=f+1;k[u>>2]=d+-1}k[g>>2]=b;switch(t<<16>>16){case 26:case -1:{d=0;break}default:{d=k[a+616>>2]|0;d=((k[a+808>>2]|0)/((d|0?d:1)|0)|0|0)>40&1}}i[h>>0]=d;i[h>>0]=(100-(k[e>>2]|0)-(k[u>>2]|0)-(k[v>>2]|0)|0)>20?0:d;return}function ec(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=r;r=r+32|0;w=y+8|0;v=y;q=y+12|0;k[q>>2]=k[1971];k[q+4>>2]=k[1972];k[q+8>>2]=k[1973];h=k[c>>2]|0;k[d>>2]=k[b>>2];i[e>>0]=(h|0)>1&1;j=0;m=0;l=0;p=3;while(1){if((k[b+(m<<2)>>2]|0)==25){o=(k[c+(m<<2)>>2]|0)+l|0;n=m+1|0;if((n|0)<3){h=m;j=n;while(1){k[q+(h<<2)>>2]=k[q+(j<<2)>>2];h=j+1|0;if((h|0)==3)break;else{u=j;j=h;h=u}}j=k[q>>2]|0}l=p+-1|0;h=((k[c>>2]|0)*100|0)/(101-o|0)|0;k[d>>2]=k[b+(j<<2)>>2];if((k[c+(j<<2)>>2]|0)<2){i[e>>0]=0;m=n;s=j;t=o;u=l}else{m=n;s=j;t=o;u=l}}else{m=m+1|0;s=j;t=l;u=p}if((m|0)==3)break;else{j=s;l=t;p=u}}o=k[q+4>>2]|0;p=k[c+(o<<2)>>2]|0;n=ha(p,a)|0;o=b+(o<<2)|0;l=k[b+(s<<2)>>2]|0;m=(l|0)==0;a:do if(m){j=k[o>>2]|0;switch(j|0){case 26:case 0:{x=24;break a}default:{}}if((n|0)>1499&(p|0)>16){h=(p*100|0)/(101-t-(k[c+(s<<2)>>2]|0)|0)|0;k[d>>2]=j;if((p|0)<2)i[e>>0]=0}else x=23}else{b=l+-4|0;if(b>>>0<11?(1035>>>(b&2047)&1)!=0:0){j=k[o>>2]|0;if(j>>>0<15){if(16561>>>(j&32767)&1){x=23;break}}else if((j|0)==26){x=23;break}if((n|0)>1499&(p|0)>19){h=(p*100|0)/(101-t-(k[c+(s<<2)>>2]|0)|0)|0;k[d>>2]=j;if((p|0)<2)i[e>>0]=0}else x=23}else x=23}while(0);if((x|0)==23){j=k[o>>2]|0;x=24}do if((x|0)==24){if(!j){if(m)break;h=((k[c+(s<<2)>>2]|0)*100|0)/(101-t-p|0)|0;break}x=j+-4|0;if(x>>>0<11?(1035>>>(x&2047)&1)!=0:0){if(l>>>0<15?16561>>>(l&32767)&1:0)break;h=((k[c+(s<<2)>>2]|0)*100|0)/(101-t-p|0)|0}}while(0);if((h|0)<26){if(!(f^1|g)){x=Gc(k[d>>2]|0)|0;k[v>>2]=x;k[v+4>>2]=h;He(941120,985557,v)}k[d>>2]=26;i[e>>0]=0}if((h|0)<51)i[e>>0]=0;if((100-(k[c>>2]|0)-(k[c+4>>2]|0)-(k[c+8>>2]|0)|0)>20)i[e>>0]=0;if(!u){if(!(f^1|g)){x=Gc(k[d>>2]|0)|0;k[w>>2]=x;He(941120,985593,w)}k[d>>2]=26;i[e>>0]=0}r=y;return}function fc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(Lc(a)|0){d=c+16|0;e=k[d>>2]|0;k[c+20+(e<<2)>>2]=b;k[d>>2]=e+1&3}if(Mc(a)|0){e=c+36|0;d=k[e>>2]|0;k[c+40+(d<<2)>>2]=b;k[e>>2]=d+1&3}return}function gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=rb(b,1)|0;if(Lc(a)|0?Lc(b)|0:0){e=c+56|0;f=k[e>>2]|0;k[c+60+(f<<2)>>2]=d;k[e>>2]=f+1&3}if(Mc(a)|0?Mc(b)|0:0){f=c+76|0;e=k[f>>2]|0;k[c+80+(e<<2)>>2]=d;k[f>>2]=e+1&3}return}function hc(a,b){a=a|0;b=b|0;var c=0,d=0;switch(a|0){case 16:{gc(16,69,b);break}case 69:{gc(69,16,b);break}default:{c=Hc(a)|0;if(c|0){d=0;do{if(!((d|0)==(a|0)|(c|0)!=(Hc(d)|0)))gc(a,d,b);d=d+1|0}while((d|0)!=512)}}}return}function ic(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,l=0,n=0,o=0,p=0;p=r;r=r+64|0;h=p+8|0;g=p;n=p+32|0;o=p+16|0;l=p+12|0;k[n>>2]=0;if(!c){Tb(o,a,b);Nb(o,n);if(i[e+5>>0]|0?(c=i[o>>0]|0,f=(c&1)==0,(f?(c&255)>>>1:k[o+4>>2]|0)|0):0){c=k[e>>2]|0;k[g>>2]=f?o+1|0:k[o+8>>2]|0;He(c,985624,g)}ff(o)}if(d|0){f=k[d>>2]|0;if(f|0?i[f>>0]|0:0)Ob(f,n);f=k[d+4>>2]|0;if(f|0?i[f>>0]|0:0)Pb(f,n);f=k[d+8>>2]|0;if((f|0)!=23)Qb(f,n);f=k[d+12>>2]|0;if((f|0)!=26)Rb(f,n)}Cb(n);if(i[e+5>>0]|0){Sb(o,n);d=i[o>>0]|0;f=(d&1)==0;if((f?(d&255)>>>1:k[o+4>>2]|0)|0){d=k[e>>2]|0;k[h>>2]=f?o+1|0:k[o+8>>2]|0;He(d,985648,h)}ff(o)}d=k[n>>2]|0;c=(d|0)>0;if(c){b=0;do{a=j[n+4+(b<<1)>>1]|0;f=a&1023;a=a<<16>>16>>10;if((a|0)>0)fc(f,rb(f,a)|0,e);b=b+1|0}while((b|0)<(d|0))}k[l>>2]=0;jc(o,l);g=k[o>>2]|0;if(c){b=g+40|0;f=0;while(1){l=m[n+4+(f<<1)>>1]&1023;h=g+((Hc(l)|0)<<2)|0;k[h>>2]=(k[h>>2]|0)+1;switch(l|0){case 16:{k[b>>2]=(k[b>>2]|0)+1;break}case 69:{k[b>>2]=(k[b>>2]|0)+1;break}default:{}}f=f+1|0;if((f|0)==(d|0)){a=0;break}}do{l=j[n+4+(a<<1)>>1]|0;f=l&1023;a:do if((l<<16>>16>>10|0)>0){l=Hc(f)|0;if((l|0)>0?(k[g+(l<<2)>>2]|0)==1:0)hc(f,e);switch(f|0){case 16:case 69:break;default:break a}if((k[b>>2]|0)==1)hc(f,e)}while(0);a=a+1|0}while((a|0)!=(d|0))}b=g;if(g|0){f=o+4|0;a=k[f>>2]|0;if((a|0)!=(g|0))k[f>>2]=a+(~((a+-4-b|0)>>>2)<<2);Xd(g)}r=p;return}function jc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;k[a>>2]=0;e=a+4|0;k[e>>2]=0;k[a+8>>2]=0;kc(a);c=k[e>>2]|0;a=11;d=c;while(1){k[d>>2]=k[b>>2];a=a+-1|0;if(!a)break;else d=d+4|0}k[e>>2]=c+44;return}function kc(a){a=a|0;var b=0;b=pe(44)|0;k[a+4>>2]=b;k[a>>2]=b;k[a+8>>2]=b+44;return}function lc(a){a=a|0;var b=0,c=0,d=0;c=k[a>>2]|0;d=c;if(c|0){a=a+4|0;b=k[a>>2]|0;if((b|0)!=(c|0))k[a>>2]=b+(~((b+-4-d|0)>>>2)<<2);Xd(c)}return}function mc(a,b,c,d,e,f,g,h,j,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=r;r=r+3488|0;S=U+3112|0;O=U+3104|0;F=U+3096|0;E=U+3088|0;R=U+3080|0;L=U+3072|0;I=U+3064|0;H=U+3056|0;J=U+3040|0;C=U+3032|0;p=U+3024|0;o=U+3016|0;D=U+2112|0;m=U+3468|0;n=U+3308|0;z=U+3320|0;q=U;T=U+3168|0;A=U+3144|0;y=U+3136|0;G=U+3124|0;Q=U+3120|0;k[f>>2]=26;K=f+4|0;k[K>>2]=26;M=f+8|0;k[M>>2]=26;k[g>>2]=0;N=g+4|0;k[N>>2]=0;P=g+8|0;k[P>>2]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;k[h+16>>2]=0;k[h+20>>2]=0;k[j>>2]=0;i[l>>0]=0;if(e&8192|0){ef(D,a,b);if(!(e&512)){nc(n);B=(i[n>>0]&1)==0?n+1|0:k[n+8>>2]|0;k[p>>2]=b;k[p+4>>2]=B;He(941120,985693,p);ff(n)}else{oc(m);B=(i[m>>0]&1)==0?m+1|0:k[m+8>>2]|0;k[o>>2]=b;k[o+4>>2]=B;He(941120,985674,o);ff(m)}ff(D)}if(!b)m=26;else{rd(D);k[z>>2]=941120;i[z+4>>0]=e>>>8&1;w=e>>>9&1;i[z+5>>0]=w;x=z+6|0;i[x>>0]=e>>>10&1;i[z+7>>0]=e>>>11&1;k[z+12>>2]=26;t=z+8|0;k[t>>2]=0;k[z+140>>2]=7896;o=z+144|0;k[o>>2]=0;m=z+16|0;n=m+120|0;do{k[m>>2]=0;m=m+4|0}while((m|0)<(n|0));u=e>>>12;ic(a,b,c,d,z);md(q);md(q+528|0);md(q+1056|0);md(q+1584|0);wc(T,a,b,c);k[o>>2]=T;n=A+4|0;o=A+12|0;k[A>>2]=0;k[A+4>>2]=0;k[A+8>>2]=0;k[A+12>>2]=0;k[A+16>>2]=26;k[y>>2]=0;s=re(16384)|0;p=(e&4|0)!=0;if(p)rf(s|0,0,16384)|0;q=(e&2|0)==0;v=(e&1|0)!=0;B=0;while(1){if(!(Cc(T,A)|0)){o=21;break}m=k[n>>2]|0;if(q){if(!(v|(m|0)<2049)?_b(k[A>>2]|0,m)|0:0){o=15;break}}else{m=Zb(k[A>>2]|0,m)|0;k[n>>2]=m}if(p){m=Yb(k[A>>2]|0,m,y,s)|0;k[n>>2]=m}k[t>>2]=k[o>>2];ld(A,z,D);B=m+B|0}if((o|0)==15){if(w|0){k[C>>2]=B;He(941120,985708,C)}se(s);m=mc(a,b,c,d,e|2,f,g,h,j,l)|0}else if((o|0)==21){se(s);n=(w|0)!=0;m=u&1;if(n&(m|0)==0){if(!(i[x>>0]|0))Ze(1017206,5,1,941120);vd(D)}p=(m|0)!=0;bc(D,n,p);ud(D);dc(D,B,G,f,g,h,j,l);do if(!(v|(B|0)<257)){if(i[l>>0]|0){m=k[g>>2]|0;if((m|0)>69){o=29;break}if(((k[N>>2]|0)+m|0)>92){o=29;break}}if(!(p|n^1))cc(f,g,j,l);if((B|0)<256){if(n){k[E>>2]=B;He(941120,985862,E)}m=mc(a,b,c,d,e|93,f,g,h,j,l)|0;break}else{if(n){k[F>>2]=B;He(941120,985937,F)}m=mc(a,b,c,d,e|13,f,g,h,j,l)|0;break}}else o=29;while(0);if((o|0)==29){$b(D,n,p);ud(D);dc(D,B,G,f,g,h,j,l);ec(B,f,g,Q,l,n,p);m=n^1;if(!(p|m)){o=0;do{n=k[f+(o<<2)>>2]|0;if((n|0)!=26){j=Gc(n)|0;E=k[G+(o<<2)>>2]|0;F=k[g+(o<<2)>>2]|0;k[J>>2]=j;k[J+4>>2]=E;k[J+8>>2]=F;He(941120,985771,J)}o=o+1|0}while((o|0)!=3);k[H>>2]=B;He(941120,985761,H);H=Fc(k[Q>>2]|0)|0;J=i[l>>0]|0?32:42;k[I>>2]=H;k[I+4>>2]=J;He(941120,985785,I);Ze(985793,9,1,941120)}if(m|p^1)m=k[Q>>2]|0;else{Ze(985803,37,1,941120);m=k[f>>2]|0;if((m|0)!=26){J=Gc(m)|0;g=k[g>>2]|0;k[L>>2]=J;k[L+4>>2]=g;He(941120,985841,L)}m=k[K>>2]|0;if((m|0)!=26){L=Gc(m)|0;N=k[N>>2]|0;k[O>>2]=L;k[O+4>>2]=N;He(941120,985841,O)}m=k[M>>2]|0;if((m|0)!=26){O=Gc(m)|0;P=k[P>>2]|0;k[S>>2]=O;k[S+4>>2]=P;He(941120,985841,S)}m=k[Q>>2]|0;Q=Fc(m)|0;S=i[l>>0]|0?32:42;k[R>>2]=Q;k[R+4>>2]=S;He(941120,985785,R);Ze(1017206,5,1,941120)}}}xc(T)}r=U;return m|0}function nc(a){a=a|0;ef(a,1097825,0);return}function oc(a){a=a|0;ef(a,1097825,0);return}function pc(a){a=a|0;a:do if(a>>>0>=256){if(a>>>0>=55296){switch(a&-16|0){case 64992:case 64976:{a=65533;break a}default:{}}if((a&65534|0)==65534)a=65533;else a=(a+-57344|0)>>>0<1056768?a:65533}}else a=k[7932+(a<<2)>>2]|0;while(0);return a|0}function qc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if((b|0)>0){g=0;c=0;d=0;while(1){f=i[a+g>>0]|0;if((f&-64)<<24>>24!=-128){e=(d|0)>7|((c|0)>24?1:((l[993817+((f&255)>>>4)>>0]|0)+g|0)>(b|0));if(e)break a;else d=(e&1^1)+d|0}switch(f<<24>>24){case 60:{f=1097792+c|0;i[f>>0]=38;i[f+1>>0]=108;i[f+2>>0]=116;i[f+3>>0]=59;c=c+4|0;break}case 62:{f=1097792+c|0;i[f>>0]=38;i[f+1>>0]=103;i[f+2>>0]=116;i[f+3>>0]=59;c=c+4|0;break}case 38:{f=1097792+c|0;i[f>>0]=i[993833]|0;i[f+1>>0]=i[993834]|0;i[f+2>>0]=i[993835]|0;i[f+3>>0]=i[993836]|0;i[f+4>>0]=i[993837]|0;c=c+5|0;break}case 39:{f=1097792+c|0;i[f>>0]=i[993839]|0;i[f+1>>0]=i[993840]|0;i[f+2>>0]=i[993841]|0;i[f+3>>0]=i[993842]|0;i[f+4>>0]=i[993843]|0;i[f+5>>0]=i[993844]|0;c=c+6|0;break}case 34:{f=1097792+c|0;i[f>>0]=i[993846]|0;i[f+1>>0]=i[993847]|0;i[f+2>>0]=i[993848]|0;i[f+3>>0]=i[993849]|0;i[f+4>>0]=i[993850]|0;i[f+5>>0]=i[993851]|0;c=c+6|0;break}default:{i[1097792+c>>0]=f;c=c+1|0}}g=g+1|0;if((g|0)>=(b|0))break a}}else c=0;while(0);i[1097792+c>>0]=0;return}function rc(a,b){a=a|0;b=b|0;do if(b>>>0>=128){if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;b=2;break}b=b>>>0>1114111?65533:b;if(b>>>0<65536){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;b=3;break}else{i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;b=4;break}}else{i[a>>0]=b;b=1}while(0);return b|0}function sc(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+16|0;c=d;if((b|0)>15)b=-1;else{vf(c|0,a|0,b|0)|0;i[c+b>>0]=0;b=Nc(c)|0;if((b|0)>-1)b=k[8956+(b<<3)+4>>2]|0;else b=-1}r=d;return b|0}function tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0;j=a+b|0;a:do if((b|0)!=0?(i[a>>0]|0)==38:0){k[c>>2]=1;f=a+1|0;d=i[f>>0]|0;if(d<<24>>24==35){if((b|0)<4){d=-1;break}d=a+2|0;b:do switch(i[d>>0]|0){case 88:case 120:{d=a+3|0;do{if((i[d>>0]|0)!=48)break;d=d+1|0}while(d>>>0>>0);if((d|0)==(j|0)){d=-1;break a}f=i[d>>0]|0;if((f+-48&255)>=10)switch(f<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:{d=-1;break a}}c:do if(d>>>0>>0){e=f;b=d;while(1){if((e+-48&255)>=10)switch(e<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:{h=b;break c}}b=b+1|0;if(b>>>0>=j>>>0){h=b;break c}e=i[b>>0]|0}}else h=d;while(0);b=h;g=b-d|0;if((g|0)>=8?!((g|0)==8&f<<24>>24<56):0){d=65533;break b}d:do if(d>>>0>>0){g=f;e=0;while(1){f=e<<4;e=g<<24>>24;do if((g+-48&255)>=10)if((g+-97&255)<6){e=e+-87|0;break}else{e=(g+-65&255)<6?e+-55|0:0;break}else e=e+-48|0;while(0);f=e+f|0;e=d+1|0;if((e|0)==(h|0)){d=f;break d}d=e;g=i[e>>0]|0;e=f}}else d=0;while(0);d=pc(d)|0;break}case 48:{while(1){d=d+1|0;if(d>>>0>=j>>>0){l=32;break b}if((i[d>>0]|0)!=48){l=32;break}}break}default:l=32}while(0);do if((l|0)==32){if((d|0)==(j|0)){d=-1;break a}f=i[d>>0]|0;if((f+-48&255)>=10){d=-1;break a}e:do if(d>>>0>>0){b=d;while(1){b=b+1|0;if(b>>>0>=j>>>0){g=b;break e}if(((i[b>>0]|0)+-48&255)>=10){g=b;break}}}else g=d;while(0);b=g;e=b-d|0;if((e|0)>=9){if((e|0)!=10){d=65533;break}if((bf(d,993853,10)|0)>=1){d=65533;break}}if(d>>>0>>0){e=(f<<24>>24)+-48|0;d=d+1|0;if((d|0)==(g|0))d=e;else{f=d;d=e;do{d=(d*10|0)+-48+(i[f>>0]|0)|0;f=f+1|0}while((f|0)!=(g|0))}}else d=0;d=pc(d)|0}while(0);if((d|0)==-1|b>>>0>j>>>0){d=-1;break}}else{g=f;if((b|0)>1?(d+-48&255)<10|((d&-33)+-65&255)<26:0){d=f;do{d=d+1|0;if(d>>>0>=j>>>0)break;h=i[d>>0]|0}while((h+-48&255)<10|((h&-33)+-65&255)<26);b=d;e=d}else{b=g;e=f}d=sc(f,b-g|0)|0;if((d|0)<0){d=-1;break}if((d|0)>255){if(e>>>0>=j>>>0){d=-1;break}if((i[e>>0]|0)!=59){d=-1;break}}}e=b;if(e>>>0>>0?(i[e>>0]|0)==59:0)b=e+1|0;k[c>>2]=b-a}else l=3;while(0);if((l|0)==3){k[c>>2]=0;d=-1}return d|0}function uc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=tc(a,b,d)|0;if((b|0)>0)b=rc(c,b)|0;else{k[d>>2]=1;b=0}k[e>>2]=b;return}function vc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;f=a+b|0;a:do if((b|0)>0){d=a;e=1008264;while(1){e=l[e+(l[1009064+(l[d>>0]|0)>>0]|0)>>0]|0;if((e|0)<=(c|0))break;d=d+1|0;if(d>>>0>>0)e=1008264+(e*20|0)|0;else break a}switch(e|0){case 0:case 2:{b=d-a|0;break a}default:{}}b=d-a|0;while(1){d=b+-1|0;if((b|0)<=1)break a;if((i[a+d>>0]|0)==60)break;else b=d}}while(0);return b|0}function wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;k[a>>2]=b;k[a+4>>2]=b;k[a+8>>2]=b+c;k[a+12>>2]=c;i[a+16>>0]=d&1;i[a+28>>0]=1;i[a+29>>0]=1;k[a+32>>2]=1;c=a+36|0;Pc(c);d=a+88|0;Pc(d);b=re(40960)|0;k[a+20>>2]=b;b=re(61440)|0;k[a+24>>2]=b;Qc(c);Qc(d);return}function xc(a){a=a|0;var b=0;b=k[a+20>>2]|0;if(b|0)se(b);b=k[a+24>>2]|0;if(b|0)se(b);Rc(a+88|0);Rc(a+36|0);return}function yc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;u=r;r=r+32|0;o=u+12|0;s=u+8|0;q=u+4|0;n=u;p=u+16|0;k[q>>2]=0;a:do if((c|0)>0){m=a+16|0;j=a+32|0;a=0;e=0;while(1){yd(b+e|0,c-e|0,o);e=(k[o>>2]|0)+e|0;if((e|0)>=(c|0)){e=c;a=0;break a}g=b+e|0;h=i[g>>0]|0;f=h&255;b:do if(((h&-32)<<24>>24==32?(i[1009320+f>>0]|0)!=0:0)?(i[m>>0]|0)==0:0)switch(h<<24>>24){case 60:{a=vc(g,c-e|0,k[j>>2]|0)|0;k[q>>2]=a;break b}case 62:{k[q>>2]=1;a=1;break b}case 38:{uc(g,c-e|0,p,q,n);k[o>>2]=l[1009576+(l[p>>0]|0)>>0];k[s>>2]=p;a=(xd(s,o)|0)&255;t=12;break b}default:break b}else t=11;while(0);if((t|0)==11){a=l[1009576+f>>0]|0;k[q>>2]=a;k[o>>2]=a;k[s>>2]=g;a=(xd(s,o)|0)&255;t=12}if((t|0)==12){t=0;if(a|0)break a;a=k[q>>2]|0}e=a+e|0;if((e|0)>=(c|0)){a=0;break}}}else{e=0;a=0}while(0);k[d>>2]=a;r=u;return e|0}function zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0;w=r;r=r+16|0;p=w+4|0;o=w;t=a+20|0;m=k[t>>2]|0;k[b>>2]=m;u=b+4|0;k[u>>2]=0;v=a+4|0;k[b+8>>2]=(k[v>>2]|0)-(k[a>>2]|0);k[b+12>>2]=0;k[b+16>>2]=26;l=b+20|0;i[l>>0]=0;s=a+12|0;n=k[s>>2]|0;n=(n+-40928|0)>>>0<40928?(n|0)/2|0:40896;i[m>>0]=32;i[(k[t>>2]|0)+1>>0]=0;b=k[s>>2]|0;if((b|0)<1)b=0;else{m=a+16|0;j=a+32|0;c=0;g=b;h=0;a=1;b=0;while(1){d=k[v>>2]|0;e=d+b|0;f=i[e>>0]|0;f=f<<24>>24==13?10:f;if(((f&-32)<<24>>24==32?(i[1009320+(f&255)>>0]|0)!=0:0)?(i[m>>0]|0)==0:0){a:do switch(f<<24>>24){case 60:{b:do if((b|0)<(g+-3|0))switch(i[d+(b+1)>>0]|32|0){case 112:{d=(i[d+(b+2)>>0]|0)<64?10:32;break b}case 98:{if((i[d+(b+2)>>0]|32|0)!=114){d=32;break b}d=(i[d+(b+3)>>0]|0)<64?10:32;break b}case 116:{if((i[d+(b+2)>>0]|32|0)!=114){d=32;break b}d=(i[d+(b+3)>>0]|0)<64?10:32;break b}default:{d=32;break b}}else d=32;while(0);c=(vc(e,g-b|0,k[j>>2]|0)|0)+1|0;k[p>>2]=c;if(h)switch(d<<24>>24){case 10:case 32:{e=d;d=1;break a}default:{}}i[(k[t>>2]|0)+a>>0]=d;e=d;d=d<<24>>24==32|d<<24>>24==10;a=a+1|0;break}case 62:{k[p>>2]=1;i[(k[t>>2]|0)+a>>0]=62;c=1;e=62;d=h;a=a+1|0;break}case 38:{uc(e,g-b|0,(k[t>>2]|0)+a|0,p,o);c=k[p>>2]|0;e=38;d=h;a=(k[o>>2]|0)+a|0;break}default:{e=f;d=h}}while(0);h=c;b=c+b|0}else{if(h)switch(f<<24>>24){case 10:case 32:{d=1;break}default:q=22}else q=22;if((q|0)==22){q=0;i[(k[t>>2]|0)+a>>0]=f;d=f<<24>>24==32|f<<24>>24==10;a=a+1|0}h=c;e=f;b=b+1|0}if(!((a|0)<(n|0)|e<<24>>24!=10&e<<24>>24!=32)){q=25;break}if((a|0)>40927){q=28;break}g=k[s>>2]|0;if((g|0)<=(b|0))break;else{c=h;h=d}}if((q|0)==25)i[l>>0]=1;else if((q|0)==28)i[l>>0]=1;d=k[v>>2]|0;c:do if((b|0)>0){c=b;while(1){if((i[d+c>>0]&-64)<<24>>24!=-128){b=c;break c}b=c+-1|0;a=a+-1|0;if((c|0)>1)c=b;else break}}while(0);k[v>>2]=d+b;k[s>>2]=(k[s>>2]|0)-b;i[(k[t>>2]|0)+a>>0]=32;i[(k[t>>2]|0)+(a+1)>>0]=32;i[(k[t>>2]|0)+(a+2)>>0]=32;i[(k[t>>2]|0)+(a+3)>>0]=0;k[u>>2]=a;b=1}r=w;return b|0}function Ac(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=r;r=r+32|0;s=C+16|0;v=C+12|0;c=C+8|0;u=C+4|0;t=C;if(!(i[a+28>>0]|0))b=zc(a,b)|0;else{z=a+20|0;y=k[z>>2]|0;k[b>>2]=y;A=b+4|0;k[A>>2]=0;B=a+4|0;o=b+8|0;k[o>>2]=(k[B>>2]|0)-(k[a>>2]|0);d=b+12|0;k[d>>2]=0;k[b+16>>2]=26;p=b+20|0;i[p>>0]=0;x=a+12|0;q=k[x>>2]|0;q=(q+-40928|0)>>>0<40928?(q|0)/2|0:40896;k[u>>2]=0;k[t>>2]=0;i[y>>0]=32;i[(k[z>>2]|0)+1>>0]=0;y=a+36|0;Qc(y);Xc(y,k[o>>2]|0);b=yc(a,k[B>>2]|0,k[x>>2]|0,c)|0;k[B>>2]=(k[B>>2]|0)+b;k[x>>2]=(k[x>>2]|0)-b;if((b|0)==1)Vc(y,1);else{Xc(y,b);Wc(y,1)}b=k[x>>2]|0;if((b|0)<1){Tc(y);b=0}else{o=k[c>>2]|0;k[d>>2]=o;m=a+16|0;n=a+29|0;j=a+32|0;d=b;c=1;a=0;b=0;do{a:do if((d|0)>(b|0)){g=a;while(1){f=(k[B>>2]|0)+b|0;a=i[f>>0]|0;e=a&255;b:do if(((a&-32)<<24>>24==32?(i[1009320+e>>0]|0)!=0:0)?(i[m>>0]|0)==0:0){switch(a<<24>>24){case 62:case 60:{h=c;c=0;break a}case 38:break;default:break b}uc(f,d-b|0,(k[z>>2]|0)+c|0,u,t);g=(k[z>>2]|0)+c|0;k[s>>2]=l[1009576+(l[g>>0]|0)>>0];k[v>>2]=g;g=(xd(v,s)|0)&255}else w=15;while(0);if((w|0)==15){w=0;a=l[1009576+e>>0]|0;k[t>>2]=a;k[u>>2]=a;e=(k[z>>2]|0)+c|0;if((b|0)<(d+-3|0)){h=l[f>>0]|l[f+1>>0]<<8|l[f+2>>0]<<16|l[f+3>>0]<<24;i[e>>0]=h;i[e+1>>0]=h>>8;i[e+2>>0]=h>>16;i[e+3>>0]=h>>24}else vf(e|0,f|0,a|0)|0;g=(k[B>>2]|0)+b|0;k[s>>2]=l[1009576+(l[g>>0]|0)>>0];k[v>>2]=g;g=(xd(v,s)|0)&255}if((g|0)!=40&(g|0)!=(o|0)){if(!g){h=c;c=0;break a}d=k[u>>2]|0;h=(k[B>>2]|0)+b+d|0;k[s>>2]=l[1009576+(l[h>>0]|0)>>0];k[v>>2]=h;h=xd(v,s)|0;if(!(h<<24>>24==0|(h&255|0)==(o|0))?(i[n>>0]|0)!=0:0){h=c;c=g;break a}}else d=k[u>>2]|0;b=d+b|0;a=k[t>>2]|0;c=a+c|0;do if((d|0)!=(a|0))if((d|0)<(a|0)){Vc(y,d);Wc(y,a-d|0);break}else{Vc(y,a);Xc(y,d-a|0);break}else Vc(y,d);while(0);if((c|0)>40927)break;d=k[x>>2]|0;if((d|0)<=(b|0)){h=c;c=g;break a}}i[p>>0]=1;h=c;c=g}else{h=c;c=a}while(0);d=k[x>>2]|0;c:do if((d|0)>(b|0))while(1){yd((k[B>>2]|0)+b|0,d-b|0,s);d=k[s>>2]|0;k[u>>2]=d;b=d+b|0;Xc(y,d);d=k[x>>2]|0;if((d|0)<=(b|0)){a=c;break c}a=(k[B>>2]|0)+b|0;e=i[a>>0]|0;f=e&255;d:do if(((e&-32)<<24>>24==32?(i[1009320+f>>0]|0)!=0:0)?(i[m>>0]|0)==0:0)switch(e<<24>>24){case 60:{c=vc(a,d-b|0,k[j>>2]|0)|0;k[u>>2]=c;break d}case 62:{k[u>>2]=1;c=1;break d}case 38:{uc(a,d-b|0,(k[z>>2]|0)+h|0,u,t);c=(k[z>>2]|0)+h|0;k[s>>2]=l[1009576+(l[c>>0]|0)>>0];k[v>>2]=c;c=(xd(v,s)|0)&255;w=42;break d}default:{w=42;break d}}else w=41;while(0);if((w|0)==41){c=l[1009576+f>>0]|0;k[u>>2]=c;k[s>>2]=c;k[v>>2]=a;c=(xd(v,s)|0)&255;w=42}if((w|0)==42){w=0;if(c|0){a=c;break c}c=k[u>>2]|0}b=c+b|0;Xc(y,c);d=k[x>>2]|0;if((d|0)<=(b|0)){a=0;break}else c=0}else a=c;while(0);c=h+1|0;i[(k[z>>2]|0)+h>>0]=32;Wc(y,1);if((a|0)!=40&(a|0)!=(o|0))break;if((c|0)>=(q|0)){w=48;break}d=k[x>>2]|0}while((b|0)<(d|0));if((w|0)==48)i[p>>0]=1;e=k[x>>2]|0;e:do if((b|0)>0){a=(b|0)<(e|0);d=b;while(1){if(!a){b=d;break e}if((i[(k[B>>2]|0)+d>>0]&-64)<<24>>24!=-128){b=d;break e}b=d+-1|0;c=c+-1|0;if((d|0)>1)d=b;else break}}while(0);k[B>>2]=(k[B>>2]|0)+b;k[x>>2]=e-b;i[(k[z>>2]|0)+c>>0]=32;i[(k[z>>2]|0)+(c+1)>>0]=32;i[(k[z>>2]|0)+(c+2)>>0]=32;i[(k[z>>2]|0)+(c+3)>>0]=0;Wc(y,4);Tc(y);k[A>>2]=c;b=1}}r=C;return b|0}function Bc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=r;r=r+16|0;g=c+4|0;d=a+88|0;Qc(d);e=b+4|0;f=a+24|0;zd(k[b>>2]|0,(k[e>>2]|0)+3|0,k[f>>2]|0,61440,(i[a+16>>0]|0)!=0,c+8|0,g,c,d);a=k[g>>2]|0;i[(k[f>>2]|0)+a>>0]=0;k[b>>2]=k[f>>2];k[e>>2]=a+-3;Tc(d);r=c;return}function Cc(a,b){a=a|0;b=b|0;var c=0;c=Ac(a,b)|0;Bc(a,b);return c|0}function Dc(a){a=a|0;a=(a|0)<0?0:a;return k[15988+(((a|0)>101?0:a)<<2)>>2]|0}function Ec(a){a=a|0;a=(a|0)<0?0:a;return k[16396+(((a|0)>101?0:a)<<2)>>2]|0}function Fc(a){a=a|0;a=(a|0)<0?26:a;return k[11076+(((a|0)>613?26:a)<<2)>>2]|0}function Gc(a){a=a|0;a=(a|0)<0?26:a;return k[13532+(((a|0)>613?26:a)<<2)>>2]|0}function Hc(a){a=a|0;do switch(a|0){case 40:case 38:{a=1;break}case 105:{a=2;break}case 135:{a=2;break}case 17:{a=3;break}case 68:{a=3;break}case 84:{a=4;break}case 83:{a=4;break}case 78:{a=5;break}case 28:{a=5;break}case 29:{a=5;break}case 160:{a=5;break}case 35:{a=6;break}case 64:{a=6;break}case 51:{a=6;break}case 43:{a=6;break}case 10:{a=7;break}case 80:{a=7;break}case 1:{a=7;break}case 31:{a=8;break}case 14:{a=8;break}case 12:{a=8;break}case 143:{a=9;break}case 147:{a=9;break}default:a=0}while(0);return a|0}function Ic(a){a=a|0;if(a>>>0>101)a=26;else a=k[16804+(a<<2)>>2]|0;return a|0}function Jc(a){a=a|0;if((a|0)<512)a=i[992810+a>>0]|0;else a=0;return a|0}function Kc(a,b){a=a|0;b=b|0;do if(a>>>0<=101){if((k[16396+(a<<2)>>2]|0)>>>0<2){b=k[16804+(a<<2)>>2]|0;break}b=b&255;if((a|0)==1){b=m[941344+(b<<1)>>1]|0;break}else{b=m[941856+(b<<1)>>1]|0;break}}else b=26;while(0);return b|0}function Lc(a){a=a|0;if((a|0)<512)a=(m[941344+((l[992810+a>>0]|0)<<1)>>1]|0|0)==(a|0);else a=0;return a|0}function Mc(a){a=a|0;if((a|0)<512)a=(m[941856+((l[992810+a>>0]|0)<<1)>>1]|0|0)==(a|0);else a=0;return a|0}function Nc(a){a=a|0;var b=0,c=0,d=0,e=0;c=0;e=265;a:while(1)while(1){if((c|0)>=(e|0)){b=-1;break a}b=c+e>>1;d=_e(a,k[8956+(b<<3)>>2]|0)|0;if((d|0)<0){e=b;continue a}if((d|0)>0)c=b+1|0;else break a}return b|0}function Oc(a){a=a|0;switch(a|0){case 1:{a=0;break}case 3:{a=1;break}case 6:{a=2;break}default:a=3}return a|0}function Pc(a){a=a|0;var b=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=1;a=a+16|0;b=a+36|0;do{k[a>>2]=0;a=a+4|0}while((a|0)<(b|0));return}function Qc(a){a=a|0;var b=0;if(!(i[a>>0]&1)){i[a+1>>0]=0;i[a>>0]=0}else{i[k[a+8>>2]>>0]=0;k[a+4>>2]=0}k[a+12>>2]=1;a=a+16|0;b=a+36|0;do{k[a>>2]=0;a=a+4|0}while((a|0)<(b|0));return}function Rc(a){a=a|0;ff(a);return}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=a+16|0;g=k[j>>2]|0;do if(g|0){h=a+12|0;b=k[h>>2]|0;if((b|0)==1){e=i[a>>0]|0;f=(e&1)==0;if(f)c=(e&255)>>>1;else c=k[a+4>>2]|0;if(c|0){if(f){c=(e&255)>>>1;d=a+1|0}else{c=k[a+4>>2]|0;d=k[a+8>>2]|0}d=i[d+(c+-1)>>0]|0;if((d&-64)<<24>>24==64?(g+(d&63)|0)>>>0<64:0){if(f){c=(e&255)>>>1;b=a+1|0}else{c=k[a+4>>2]|0;b=k[a+8>>2]|0}a=b+(c+-1)|0;i[a>>0]=(l[a>>0]|0)+g;k[j>>2]=0;break}}}if(g>>>0>63){c=g;d=0;e=30;while(1){b=c>>>e&63;if(d|(b|0)!=0){mf(a,b&255);b=1}else b=0;if((e|0)<=6)break;c=k[j>>2]|0;d=b;e=e+-6|0}c=k[j>>2]|0;b=k[h>>2]|0}else c=g;mf(a,(c&63|b<<6)&255);k[j>>2]=0}while(0);return}function Tc(a){a=a|0;Uc(a);a=a+20|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;k[a+16>>2]=0;k[a+20>>2]=0;return}function Uc(a){a=a|0;var b=0,c=0;if(!(k[a+16>>2]|0)){b=i[a>>0]|0;if(!(b&1))b=(b&255)>>>1;else b=k[a+4>>2]|0;if(!b)c=6}else c=6;if((c|0)==6){Vc(a,1);Sc(a)}return}function Vc(a,b){a=a|0;b=b|0;var c=0;do if(b|0){c=a+44|0;k[c>>2]=(k[c>>2]|0)+b;c=a+48|0;k[c>>2]=(k[c>>2]|0)+b;c=a+12|0;if((k[c>>2]|0)==1){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}else{Sc(a);k[c>>2]=1;k[a+16>>2]=b;break}}while(0);return}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;do if(b|0){d=a+48|0;k[d>>2]=(k[d>>2]|0)+b;d=a+12|0;e=k[d>>2]|0;if((e|0)==2){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}c=a+16|0;if((b|0)==1&(e|0)==3?(k[c>>2]|0)==1:0){k[d>>2]=1;break}Sc(a);k[d>>2]=2;k[c>>2]=b}while(0);return}function Xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;do if(b|0){d=a+44|0;k[d>>2]=(k[d>>2]|0)+b;d=a+12|0;e=k[d>>2]|0;if((e|0)==3){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}c=a+16|0;if((b|0)==1&(e|0)==2?(k[c>>2]|0)==1:0){k[d>>2]=1;break}Sc(a);k[d>>2]=3;k[c>>2]=b}while(0);return}function Yc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+16|0;l=t;qd(f,l);h=k[l>>2]|0;o=Kc(a,h&255)|0;l=k[l+4>>2]|0;q=Kc(a,l&255)|0;n=f+16|0;if((d|0)>0)s=(m[n+(h<<1)>>1]<<10|0)/(d|0)|0;else s=0;p=(Oc(a)|0)+(o<<2)|0;p=j[(k[(k[e+140>>2]|0)+32>>2]|0)+(p<<1)>>1]|0;j[g>>1]=c;j[g+2>>1]=b;j[g+4>>1]=o;j[g+6>>1]=q;c=j[n+(h<<1)>>1]|0;j[g+8>>1]=c;h=j[n+(l<<1)>>1]|0;j[g+10>>1]=h;j[g+12>>1]=d;e=k[f+12>>2]|0;j[g+14>>1]=e;j[g+16>>1]=a;e=(pb(c&65535,h&65535,e&65535)|0)&255;h=g+18|0;i[h>>0]=e;e=Hc(o)|0;if(e|0?(e|0)==(Hc(q)|0):0)i[h>>0]=100;s=(qb(s,p)|0)&255;i[g+19>>0]=s;r=t;return}function Zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=(k[a+8>>2]|0)==1;f=e?a+96|0:a+116|0;d=e?a+16|0:a+36|0;c=k[d+4>>2]|0;if(c|0)kb(c,b);c=k[d+8>>2]|0;if(c|0)kb(c,b);c=k[d+12>>2]|0;if(c|0)kb(c,b);c=k[d+16>>2]|0;if(c|0)kb(c,b);e=e?a+56|0:a+76|0;c=k[f+4>>2]|0;if(c|0)kb(c,b);c=k[f+8>>2]|0;if(c|0)kb(c,b);c=k[f+12>>2]|0;if(c|0)kb(c,b);c=k[f+16>>2]|0;if(c|0)kb(c,b);d=b+16|0;c=k[e+4>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+8>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+12>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+16>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;return}function _c(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+16|0;h=t;s=k[b+56064+(c<<2)>>2]|0;q=k[b+56064+(c+1<<2)>>2]|0;nd(f);k[e+16>>2]=0;k[e+20>>2]=0;if(i[d+7>>0]|0){p=k[d>>2]|0;k[h>>2]=s;k[h+4>>2]=q;He(p,1017069,h)}k[e>>2]=s;k[e+12>>2]=q-s;if((q|0)>(s|0)){h=d+96|0;l=d+8|0;n=d+116|0;p=s;do{o=k[b+24056+(p<<3)+4>>2]|0;kb(o,f);e=b+24056+(p<<3)+2|0;c=j[e>>1]|0;if((c&65535)<2){od(f);c=j[e>>1]|0}if(c<<16>>16==3){e=(k[l>>2]|0)==1?h:n;c=k[e>>2]|0;k[e+4+(c<<2)>>2]=o;k[e>>2]=c+1&3}p=p+1|0}while((p|0)!=(q|0))}Zc(d,f);p=m[b+24056+(s<<3)>>1]|0;Yc(a,s,p,(m[b+24056+(q<<3)>>1]|0)-p|0,d,f,g);k[d+12>>2]=m[g+4>>1];r=t;return}function $c(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;x=r;r=r+608|0;w=x+552|0;s=x+528|0;p=x;q=x+576|0;k[w>>2]=0;k[w+4>>2]=0;k[w+8>>2]=0;k[w+12>>2]=0;k[w+16>>2]=0;k[w+20>>2]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;k[s+20>>2]=0;g=b+24|0;if((k[g>>2]|0)>0){i=s+12|0;l=s+16|0;m=s+4|0;n=s+20|0;o=s+8|0;t=0;do{md(p);_c(a,b,t,c,s,p,q);h=k[d>>2]|0;if((h|0)<50){u=d+4+(h*20|0)|0;f=q;v=u+20|0;do{j[u>>1]=j[f>>1]|0;u=u+2|0;f=f+2|0}while((u|0)<(v|0));h=(k[d>>2]|0)+1|0;k[d>>2]=h};k[w>>2]=k[s>>2];k[w+4>>2]=k[s+4>>2];k[w+8>>2]=k[s+8>>2];k[w+12>>2]=k[s+12>>2];k[w+16>>2]=k[s+16>>2];k[w+20>>2]=k[s+20>>2];k[s>>2]=(k[s>>2]|0)+(k[i>>2]|0);k[m>>2]=(k[m>>2]|0)+(k[l>>2]|0);k[o>>2]=(k[o>>2]|0)+(k[n>>2]|0);t=t+1|0}while((t|0)<(k[g>>2]|0))}else h=k[d>>2]|0;i=k[b+20>>2]|0;f=j[b+24056+(i<<3)>>1]|0;g=d+4+(h*20|0)|0;u=g;v=u+20|0;do{j[u>>1]=0;u=u+2|0}while((u|0)<(v|0));j[g>>1]=f;j[d+4+(h*20|0)+2>>1]=i;k[e>>2]=k[w>>2];k[e+4>>2]=k[w+4>>2];k[e+8>>2]=k[w+8>>2];k[e+12>>2]=k[w+12>>2];k[e+16>>2]=k[w+16>>2];k[e+20>>2]=k[w+20>>2];r=x;return}function ad(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if((k[a>>2]|0)>0){c=0;do{e=l[a+4+(c*20|0)+18>>0]|0;d=l[a+4+(c*20|0)+19>>0]|0;sd(b,j[a+4+(c*20|0)+4>>1]|0,m[a+4+(c*20|0)+12>>1]|0,m[a+4+(c*20|0)+8>>1]|0,e>>>0>>0?e:d);c=c+1|0}while((c|0)<(k[a>>2]|0))}return}function bd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;p=r;r=r+112|0;o=p+96|0;n=p+80|0;l=p+64|0;h=p+48|0;g=p+32|0;i=p+16|0;e=p;t=Dc(k[c>>2]|0)|0;d=c+8|0;s=k[d>>2]|0;j=c+12|0;q=k[j>>2]|0;m=c+16|0;f=k[m>>2]|0;k[e>>2]=t;k[e+4>>2]=s;k[e+8>>2]=q;k[e+12>>2]=f;He(a,1017096,e);e=c+4|0;a:do if((k[e>>2]|0)>0){f=0;do{if((f|0)<(k[d>>2]|0)){s=k[c+32+(f<<3)>>2]|0;t=k[c+32+(f<<3)+4>>2]|0;qc(b+s|0,6);k[i>>2]=f;k[i+4>>2]=s;k[i+8>>2]=(t|0)<0?(t&2147483647)+2e9|0:t;k[i+12>>2]=1097792;He(a,1017160,i)}if((f|0)<(k[j>>2]|0)){s=k[c+8040+(f<<3)>>2]|0;t=k[c+8040+(f<<3)+4>>2]|0;qc(b+s|0,12);k[g>>2]=f;k[g+4>>2]=s;k[g+8>>2]=t;k[g+12>>2]=1097792;He(a,1017175,g)}if((f|0)<(k[m>>2]|0)){s=k[c+16048+(f<<3)>>2]|0;t=k[c+16048+(f<<3)+4>>2]|0;qc(b+s|0,12);k[h>>2]=f;k[h+4>>2]=s;k[h+8>>2]=t;k[h+12>>2]=1097792;He(a,1017191,h)}if((f|0)<(k[d>>2]|0))Ze(1017206,5,1,a);if((f|0)>50)break a;f=f+1|0}while((f|0)<(k[e>>2]|0))}while(0);d=k[d>>2]|0;if((d|0)>50){s=k[c+32+(d<<3)>>2]|0;t=k[c+32+(d<<3)+4>>2]|0;qc(b+s|0,6);k[l>>2]=d;k[l+4>>2]=s;k[l+8>>2]=(t|0)<0?(t&2147483647)+2e9|0:t;k[l+12>>2]=1097792;He(a,1017160,l)}d=k[j>>2]|0;if((d|0)>50){s=k[c+8040+(d<<3)>>2]|0;t=k[c+8040+(d<<3)+4>>2]|0;qc(b+s|0,12);k[n>>2]=d;k[n+4>>2]=s;k[n+8>>2]=t;k[n+12>>2]=1097792;He(a,1017175,n)}d=k[m>>2]|0;if((d|0)>50){s=k[c+16048+(d<<3)>>2]|0;t=k[c+16048+(d<<3)+4>>2]|0;qc(b+s|0,12);k[o>>2]=d;k[o+4>>2]=s;k[o+8>>2]=t;k[o+12>>2]=1097792;He(a,1017191,o)}Ze(1017206,5,1,a);r=p;return}function cd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,n=0,o=0;l=r;r=r+48|0;j=l+40|0;g=l+16|0;h=l+8|0;d=l;f=c+20|0;k[d>>2]=k[f>>2];He(a,1017212,d);d=k[f>>2]|0;if((d|0)>=0){e=0;while(1){if(!((e|0)>50&(e|0)<(d+-1|0))){o=m[c+24056+(e<<3)>>1]|0;n=i[1017266+(m[c+24056+(e<<3)+2>>1]|0)>>0]|0;d=k[c+24056+(e<<3)+4>>2]|0;qc(b+o|0,6);k[g>>2]=e;k[g+4>>2]=o;k[g+8>>2]=n;k[g+12>>2]=d;k[g+16>>2]=1097792;He(a,1017271,g);d=k[f>>2]|0}if((e|0)<(d|0))e=e+1|0;else break}}Ze(1017206,5,1,a);e=c+24|0;k[h>>2]=k[e>>2];He(a,1017242,h);if((k[e>>2]|0)>=0){d=0;while(1){o=k[c+56064+(d<<2)>>2]|0;k[j>>2]=d;k[j+4>>2]=o;He(a,1017294,j);if((d|0)<(k[e>>2]|0))d=d+1|0;else break}}Ze(1017206,5,1,a);r=l;return}function dd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0,n=0,o=0,p=0;c=r;r=r+48|0;d=c;p=m[b>>1]|0;o=m[b+2>>1]|0;n=Gc(m[b+4>>1]|0)|0;l=m[b+8>>1]|0;i=Gc(m[b+6>>1]|0)|0;h=m[b+10>>1]|0;g=m[b+12>>1]|0;f=m[b+14>>1]|0;e=Dc(m[b+16>>1]|0)|0;b=j[b+18>>1]|0;k[d>>2]=p;k[d+4>>2]=o;k[d+8>>2]=n;k[d+12>>2]=l;k[d+16>>2]=i;k[d+20>>2]=h;k[d+24>>2]=g;k[d+28>>2]=f;k[d+32>>2]=e;k[d+36>>2]=b&255;k[d+40>>2]=(b&65535)>>>8&65535;He(a,1017302,d);r=c;return}function ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=r;r=r+16|0;d=e+8|0;c=e;k[c>>2]=k[b>>2];He(a,1017351,c);Ze(1017382,101,1,a);if((k[b>>2]|0)>=0){c=0;while(1){k[d>>2]=c;He(a,1017484,d);dd(a,b+4+(c*20|0)|0);if((c|0)<(k[b>>2]|0))c=c+1|0;else break}}Ze(1017206,5,1,a);r=e;return}function fd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=k[a+140>>2]|0;if(b){t=k[d+4>>2]|0;r=0;s=t;b=d+8|0;d=d+12|0}else{r=1;s=k[d+16>>2]|0;t=k[d+20>>2]|0;b=d+24|0;d=d+28|0}e=k[b>>2]|0;b=k[d>>2]|0;o=c+8|0;d=k[o>>2]|0;p=k[c+12>>2]|0;q=k[c+16>>2]|0;j[c+24056>>1]=k[c+28>>2];j[c+24058>>1]=r;n=rb(Ic(k[a+8>>2]|0)|0,1)|0;k[c+24060>>2]=n;if((q|0)>0|((p|0)>0|(d|0)>0)){n=b+4|0;m=e+4|0;g=0;i=0;l=0;b=1;while(1){h=k[c+32+(g<<3)>>2]|0;f=k[c+8040+(i<<3)>>2]|0;a=k[c+16048+(l<<3)>>2]|0;do if((i|0)>=(p|0)|(f|0)>(h|0)|(f|0)>(a|0)){if(!((a|0)>(f|0)|((l|0)>=(q|0)|(a|0)>(h|0)))){f=l+1|0;e=k[(k[n>>2]|0)+(k[c+16048+(l<<3)+4>>2]<<2)>>2]|0;if(!e){a=i;e=f;break}j[c+24056+(b<<3)>>1]=a;j[c+24056+(b<<3)+2>>1]=3;k[c+24056+(b<<3)+4>>2]=e;a=i;e=f;b=b+1|0;break}f=k[c+32+(g<<3)+4>>2]|0;a=f&2147483647;f=(f|0)<0?t:s;g=g+1|0;e=k[f+8>>2]|0;if((a|0)<(e|0)){e=k[(k[f+4>>2]|0)+(a<<2)>>2]|0;if(!e){a=i;e=l;break}j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=e;a=i;e=l;b=b+1|0;break}a=a-e+a|0;f=k[f+4>>2]|0;e=k[f+(a<<2)>>2]|0;a=k[f+(a+1<<2)>>2]|0;if(e){j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=e;b=b+1|0}if(!a){a=i;e=l}else{j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=a;a=i;e=l;b=b+1|0}}else{a=i+1|0;e=k[(k[m>>2]|0)+(k[c+8040+(i<<3)+4>>2]<<2)>>2]|0;if(!e)e=l;else{j[c+24056+(b<<3)>>1]=f;j[c+24056+(b<<3)+2>>1]=2;k[c+24056+(b<<3)+4>>2]=e;e=l;b=b+1|0}}while(0);if((e|0)<(q|0)|((a|0)<(p|0)|(g|0)<(d|0))){i=a;l=e}else break}d=k[o>>2]|0}else b=1;k[c+20>>2]=b;j[c+24056+(b<<3)>>1]=k[c+32+(d<<3)>>2];k[c+24056+(b<<3)+4>>2]=0;return}function gd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0;o=b&1^1;i=b?50:20;j=c+20|0;e=k[j>>2]|0;b=k[c+8>>2]|0;if((b|0)>0){l=(i>>>1)+i|0;n=i<<1;h=b;f=0;d=0;b=a;do{if((h|0)>=(l|0))if((h|0)<(n|0))g=h+1>>1;else g=i;else g=h;k[c+56064+(d<<2)>>2]=f;k[c+56268+(d<<2)>>2]=b;d=d+1|0;if((f|0)<(e|0)&(g|0)>0){a=0;b=f;do{a=((m[c+24056+(b<<3)+2>>1]|0|0)==(o|0)&1)+a|0;b=b+1|0}while((b|0)<(e|0)&(a|0)<(g|0));f=b}b=m[c+24056+(f<<3)>>1]|0;h=h-g|0}while((h|0)>0);e=k[j>>2]|0}else{k[c+56064>>2]=0;k[c+56268>>2]=m[c+24056>>1];d=1;b=a}k[c+24>>2]=d;k[c+56064+(d<<2)>>2]=e;k[c+56268+(d<<2)>>2]=b;return}function hd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=r;r=r+1056|0;h=j+24|0;g=c+7|0;if(i[g>>0]|0){Ze(1017490,12,1,k[c>>2]|0);bd(k[c>>2]|0,k[a>>2]|0,f)}fd(c,e,f);gd(b,e,f);if(i[g>>0]|0){Ze(1017503,9,1,k[c>>2]|0);cd(k[c>>2]|0,k[a>>2]|0,f)}k[h>>2]=0;$c(k[a+12>>2]|0,f,c,h,j);if(i[g>>0]|0)ed(k[c>>2]|0,h);ad(h,d);r=j;return}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;sd(d,(Ic(b)|0)&65535,a,a,100);k[c+12>>2]=26;return}function jd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;p=r;r=r+16|0;o=p;d=pe(56472)|0;k[d+4>>2]=1e3;l=d+8|0;k[d+8040>>2]=0;k[d+8044>>2]=0;k[d+16048>>2]=0;k[d+16052>>2]=0;j[d+24056>>1]=0;k[d+24060>>2]=0;k[d+56064>>2]=0;k[d+56268>>2]=0;k[l>>2]=0;k[l+4>>2]=0;k[l+8>>2]=0;k[l+12>>2]=0;k[l+16>>2]=0;k[l+20>>2]=0;k[l+24>>2]=0;k[l+28>>2]=0;k[d>>2]=k[a+12>>2];e=b+12|0;k[e>>2]=26;k[b+136>>2]=0;f=d+28|0;k[f>>2]=1;g=k[a+4>>2]|0;if((g|0)>1){h=b+7|0;n=b+140|0;m=1;do{if(i[h>>0]|0){q=k[b>>2]|0;k[o>>2]=m;k[o+4>>2]=g;He(q,1017513,o)}q=m;m=lb(k[a>>2]|0,m,g,k[k[n>>2]>>2]|0,d)|0;s=k[n>>2]|0;mb(k[a>>2]|0,q,m,k[s+8>>2]|0,k[s+12>>2]|0,d);hd(a,q,b,c,1,d);k[l>>2]=0;k[l+4>>2]=0;k[l+8>>2]=0;k[l+12>>2]=0;k[l+16>>2]=0;k[f>>2]=m}while((m|0)<(g|0))}Xd(d);k[e>>2]=26;r=p;return}function kd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0;d=pe(56472)|0;k[d+4>>2]=1e3;g=d+8|0;k[d+8040>>2]=0;k[d+8044>>2]=0;k[d+16048>>2]=0;k[d+16052>>2]=0;j[d+24056>>1]=0;k[d+24060>>2]=0;k[d+56064>>2]=0;k[d+56268>>2]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;k[g+20>>2]=0;k[g+24>>2]=0;k[g+28>>2]=0;k[d>>2]=k[a+12>>2];k[b+12>>2]=26;k[b+136>>2]=0;e=d+28|0;k[e>>2]=1;f=k[a+4>>2]|0;if((f|0)>1){i=b+140|0;h=1;do{m=k[i>>2]|0;l=h;h=nb(k[a>>2]|0,h,f,k[m+16>>2]|0,k[m+20>>2]|0,d)|0;m=k[i>>2]|0;ob(k[a>>2]|0,l,h,k[m+24>>2]|0,k[m+28>>2]|0,d);hd(a,l,b,c,0,d);k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;k[e>>2]=h}while((h|0)<(f|0))}Xd(d);return}function ld(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0;g=r;r=r+32|0;f=g+16|0;e=g;d=g+20|0;if(!(i[b+7>>0]|0))d=a+12|0;else{l=k[b>>2]|0;h=a+12|0;n=Dc(k[h>>2]|0)|0;j=a+4|0;m=k[j>>2]|0;k[e>>2]=n;k[e+4>>2]=m;He(l,1017545,e);ef(e,k[a>>2]|0,k[j>>2]|0);j=k[b>>2]|0;oc(d);k[f>>2]=(i[d>>0]&1)==0?d+1|0:k[d+8>>2]|0;He(j,1017576,f);ff(d);Ze(1017206,5,1,k[b>>2]|0);ff(e);d=h}k[b+12>>2]=26;k[b+136>>2]=0;n=Ec(k[d>>2]|0)|0;switch(((n|0)!=3&(i[b+4>>0]|0)!=0?2:n)|0){case 1:case 0:{id(k[a+4>>2]|0,k[a+12>>2]|0,b,c);break}case 3:{jd(a,b,c);break}case 2:{kd(a,b,c);break}default:{}}r=g;return}function md(a){a=a|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;return}function nd(a){a=a|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;return}function od(a){a=a|0;a=a+12|0;k[a>>2]=(k[a>>2]|0)+1;return}function pd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;b=b&255;d=b>>>2;e=sf(1,0,d|0)|0;f=L;h=a;g=k[h>>2]|0;h=k[h+4>>2]|0;if((g&e|0)==0&(h&f|0)==0){d=a+16+(d<<3)|0;k[d>>2]=0;k[d+4>>2]=0;d=a;k[d>>2]=g|e;k[d+4>>2]=h|f}a=a+16+(b<<1)|0;j[a>>1]=(m[a>>1]|0)+c;return}function qd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0,p=0,q=0;q=r;r=r+16|0;p=q;k[b>>2]=-1;n=b+4|0;k[n>>2]=-1;o=b+8|0;k[o>>2]=-1;k[p>>2]=-1;k[p+4>>2]=-1;k[p+8>>2]=-1;d=a;c=k[d>>2]|0;d=k[d+4>>2]|0;if(!((c|0)==0&(d|0)==0)){i=a+16|0;j=p+8|0;l=p+4|0;g=0;while(1){if(!((c&1|0)==0&0==0)){h=0;do{e=h+g|0;f=m[i+(e<<1)>>1]|0;if((f|0)>(k[j>>2]|0)){a=k[l>>2]|0;if((f|0)>(a|0)){k[j>>2]=a;k[o>>2]=k[n>>2];a=k[p>>2]|0;if((f|0)>(a|0)){k[l>>2]=a;k[n>>2]=k[b>>2];a=0}else a=1}else a=2;k[p+(a<<2)>>2]=f;k[b+(a<<2)>>2]=e}h=h+1|0}while((h|0)!=4)}c=uf(c|0,d|0,1)|0;d=L;if((c|0)==0&(d|0)==0)break;else g=g+4|0}}r=q;return}function rd(a){a=a|0;var b=0;b=a+536|0;k[b>>2]=0;k[b+4>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0;k[b+16>>2]=0;k[b+20>>2]=0;k[b+24>>2]=0;k[b+28>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;k[a+16>>2]=0;k[a+20>>2]=0;a=a+568|0;b=a+48|0;do{k[a>>2]=-1;a=a+4|0}while((a|0)<(b|0));return}function sd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,l=0,m=0;k[a>>2]=(k[a>>2]|0)+1;g=b&65535;l=g&15;m=j[a+568+(l<<1)>>1]|0;do if(m<<16>>16==b<<16>>16){b=a+616+(l<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(l<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(l<<2)|0;k[a>>2]=(k[a>>2]|0)+d}else{f=l^8;i=j[a+568+(f<<1)>>1]|0;if(i<<16>>16==b<<16>>16){b=a+616+(f<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(f<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(f<<2)|0;k[a>>2]=(k[a>>2]|0)+d;break}g=g&7|16;h=j[a+568+(g<<1)>>1]|0;if(h<<16>>16==b<<16>>16){b=a+616+(g<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(g<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(g<<2)|0;k[a>>2]=(k[a>>2]|0)+d;break}if(m<<16>>16!=-1){if(i<<16>>16!=-1)if(h<<16>>16==-1)f=g;else{f=(k[a+616+(f<<2)>>2]|0)<(k[a+616+(l<<2)>>2]|0)?f:l;f=(k[a+616+(g<<2)>>2]|0)<(k[a+616+(f<<2)>>2]|0)?g:f}}else f=l;j[a+568+(f<<1)>>1]=b;k[a+616+(f<<2)>>2]=c;k[a+712+(f<<2)>>2]=d;d=ha(e,c)|0;k[a+808+(f<<2)>>2]=d}while(0);return}function td(a,b){a=a|0;b=b|0;var c=0,d=0;a:do if(!(k[a+4>>2]|0)){d=b&65535;c=d&15;if((j[a+568+(c<<1)>>1]|0)!=b<<16>>16){c=c^8;if((j[a+568+(c<<1)>>1]|0)!=b<<16>>16){c=d&7|16;c=(j[a+568+(c<<1)>>1]|0)==b<<16>>16?c:-1}}}else{c=0;while(1){if((j[a+568+(c<<1)>>1]|0)==b<<16>>16)break a;c=c+1|0;if((c|0)>=24){c=-1;break}}}while(0);return c|0}function ud(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0;l=0;while(1){g=a+568+(l<<1)|0;if((j[g>>1]|0)==-1)k[a+616+(l<<2)>>2]=-1;b=l;l=l+1|0;if((l|0)>=24)continue;h=a+616+(b<<2)|0;i=a+712+(b<<2)|0;e=a+808+(b<<2)|0;f=l;do{b=a+568+(f<<1)|0;c=a+616+(f<<2)|0;if((j[b>>1]|0)==-1){k[c>>2]=-1;d=-1}else d=k[c>>2]|0;if((k[h>>2]|0)<(d|0)){d=j[g>>1]|0;j[g>>1]=j[b>>1]|0;j[b>>1]=d;d=k[h>>2]|0;k[h>>2]=k[c>>2];k[c>>2]=d;d=k[i>>2]|0;c=a+712+(f<<2)|0;k[i>>2]=k[c>>2];k[c>>2]=d;c=k[e>>2]|0;d=a+808+(f<<2)|0;k[e>>2]=k[d>>2];k[d>>2]=c}f=f+1|0}while((f|0)!=24);if((l|0)==3)break}k[a+4>>2]=1;return}function vd(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=r;r=r+32|0;e=f+8|0;d=f;Ze(1017581,14,1,941120);c=0;do{b=j[a+568+(c<<1)>>1]|0;if(b<<16>>16!=-1){i=Gc(b&65535)|0;h=k[a+616+(c<<2)>>2]|0;g=k[a+712+(c<<2)>>2]|0;b=k[a+808+(c<<2)>>2]|0;k[e>>2]=c;k[e+4>>2]=i;k[e+8>>2]=h;k[e+12>>2]=g;k[e+16>>2]=b;He(941120,1017620,e)}c=c+1|0}while((c|0)!=24);k[d>>2]=k[a>>2];He(941120,1017596,d);r=f;return}function wd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=k[c>>2]|0;do if((e|0)>=1){f=k[b>>2]|0;g=(k[a+32>>2]|0)+(k[a>>2]|0)|0;d=k[a+16>>2]|0;h=i[f>>0]|0;a=h&255;if(h<<24>>24>-1){a=i[g+a>>0]|0;k[b>>2]=f+1;k[c>>2]=e+-1;break}if((e|0)>1&(a&224|0)==192){a=i[g+(l[g+a>>0]<>0]|0)>>0]|0;k[b>>2]=f+2;k[c>>2]=e+-2;break}if((e|0)>2&(a&240|0)==224){a=g+(l[g+a>>0]<>0]|0)>>0]<>0]|0)>>0]|0;k[b>>2]=f+3;k[c>>2]=e+-3;break}if((a&248|0)==240&(e|0)>3){a=g+(l[g+(l[g+a>>0]<>0]|0)>>0]<>0]|0)>>0]<>0]|0)>>0]|0;k[b>>2]=f+4;k[c>>2]=e+-4;break}else{k[b>>2]=f+1;k[c>>2]=e+-1;a=0;break}}else a=0;while(0);return a|0}function xd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=k[b>>2]|0;do if((c|0)>=1){d=k[a>>2]|0;f=i[d>>0]|0;e=f&255;if(f<<24>>24>-1){f=j[942368+(e<<1)>>1]|0;k[a>>2]=d+1;k[b>>2]=c+-1;c=f&255;break}if((c|0)>1&(e&224|0)==192){f=j[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0;k[a>>2]=d+2;k[b>>2]=c+-2;c=f&255;break}if((c|0)>2&(e&240|0)==224){f=j[942368+((m[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+2>>0]|0)<<1)>>1]|0;k[a>>2]=d+3;k[b>>2]=c+-3;c=f&255;break}if((e&248|0)==240&(c|0)>3){f=j[942368+((m[942368+((m[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+2>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+3>>0]|0)<<1)>>1]|0;k[a>>2]=d+4;k[b>>2]=c+-4;c=f&255;break}else{k[a>>2]=d+1;k[b>>2]=c+-1;c=0;break}}else c=0;while(0);return c|0}function yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0;h=a+b|0;j=h+-7|0;k[c>>2]=0;if(b|0){b=a;a:do{b:do if(b>>>0>>0){g=b;while(1){d=k[g>>2]|0;b=g+4|0;e=k[b>>2]|0;f=g+8|0;if((d+-656877351|d+1145324612|e+-656877351|e+1145324612)&-2139062144|0){if((i[1008008+(l[g+1>>0]|0)>>0]|i[1008008+(d&255)>>0]|i[1008008+(l[g+2>>0]|0)>>0]|i[1008008+(l[g+3>>0]|0)>>0])<<24>>24){b=g;break b}if((i[1008008+(l[g+5>>0]|0)>>0]|i[1008008+(e&255)>>0]|i[1008008+(l[g+6>>0]|0)>>0]|i[1008008+(l[g+7>>0]|0)>>0])<<24>>24)break b}if(f>>>0>>0)g=f;else{b=f;break}}}while(0);if(b>>>0>>0)d=993864;else{d=993864;m=13;break}while(1){f=i[d+(l[b>>0]|0)>>0]|0;e=b+1|0;if((f&255)>239)break;b=993864+((f&255)<<6)|0;if(e>>>0>>0){d=b;b=e}else{d=b;b=e;m=13;break a}}c:do if((d-993864|0)>>>0>=64)do{b=b+-1|0;if(b>>>0<=a>>>0)break c}while((i[b>>0]&-64)<<24>>24==-128);while(0)}while(f<<24>>24==-3);d:do if((m|0)==13)if((d-993864|0)>>>0>=64)do{b=b+-1|0;if(b>>>0<=a>>>0)break d}while((i[b>>0]&-64)<<24>>24==-128);while(0);k[c>>2]=b-a}return}function zd(a,b,c,d,e,f,g,h,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;H=(j|0)==0;I=(j|0)!=0;E=0;F=0;G=0;while(1){C=a;x=a+b|0;D=c;y=c+d|0;z=x;if((d|0)<(b|0))if(H){r=239;q=0;o=0;n=0}else{Vc(j,0);r=239;q=0;o=0;n=0}else{A=1009832;u=0;B=a;p=D;r=0;o=C;n=0;a:while(1){s=o;if(s>>>0>>0){q=i[s>>0]|0;w=i[A+(q&255)>>0]|0;r=w&255;i[p>>0]=q;o=s+1|0;p=p+1|0;if((w&255)>239)w=q;else{w=B;A=1009832+(r<<6)|0;u=q;B=w;continue}}else w=u;if((r|0)<=239){J=43;break}b:do switch(r|0){case 247:{if(H)q=B;else{Vc(j,-2-B+o|0);Xc(j,2);q=o}i[p+-3>>0]=i[A+((w&255)+64)>>0]|0;A=1009832;u=0;B=q;p=p+-2|0;r=0;n=n+1|0;continue a}case 248:{if(H)q=B;else{Vc(j,o+~B|0);Xc(j,1);q=o}u=w&255;i[p+-3>>0]=i[A+(u+128)>>0]|0;i[p+-2>>0]=i[A+(u+64)>>0]|0;A=1009832;u=0;B=q;p=p+-1|0;r=0;n=n+1|0;continue a}case 246:{if(H)q=B;else{Vc(j,o+~B|0);Xc(j,1);q=o}i[p+-2>>0]=i[A+((w&255)+64)>>0]|0;A=1009832;u=0;B=q;p=p+-1|0;r=0;n=n+1|0;continue a}case 245:{q=w&255;r=p;i[r+-3>>0]=i[A+(q+192)>>0]|0;J=23;break}case 244:{q=w&255;r=p;J=23;break}case 243:{q=w&255;r=p;J=24;break}case 251:{i[p+-1>>0]=i[A+(w&255|256)>>0]|0;w=B;A=1009832;u=0;r=0;n=n+1|0;B=w;continue a}case 250:{q=A;r=w&255;if((q-1009832|0)>>>0<320){r=l[A+(r|512)>>0]<<8;break b}else{r=l[A+(r+128)>>0]<<8;J=29;break b}}case 249:case 252:{r=0;J=29;break}default:{J=10;break a}}while(0);if((J|0)==23){i[r+-2>>0]=i[A+(q+128)>>0]|0;J=24}else if((J|0)==29){J=0;q=A}if((J|0)==24){J=0;i[r+-1>>0]=i[A+(q+64)>>0]|0;w=B;A=1009832;u=0;r=0;n=n+1|0;B=w;continue}s=w&255;r=l[A+((q-1009832|0)>>>0<320?s|256:s+64|0)>>0]|r;s=974880+(r<<2)|0;v=l[s>>0]&127;q=l[974880+(r<<2)+1>>0]|0;if(!((q&128|0)==0|e)){s=r+1|0;q=l[974880+(s<<2)+1>>0]|0;s=974880+(s<<2)|0}u=q&127;r=m[s+2>>1]|0;q=p+(0-v)|0;t=q+u|0;if((y-t|0)<(z-o|0)){r=239;J=39;break}vf(q|0,1016936+r|0,u|0)|0;n=n+1|0;do if(!H){if(u>>>0>v>>>0){Vc(j,o-B|0);Wc(j,u-v|0);p=o;break}if(u>>>0>>0){Vc(j,o-B-v+u|0);Xc(j,v-u|0);p=o}else p=B}else p=B;while(0);if((i[s>>0]|0)>=0){A=1009832;u=0;B=p;p=t;r=0;continue}r=l[1016936+(r+u)>>0]|0;A=1009832+(r<<6)|0;u=w;B=p;p=t}c:do if((J|0)==10)J=39;else if((J|0)==43){J=0;if((A-1009832|0)>>>0<320)r=241;else while(1){q=o+-1|0;o=q;p=p+-1|0;if(q>>>0<=a>>>0){r=240;break c}if((i[q>>0]&-64)<<24>>24!=-128){r=240;break}}}while(0);d:do if((J|0)==39){J=0;o=o+-1|0;p=p+-1|0;if((A-1009832|0)>>>0>=320)do{q=o+-1|0;o=q;p=p+-1|0;if(q>>>0<=a>>>0)break d}while((i[q>>0]&-64)<<24>>24==-128)}while(0);if(I&o>>>0>B>>>0)Vc(j,o-B|0);q=o-C|0;o=p-D|0}F=q+F|0;G=o+G|0;E=n+E|0;if((r|0)!=253)break;else{a=a+q|0;b=b-q|0;c=c+o|0;d=d-o|0}}k[f>>2]=F;k[g>>2]=G;k[h>>2]=E;return}function Ad(a){a=a|0;if(a|0)Xd(a);return}function Bd(a){a=a|0;return Gc(k[a>>2]|0)|0}function Cd(a){a=a|0;return i[a+4>>0]|0}function Dd(a){a=a|0;if(a|0){Ed(a);Xd(a)}return}function Ed(a){a=a|0;var b=0;b=k[a+4>>2]|0;if(b|0)Xd(b);b=k[a+8>>2]|0;if(b|0)Xd(b);b=k[a+12>>2]|0;if(b|0)Xd(b);return}function Fd(a,b,c){a=a|0;b=b|0;c=c|0;return Gd(b,c)|0}function Gd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=r;r=r+32|0;e=c+16|0;d=c+4|0;f=c+28|0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=0;i[f>>0]=0;a=yb(a,Ve(a)|0,b,e,d,c,f)|0;b=pe(20)|0;Hd(b,(i[f>>0]|0)!=0,a,e,d);r=c;return b|0}function Hd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;k[a>>2]=c;i[a+16>>0]=b&1;b=pe(8)|0;c=k[e>>2]&255;k[b>>2]=k[d>>2];i[b+4>>0]=c;k[a+4>>2]=b;b=pe(8)|0;c=k[e+4>>2]&255;k[b>>2]=k[d+4>>2];i[b+4>>0]=c;k[a+8>>2]=b;b=pe(8)|0;e=k[e+8>>2]&255;k[b>>2]=k[d+8>>2];i[b+4>>0]=e;k[a+12>>2]=b;return}function Id(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Jd(b,c,d,e,f)|0}function Jd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0;f=r;r=r+80|0;l=f+56|0;h=f+40|0;g=f+28|0;j=f+72|0;k[l>>2]=e;k[l+4>>2]=c;k[l+8>>2]=d;k[l+12>>2]=26;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;i[j>>0]=0;e=zb(a,Ve(a)|0,b,l,h,g,f,f+24|0,j)|0;c=pe(20)|0;Hd(c,(i[j>>0]|0)!=0,e,h,g);r=f;return c|0}function Kd(a){a=a|0;return (i[a+16>>0]|0)!=0|0}function Ld(a){a=a|0;return Gc(k[a>>2]|0)|0}function Md(a,b){a=a|0;b=b|0;if(b>>>0>=3)Ma(0,b|0,3)|0;return k[a+4+(b<<2)>>2]|0}function Nd(a){a=a|0;if(a|0)Xd(a);return}function Od(a){a=a|0;return Gc(k[a>>2]|0)|0}function Pd(a){a=a|0;if(a|0)Xd(a);return}function Qd(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Rd()|0;if(a|0?(d=k[a>>2]|0,d|0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=1094380;Ud(1094475,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(_d(8,d,e)|0){h=k[e>>2]|0;h=Za[k[(k[h>>2]|0)+8>>2]&3](h)|0;k[f>>2]=1094380;k[f+4>>2]=a;k[f+8>>2]=h;Ud(1094389,f)}else{k[h>>2]=1094380;k[h+4>>2]=a;Ud(1094434,h)}}Ud(1094513,g)}function Rd(){var a=0,b=0;a=r;r=r+16|0;if(!(Ja(1097276,2)|0)){b=Ha(k[274320]|0)|0;r=a;return b|0}else Ud(1094201,a);return 0}function Sd(){var a=0;a=r;r=r+16|0;if(!(Ka(1097280,8)|0)){r=a;return}else Ud(1094151,a)}function Td(a){a=a|0;var b=0;b=r;r=r+16|0;df(a);if(!(Na(k[274320]|0,0)|0)){r=b;return}else Ud(1094098,b)}function Ud(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;Ie(941120,a,c)|0;Ye();ua()}function Vd(a){a=a|0;return}function Wd(a){a=a|0;Xd(a);return}function Xd(a){a=a|0;df(a);return}function Yd(a){a=a|0;return}function Zd(a){a=a|0;return}function _d(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=$d(b,16)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;ab[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function $d(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+64|0;q=s;p=k[a>>2]|0;o=a+(k[p+-8>>2]|0)|0;p=k[p+-4>>2]|0;k[q>>2]=b;k[q+4>>2]=a;k[q+8>>2]=48;h=q+12|0;l=q+16|0;a=q+20|0;c=q+24|0;d=q+28|0;e=q+32|0;f=q+40|0;g=(p|0)==(b|0);m=h;n=m+40|0;do{k[m>>2]=0;m=m+4|0}while((m|0)<(n|0));j[h+40>>1]=0;i[h+42>>0]=0;a:do if(g){k[q+48>>2]=1;$a[k[(k[b>>2]|0)+20>>2]&3](b,q,o,o,1,0);a=(k[c>>2]|0)==1?o:0}else{Xa[k[(k[p>>2]|0)+24>>2]&3](p,q,o,1,0);switch(k[q+36>>2]|0){case 0:{a=(k[f>>2]|0)==1&(k[d>>2]|0)==1&(k[e>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{a=0;break a}}if((k[c>>2]|0)!=1?!((k[f>>2]|0)==0&(k[d>>2]|0)==1&(k[e>>2]|0)==1):0){a=0;break}a=k[l>>2]|0}while(0);r=s;return a|0}function ae(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))be(b,c,d,e);else{a=k[a+8>>2]|0;$a[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;i[a+53>>0]=1;do if((k[a+4>>2]|0)==(c|0)){i[a+52>>0]=1;c=a+16|0;e=k[c>>2]|0;if(!e){k[c>>2]=b;k[a+24>>2]=d;k[a+36>>2]=1;if(!((d|0)==1?(k[a+48>>2]|0)==1:0))break;i[a+54>>0]=1;break}if((e|0)!=(b|0)){d=a+36|0;k[d>>2]=(k[d>>2]|0)+1;i[a+54>>0]=1;break}e=a+24|0;c=k[e>>2]|0;if((c|0)==2){k[e>>2]=d;c=d}if((c|0)==1?(k[a+48>>2]|0)==1:0)i[a+54>>0]=1}while(0);return}function ce(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Xa[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(h=b+20|0,(k[h>>2]|0)!=(c|0)):0){k[b+32>>2]=d;g=b+44|0;if((k[g>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;d=b+53|0;i[d>>0]=0;a=k[a+8>>2]|0;$a[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[d>>0]|0)if(!(i[f>>0]|0)){f=1;d=13}else d=17;else{f=0;d=13}do if((d|0)==13){k[h>>2]=c;c=b+40|0;k[c>>2]=(k[c>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f){d=17;break}else{f=4;break}}if(f)d=17;else f=4}while(0);if((d|0)==17)f=3;k[g>>2]=f;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))ee(b,c,d);else{a=k[a+8>>2]|0;ab[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+16|0;e=k[d>>2]|0;do if(e){if((e|0)!=(b|0)){c=a+36|0;k[c>>2]=(k[c>>2]|0)+1;k[a+24>>2]=2;i[a+54>>0]=1;break}d=a+24|0;if((k[d>>2]|0)==2)k[d>>2]=c}else{k[d>>2]=b;k[a+24>>2]=c;k[a+36>>2]=1}while(0);return}function fe(a){a=a|0;Xd(a);return}function ge(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))be(b,c,d,e);return}function he(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function ie(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))ee(b,c,d);return}function je(){var a=0,b=0,c=0,d=0;c=r;r=r+16|0;d=c+8|0;a=Rd()|0;if((a|0?(b=k[a>>2]|0,b|0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0){_a[k[b+12>>2]&3]();Ud(1094525,c)}c=k[235254]|0;k[235254]=c+0;_a[c&3]();Ud(1094525,d)}function ke(a){a=a|0;return}function le(a){a=a|0;Xd(a);return}function me(a){a=a|0;return 1094578}function ne(){xa(1094684,1094713,1175,1094762)}function oe(){xa(1094783,1094713,1164,1094663)}function pe(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){c=cf(b)|0;if(c|0){a=6;break}a=qe()|0;if(!a){a=5;break}_a[a&3]()}if((a|0)==5){c=ya(4)|0;k[c>>2]=941108;Oa(c|0,72,6)}else if((a|0)==6)return c|0;return 0}function qe(){var a=0;a=k[274321]|0;k[274321]=a+0;return a|0}function re(a){a=a|0;return pe(a)|0}function se(a){a=a|0;Xd(a);return}function te(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Wa[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function ue(a){a=a|0;if(!a)a=0;else a=($d(a,104)|0)!=0;return a&1|0}function ve(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=we(Pa(6,c|0)|0)|0;r=b;return a|0}function we(a){a=a|0;var b=0;if(a>>>0>4294963200){b=xe()|0;k[b>>2]=0-a;a=-1}return a|0}function xe(){var a=0;if(!0)a=1097288;else{a=(Ia()|0)+64|0;a=k[a>>2]|0}return a|0}function ye(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((we(Sa(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function ze(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;i=p+32|0;n=a+28|0;g=k[n>>2]|0;k[i>>2]=g;o=a+20|0;g=(k[o>>2]|0)-g|0;k[i+4>>2]=g;k[i+8>>2]=b;k[i+12>>2]=c;h=a+60|0;j=a+44|0;e=2;b=g+c|0;while(1){if(!0){k[m>>2]=k[h>>2];k[m+4>>2]=i;k[m+8>>2]=e;f=we(Ta(146,m|0)|0)|0}else{Qa(9,a|0);k[l>>2]=k[h>>2];k[l+4>>2]=i;k[l+8>>2]=e;f=we(Ta(146,l|0)|0)|0;ta(0)}if((b|0)==(f|0)){b=6;break}if((f|0)<0){b=8;break}b=b-f|0;d=k[i+4>>2]|0;if(f>>>0<=d>>>0)if((e|0)==2){k[n>>2]=(k[n>>2]|0)+f;g=d;d=i;e=2}else{g=d;d=i}else{g=k[j>>2]|0;k[n>>2]=g;k[o>>2]=g;g=k[i+12>>2]|0;f=f-d|0;d=i+8|0;e=e+-1|0}k[d>>2]=(k[d>>2]|0)+f;k[d+4>>2]=g-f;i=d}if((b|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((b|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((e|0)==2)c=0;else c=c-(k[i+4>>2]|0)|0}r=p;return c|0}function Ae(a){a=a|0;return}function Be(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Ce(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Wa[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function Ce(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function De(a,b){a=a|0;b=b|0;if(!a)a=0;else a=Ee(a,b)|0;return a|0}function Ee(a,b){a=a|0;b=b|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=xe()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function Fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Ce(c)|0)){e=k[d>>2]|0;f=5}else d=0;else f=5;a:do if((f|0)==5){g=c+20|0;d=k[g>>2]|0;f=d;if((e-d|0)>>>0>>0){d=Wa[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Wa[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);vf(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function Ge(){return 0}function He(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;Ie(a,b,e)|0;r=d;return}function Ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+224|0;m=q+120|0;p=q+80|0;o=q;n=q+136|0;d=p;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[m>>2]=k[c>>2];if((Je(0,b,m,o,p)|0)<0)c=-1;else{c=k[a>>2]|0;l=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;j=a+48|0;if(!(k[j>>2]|0)){d=a+44|0;e=k[d>>2]|0;k[d>>2]=n;f=a+28|0;k[f>>2]=n;g=a+20|0;k[g>>2]=n;k[j>>2]=80;h=a+16|0;k[h>>2]=n+80;c=Je(a,b,m,o,p)|0;if(e){Wa[k[a+36>>2]&7](a,0,0)|0;c=(k[g>>2]|0)==0?-1:c;k[d>>2]=e;k[j>>2]=0;k[h>>2]=0;k[f>>2]=0;k[g>>2]=0}}else c=Je(a,b,m,o,p)|0;p=k[a>>2]|0;k[a>>2]=p|l;c=(p&32|0)==0?c:-1}r=q;return c|0}function Je(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0.0,n=0,o=0,q=0,s=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0;ia=r;r=r+624|0;ca=ia+24|0;ea=ia+16|0;da=ia+588|0;$=ia+576|0;ba=ia;W=ia+536|0;ga=ia+8|0;fa=ia+528|0;M=(a|0)!=0;N=W+40|0;V=N;W=W+39|0;X=ga+4|0;Y=da;Z=0-Y|0;_=$+12|0;$=$+11|0;aa=_;O=aa-Y|0;P=-2-Y|0;Q=aa+2|0;R=ca+288|0;S=da+9|0;T=S;U=da+8|0;f=0;g=0;o=0;x=b;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=xe()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);b=i[x>>0]|0;if(!(b<<24>>24)){K=244;break}else g=x;b:while(1){switch(b<<24>>24){case 37:{b=g;K=9;break b}case 0:{b=g;break b}default:{}}J=g+1|0;b=i[J>>0]|0;g=J}c:do if((K|0)==9)while(1){K=0;if((i[b+1>>0]|0)!=37)break c;g=g+1|0;b=b+2|0;if((i[b>>0]|0)==37)K=9;else break}while(0);v=g-x|0;if(M?(k[a>>2]&32|0)==0:0)Fe(x,v,a)|0;if((g|0)!=(x|0)){g=v;x=b;continue}n=b+1|0;g=i[n>>0]|0;h=(g<<24>>24)+-48|0;if(h>>>0<10){J=(i[b+2>>0]|0)==36;n=J?b+3|0:n;g=i[n>>0]|0;s=J?h:-1;o=J?1:o}else s=-1;b=g<<24>>24;d:do if((b&-32|0)==32){h=0;do{if(!(1<>24)+-32|h;n=n+1|0;g=i[n>>0]|0;b=g<<24>>24}while((b&-32|0)==32)}else h=0;while(0);do if(g<<24>>24==42){g=n+1|0;b=(i[g>>0]|0)+-48|0;if(b>>>0<10?(i[n+2>>0]|0)==36:0){k[e+(b<<2)>>2]=10;b=1;n=n+3|0;g=k[d+((i[g>>0]|0)+-48<<3)>>2]|0}else{if(o|0){f=-1;break a}if(!M){u=h;J=0;n=g;I=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);J=k[b>>2]|0;k[c>>2]=b+4;b=0;n=g;g=J}if((g|0)<0){u=h|8192;J=b;I=0-g|0}else{u=h;J=b;I=g}}else{b=(g<<24>>24)+-48|0;if(b>>>0<10){g=0;do{g=(g*10|0)+b|0;n=n+1|0;b=(i[n>>0]|0)+-48|0}while(b>>>0<10);if((g|0)<0){f=-1;break a}else{u=h;J=o;I=g}}else{u=h;J=o;I=0}}while(0);e:do if((i[n>>0]|0)==46){b=n+1|0;g=i[b>>0]|0;if(g<<24>>24!=42){h=(g<<24>>24)+-48|0;if(h>>>0<10)g=0;else{o=0;break}while(1){g=(g*10|0)+h|0;b=b+1|0;h=(i[b>>0]|0)+-48|0;if(h>>>0>=10){o=g;break e}}}b=n+2|0;g=(i[b>>0]|0)+-48|0;if(g>>>0<10?(i[n+3>>0]|0)==36:0){k[e+(g<<2)>>2]=10;o=k[d+((i[b>>0]|0)+-48<<3)>>2]|0;b=n+4|0;break}if(J|0){f=-1;break a}if(M){H=(k[c>>2]|0)+(4-1)&~(4-1);o=k[H>>2]|0;k[c>>2]=H+4}else o=0}else{o=-1;b=n}while(0);q=0;while(1){g=(i[b>>0]|0)+-65|0;if(g>>>0>57){f=-1;break a}H=b+1|0;g=i[1094812+(q*58|0)+g>>0]|0;h=g&255;if((h+-1|0)>>>0<8){b=H;q=h}else break}if(!(g<<24>>24)){f=-1;break}n=(s|0)>-1;do if(g<<24>>24==19)if(n){f=-1;break a}else K=52;else{if(n){k[e+(s<<2)>>2]=h;F=d+(s<<3)|0;G=k[F+4>>2]|0;K=ba;k[K>>2]=k[F>>2];k[K+4>>2]=G;K=52;break}if(!M){f=0;break a}Ke(ba,h,c)}while(0);if((K|0)==52?(K=0,!M):0){g=v;o=J;x=H;continue}s=i[b>>0]|0;s=(q|0)!=0&(s&15|0)==3?s&-33:s;h=u&-65537;G=(u&8192|0)==0?u:h;f:do switch(s|0){case 110:switch(q|0){case 0:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 1:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 2:{g=k[ba>>2]|0;k[g>>2]=f;k[g+4>>2]=((f|0)<0)<<31>>31;g=v;o=J;x=H;continue a}case 3:{j[k[ba>>2]>>1]=f;g=v;o=J;x=H;continue a}case 4:{i[k[ba>>2]>>0]=f;g=v;o=J;x=H;continue a}case 6:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 7:{g=k[ba>>2]|0;k[g>>2]=f;k[g+4>>2]=((f|0)<0)<<31>>31;g=v;o=J;x=H;continue a}default:{g=v;o=J;x=H;continue a}}case 112:{q=G|8;o=o>>>0>8?o:8;s=120;K=64;break}case 88:case 120:{q=G;K=64;break}case 111:{h=ba;g=k[h>>2]|0;h=k[h+4>>2]|0;if((g|0)==0&(h|0)==0)b=N;else{b=N;do{b=b+-1|0;i[b>>0]=g&7|48;g=uf(g|0,h|0,3)|0;h=L}while(!((g|0)==0&(h|0)==0))}if(!(G&8)){g=G;q=0;n=1095292;K=77}else{q=V-b|0;g=G;o=(o|0)>(q|0)?o:q+1|0;q=0;n=1095292;K=77}break}case 105:case 100:{g=ba;b=k[g>>2]|0;g=k[g+4>>2]|0;if((g|0)<0){b=qf(0,0,b|0,g|0)|0;g=L;h=ba;k[h>>2]=b;k[h+4>>2]=g;h=1;n=1095292;K=76;break f}if(!(G&2048)){n=G&1;h=n;n=(n|0)==0?1095292:1095294;K=76}else{h=1;n=1095293;K=76}break}case 117:{g=ba;b=k[g>>2]|0;g=k[g+4>>2]|0;h=0;n=1095292;K=76;break}case 99:{i[W>>0]=k[ba>>2];b=W;s=1;v=0;u=1095292;g=N;break}case 109:{g=xe()|0;g=Me(k[g>>2]|0)|0;K=82;break}case 115:{g=k[ba>>2]|0;g=g|0?g:1097194;K=82;break}case 67:{k[ga>>2]=k[ba>>2];k[X>>2]=0;k[ba>>2]=ga;b=ga;o=-1;K=86;break}case 83:{b=k[ba>>2]|0;if(!o){Oe(a,32,I,0,G);b=0;K=97}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{m=+p[ba>>3];k[ea>>2]=0;p[t>>3]=m;if((k[t+4>>2]|0)>=0)if(!(G&2048)){F=G&1;E=F;F=(F|0)==0?1097202:1097207}else{E=1;F=1097204}else{m=-m;E=1;F=1097201}p[t>>3]=m;D=k[t+4>>2]&2146435072;do if(D>>>0<2146435072|(D|0)==2146435072&0<0){w=+Pe(m,ea)*2.0;g=w!=0.0;if(g)k[ea>>2]=(k[ea>>2]|0)+-1;B=s|32;if((B|0)==97){u=s&32;x=(u|0)==0?F:F+9|0;v=E|2;b=12-o|0;do if(!(o>>>0>11|(b|0)==0)){m=8.0;do{b=b+-1|0;m=m*16.0}while((b|0)!=0);if((i[x>>0]|0)==45){m=-(m+(-w-m));break}else{m=w+m-m;break}}else m=w;while(0);g=k[ea>>2]|0;b=(g|0)<0?0-g|0:g;b=Le(b,((b|0)<0)<<31>>31,_)|0;if((b|0)==(_|0)){i[$>>0]=48;b=$}i[b+-1>>0]=(g>>31&2)+43;q=b+-2|0;i[q>>0]=s+15;n=(o|0)<1;h=(G&8|0)==0;g=da;while(1){F=~~m;b=g+1|0;i[g>>0]=l[1095276+F>>0]|u;m=(m-+(F|0))*16.0;do if((b-Y|0)==1){if(h&(n&m==0.0))break;i[b>>0]=46;b=g+2|0}while(0);if(!(m!=0.0))break;else g=b}h=q;o=(o|0)!=0&(P+b|0)<(o|0)?Q+o-h|0:O-h+b|0;n=o+v|0;Oe(a,32,I,n,G);if(!(k[a>>2]&32))Fe(x,v,a)|0;Oe(a,48,I,n,G^65536);g=b-Y|0;if(!(k[a>>2]&32))Fe(da,g,a)|0;b=aa-h|0;Oe(a,48,o-(g+b)|0,0,0);if(!(k[a>>2]&32))Fe(q,b,a)|0;Oe(a,32,I,n,G^8192);b=(n|0)<(I|0)?I:n;break}b=(o|0)<0?6:o;if(g){g=(k[ea>>2]|0)+-28|0;k[ea>>2]=g;m=w*268435456.0}else{m=w;g=k[ea>>2]|0}D=(g|0)<0?ca:R;C=D;h=D;do{A=~~m>>>0;k[h>>2]=A;h=h+4|0;m=(m-+(A>>>0))*1.0e9}while(m!=0.0);g=k[ea>>2]|0;if((g|0)>0){n=D;o=h;while(1){q=(g|0)>29?29:g;g=o+-4|0;do if(g>>>0>=n>>>0){h=0;do{z=sf(k[g>>2]|0,0,q|0)|0;z=tf(z|0,L|0,h|0,0)|0;A=L;y=Ef(z|0,A|0,1e9,0)|0;k[g>>2]=y;h=Df(z|0,A|0,1e9,0)|0;g=g+-4|0}while(g>>>0>=n>>>0);if(!h)break;n=n+-4|0;k[n>>2]=h}while(0);h=o;while(1){if(h>>>0<=n>>>0)break;g=h+-4|0;if(!(k[g>>2]|0))h=g;else break}g=(k[ea>>2]|0)-q|0;k[ea>>2]=g;if((g|0)>0)o=h;else break}}else n=D;if((g|0)<0){x=((b+25|0)/9|0)+1|0;y=(B|0)==102;do{v=0-g|0;v=(v|0)>9?9:v;do if(n>>>0>>0){g=(1<>>v;u=0;q=n;do{A=k[q>>2]|0;k[q>>2]=(A>>>v)+u;u=ha(A&g,o)|0;q=q+4|0}while(q>>>0>>0);g=(k[n>>2]|0)==0?n+4|0:n;if(!u){n=g;g=h;break}k[h>>2]=u;n=g;g=h+4|0}else{n=(k[n>>2]|0)==0?n+4|0:n;g=h}while(0);h=y?D:n;h=(g-h>>2|0)>(x|0)?h+(x<<2)|0:g;g=(k[ea>>2]|0)+v|0;k[ea>>2]=g}while((g|0)<0);x=n;y=h}else{x=n;y=h}do if(x>>>0>>0){g=(C-x>>2)*9|0;n=k[x>>2]|0;if(n>>>0<10)break;else h=10;do{h=h*10|0;g=g+1|0}while(n>>>0>=h>>>0)}else g=0;while(0);z=(B|0)==103;A=(b|0)!=0;h=b-((B|0)!=102?g:0)+((A&z)<<31>>31)|0;if((h|0)<(((y-C>>2)*9|0)+-9|0)){o=h+9216|0;h=D+4+(((o|0)/9|0)+-1024<<2)|0;o=((o|0)%9|0)+1|0;if((o|0)<9){n=10;do{n=n*10|0;o=o+1|0}while((o|0)!=9)}else n=10;u=k[h>>2]|0;v=(u>>>0)%(n>>>0)|0;o=(h+4|0)==(y|0);do if(o&(v|0)==0)n=x;else{w=(((u>>>0)/(n>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;q=(n|0)/2|0;if(v>>>0>>0)m=.5;else m=o&(v|0)==(q|0)?1.0:1.5;do if(E){if((i[F>>0]|0)!=45)break;w=-w;m=-m}while(0);o=u-v|0;k[h>>2]=o;if(!(w+m!=w)){n=x;break}B=o+n|0;k[h>>2]=B;if(B>>>0>999999999){g=x;while(1){n=h+-4|0;k[h>>2]=0;if(n>>>0>>0){g=g+-4|0;k[g>>2]=0}B=(k[n>>2]|0)+1|0;k[n>>2]=B;if(B>>>0>999999999)h=n;else{q=g;h=n;break}}}else q=x;g=(C-q>>2)*9|0;o=k[q>>2]|0;if(o>>>0<10){n=q;break}else n=10;do{n=n*10|0;g=g+1|0}while(o>>>0>=n>>>0);n=q}while(0);h=h+4|0;x=n;h=y>>>0>h>>>0?h:y}else h=y;v=0-g|0;B=h;while(1){if(B>>>0<=x>>>0){y=0;break}h=B+-4|0;if(!(k[h>>2]|0))B=h;else{y=1;break}}do if(z){b=(A&1^1)+b|0;if((b|0)>(g|0)&(g|0)>-5){s=s+-1|0;b=b+-1-g|0}else{s=s+-2|0;b=b+-1|0}h=G&8;if(h|0)break;do if(y){h=k[B+-4>>2]|0;if(!h){n=9;break}if(!((h>>>0)%10|0)){o=10;n=0}else{n=0;break}do{o=o*10|0;n=n+1|0}while(!((h>>>0)%(o>>>0)|0|0))}else n=9;while(0);h=((B-C>>2)*9|0)+-9|0;if((s|32|0)==102){h=h-n|0;h=(h|0)<0?0:h;b=(b|0)<(h|0)?b:h;h=0;break}else{h=h+g-n|0;h=(h|0)<0?0:h;b=(b|0)<(h|0)?b:h;h=0;break}}else h=G&8;while(0);u=b|h;o=(u|0)!=0&1;q=(s|32|0)==102;if(q){g=(g|0)>0?g:0;s=0}else{n=(g|0)<0?v:g;n=Le(n,((n|0)<0)<<31>>31,_)|0;if((aa-n|0)<2)do{n=n+-1|0;i[n>>0]=48}while((aa-n|0)<2);i[n+-1>>0]=(g>>31&2)+43;C=n+-2|0;i[C>>0]=s;g=aa-C|0;s=C}v=E+1+b+o+g|0;Oe(a,32,I,v,G);if(!(k[a>>2]&32))Fe(F,E,a)|0;Oe(a,48,I,v,G^65536);do if(q){n=x>>>0>D>>>0?D:x;h=n;do{g=Le(k[h>>2]|0,0,S)|0;do if((h|0)==(n|0)){if((g|0)!=(S|0))break;i[U>>0]=48;g=U}else{if(g>>>0<=da>>>0)break;rf(da|0,48,g-Y|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}while(0);if(!(k[a>>2]&32))Fe(g,T-g|0,a)|0;h=h+4|0}while(h>>>0<=D>>>0);do if(u|0){if(k[a>>2]&32|0)break;Fe(1097236,1,a)|0}while(0);if((b|0)>0&h>>>0>>0)while(1){g=Le(k[h>>2]|0,0,S)|0;if(g>>>0>da>>>0){rf(da|0,48,g-Y|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}if(!(k[a>>2]&32))Fe(g,(b|0)>9?9:b,a)|0;h=h+4|0;g=b+-9|0;if(!((b|0)>9&h>>>0>>0)){b=g;break}else b=g}Oe(a,48,b+9|0,9,0)}else{q=y?B:x+4|0;if((b|0)>-1){o=(h|0)==0;n=x;do{g=Le(k[n>>2]|0,0,S)|0;if((g|0)==(S|0)){i[U>>0]=48;g=U}do if((n|0)==(x|0)){h=g+1|0;if(!(k[a>>2]&32))Fe(g,1,a)|0;if(o&(b|0)<1){g=h;break}if(k[a>>2]&32|0){g=h;break}Fe(1097236,1,a)|0;g=h}else{if(g>>>0<=da>>>0)break;rf(da|0,48,g+Z|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}while(0);h=T-g|0;if(!(k[a>>2]&32))Fe(g,(b|0)>(h|0)?h:b,a)|0;b=b-h|0;n=n+4|0}while(n>>>0>>0&(b|0)>-1)}Oe(a,48,b+18|0,18,0);if(k[a>>2]&32|0)break;Fe(s,aa-s|0,a)|0}while(0);Oe(a,32,I,v,G^8192);b=(v|0)<(I|0)?I:v}else{q=(s&32|0)!=0;o=m!=m|0.0!=0.0;g=o?0:E;n=g+3|0;Oe(a,32,I,n,h);b=k[a>>2]|0;if(!(b&32)){Fe(F,g,a)|0;b=k[a>>2]|0}if(!(b&32))Fe(o?(q?1097228:1097232):q?1097220:1097224,3,a)|0;Oe(a,32,I,n,G^8192);b=(n|0)<(I|0)?I:n}while(0);g=b;o=J;x=H;continue a}default:{b=x;h=G;s=o;v=0;u=1095292;g=N}}while(0);g:do if((K|0)==64){h=ba;g=k[h>>2]|0;h=k[h+4>>2]|0;n=s&32;if(!((g|0)==0&(h|0)==0)){b=N;do{b=b+-1|0;i[b>>0]=l[1095276+(g&15)>>0]|n;g=uf(g|0,h|0,4)|0;h=L}while(!((g|0)==0&(h|0)==0));K=ba;if((q&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){g=q;q=0;n=1095292;K=77}else{g=q;q=2;n=1095292+(s>>4)|0;K=77}}else{b=N;g=q;q=0;n=1095292;K=77}}else if((K|0)==76){b=Le(b,g,N)|0;g=G;q=h;K=77}else if((K|0)==82){K=0;G=Ne(g,0,o)|0;F=(G|0)==0;b=g;s=F?o:G-g|0;v=0;u=1095292;g=F?g+o|0:G}else if((K|0)==86){K=0;h=0;g=0;q=b;while(1){n=k[q>>2]|0;if(!n)break;g=De(fa,n)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}Oe(a,32,I,h,G);if(!h){b=0;K=97}else{n=0;while(1){g=k[b>>2]|0;if(!g){b=h;K=97;break g}g=De(fa,g)|0;n=g+n|0;if((n|0)>(h|0)){b=h;K=97;break g}if(!(k[a>>2]&32))Fe(fa,g,a)|0;if(n>>>0>=h>>>0){b=h;K=97;break}else b=b+4|0}}}while(0);if((K|0)==97){K=0;Oe(a,32,I,b,G^8192);g=(I|0)>(b|0)?I:b;o=J;x=H;continue}if((K|0)==77){K=0;h=(o|0)>-1?g&-65537:g;g=ba;g=(k[g>>2]|0)!=0|(k[g+4>>2]|0)!=0;if((o|0)!=0|g){s=(g&1^1)+(V-b)|0;s=(o|0)>(s|0)?o:s;v=q;u=n;g=N}else{b=N;s=0;v=q;u=n;g=N}}q=g-b|0;n=(s|0)<(q|0)?q:s;o=v+n|0;g=(I|0)<(o|0)?o:I;Oe(a,32,g,o,h);if(!(k[a>>2]&32))Fe(u,v,a)|0;Oe(a,48,g,o,h^65536);Oe(a,48,n,q,0);if(!(k[a>>2]&32))Fe(b,q,a)|0;Oe(a,32,g,o,h^8192);o=J;x=H}h:do if((K|0)==244)if(!a)if(!o)f=0;else{f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b){b=0;break}Ke(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}while(1){f=f+1|0;if(b|0){f=-1;break h}if((f|0)>=10){f=1;break h}b=k[e+(f<<2)>>2]|0}}while(0);r=ia;return f|0}function Ke(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Le(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=Ef(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=a;a=Df(a|0,b|0,10,0)|0;if(!(b>>>0>9|(b|0)==9&d>>>0>4294967295))break;else b=L}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Me(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[1095302+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=1095390;c=5;break}}if((c|0)==2)if(!b)b=1095390;else{a=1095390;c=5}if((c|0)==5)while(1){do{c=a;a=a+1|0}while((i[c>>0]|0)!=0);b=b+-1|0;if(!b){b=a;break}else c=5}return b|0}function Ne(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24)break a;a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);b:do if((g|0)==5)if(d){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009|0)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}else c=0;while(0);return (c|0?a:0)|0}function Oe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=r;r=r+256|0;f=g;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;rf(f|0,b|0,(e>>>0>256?256:e)|0)|0;d=k[a>>2]|0;c=(d&32|0)==0;if(e>>>0>255){b=e;do{if(c){Fe(f,256,a)|0;d=k[a>>2]|0}b=b+-256|0;c=(d&32|0)==0}while(b>>>0>255);if(c)e=e&255;else break}else if(!c)break;Fe(f,e,a)|0}while(0);r=g;return}function Pe(a,b){a=+a;b=b|0;return +(+Qe(a,b))}function Qe(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=uf(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+Qe(a*18446744073709551616.0,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function Re(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;o=r;r=r+128|0;j=o+112|0;l=o;m=l;p=941232;q=m+112|0;do{k[m>>2]=k[p>>2];m=m+4|0;p=p+4|0}while((m|0)<(q|0));if((b+-1|0)>>>0>2147483646)if(!b){e=j;f=1;n=4}else{q=xe()|0;k[q>>2]=75}else{e=a;f=b;n=4}if((n|0)==4?(q=-2-e|0,q=f>>>0>q>>>0?q:f,k[l+48>>2]=q,h=l+20|0,k[h>>2]=e,k[l+44>>2]=e,p=e+q|0,g=l+16|0,k[g>>2]=p,k[l+28>>2]=p,Ie(l,c,d)|0,q|0):0){q=k[h>>2]|0;i[q+(((q|0)==(k[g>>2]|0))<<31>>31)>>0]=0}r=o;return}function Se(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;vf(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function Te(a,b){a=a|0;b=b|0;a=Ue(a,b)|0;return ((i[a>>0]|0)==(b&255)<<24>>24?a:0)|0}function Ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;d=b&255;a:do if(!d)a=a+(Ve(a)|0)|0;else{if(a&3){c=b&255;do{e=i[a>>0]|0;if(e<<24>>24==0?1:e<<24>>24==c<<24>>24)break a;a=a+1|0}while((a&3|0)!=0)}d=ha(d,16843009)|0;c=k[a>>2]|0;b:do if(!((c&-2139062144^-2139062144)&c+-16843009))do{e=c^d;if((e&-2139062144^-2139062144)&e+-16843009|0)break b;a=a+4|0;c=k[a>>2]|0}while(!((c&-2139062144^-2139062144)&c+-16843009|0));while(0);c=b&255;while(1){e=i[a>>0]|0;if(e<<24>>24==0?1:e<<24>>24==c<<24>>24)break;else a=a+1|0}}while(0);return a|0}function Ve(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function We(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;Xe(a,b,e);r=d;return}function Xe(a,b,c){a=a|0;b=b|0;c=c|0;Re(a,2147483647,b,c);return}function Ye(){var a=0,b=0,c=0;do if((k[235299]|0)>=0?(Ge()|0)!=0:0){if((i[941195]|0)!=10?(a=k[235285]|0,a>>>0<(k[235284]|0)>>>0):0){k[235285]=a+1;i[a>>0]=10;break}Be(941120,10)|0}else c=3;while(0);do if((c|0)==3){if((i[941195]|0)!=10?(b=k[235285]|0,b>>>0<(k[235284]|0)>>>0):0){k[235285]=b+1;i[b>>0]=10;break}Be(941120,10)|0}while(0);return}function Ze(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Fe(a,ha(c,b)|0,d)|0;return}function _e(a,b){a=a|0;b=b|0;var c=0,d=0;d=i[a>>0]|0;c=i[b>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=c<<24>>24)b=d;else{do{a=a+1|0;b=b+1|0;d=i[a>>0]|0;c=i[b>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=c<<24>>24));b=d}return (b&255)-(c&255)|0}function $e(a,b){a=a|0;b=b|0;af(a,b,4);return}function af(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=b;a:do if(!((e^a)&3)){d=(c|0)!=0;if(d&(e&3|0)!=0)do{e=i[b>>0]|0;i[a>>0]=e;if(!(e<<24>>24))break a;c=c+-1|0;b=b+1|0;a=a+1|0;d=(c|0)!=0}while(d&(b&3|0)!=0);if(d){if(i[b>>0]|0){b:do if(c>>>0>3)do{d=k[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break b;k[a>>2]=d;c=c+-4|0;b=b+4|0;a=a+4|0}while(c>>>0>3);while(0);f=11}}else c=0}else f=11;while(0);c:do if((f|0)==11)if(!c)c=0;else while(1){f=i[b>>0]|0;i[a>>0]=f;if(!(f<<24>>24))break c;c=c+-1|0;a=a+1|0;if(!c){c=0;break}else b=b+1|0}while(0);rf(a|0,0,c|0)|0;return}function bf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do if(!c)c=0;else{while(1){d=i[a>>0]|0;e=i[b>>0]|0;if(d<<24>>24!=e<<24>>24)break;c=c+-1|0;if(!c){c=0;break a}else{a=a+1|0;b=b+1|0}}c=(d&255)-(e&255)|0}while(0);return c|0} -function cf(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;i=k[274323]|0;b=i>>>a;if(b&3|0){b=(b&1^1)+a|0;c=1097332+(b<<1<<2)|0;d=c+8|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[274327]|0)>>>0)ua();a=g+12|0;if((k[a>>2]|0)==(e|0)){k[a>>2]=c;k[d>>2]=g;break}else ua()}else k[274323]=i&~(1<>2]=G|3;G=e+G+4|0;k[G>>2]=k[G>>2]|1;G=f;return G|0}g=k[274325]|0;if(o>>>0>g>>>0){if(b|0){c=2<>>12&16;c=c>>>h;e=c>>>5&8;c=c>>>e;f=c>>>2&4;c=c>>>f;d=c>>>1&2;c=c>>>d;b=c>>>1&1;b=(e|h|f|d|b)+(c>>>b)|0;c=1097332+(b<<1<<2)|0;d=c+8|0;f=k[d>>2]|0;h=f+8|0;e=k[h>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[274327]|0)>>>0)ua();a=e+12|0;if((k[a>>2]|0)==(f|0)){k[a>>2]=c;k[d>>2]=e;j=k[274325]|0;break}else ua()}else{k[274323]=i&~(1<>2]=o|3;d=f+o|0;k[d+4>>2]=g|1;k[d+g>>2]=g;if(j|0){e=k[274328]|0;b=j>>>3;c=1097332+(b<<1<<2)|0;a=k[274323]|0;b=1<>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();else{l=a;m=b}}else{k[274323]=a|b;l=c+8|0;m=c}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=c}k[274325]=g;k[274328]=d;G=h;return G|0}a=k[274324]|0;if(a){h=(a&0-a)+-1|0;F=h>>>12&16;h=h>>>F;E=h>>>5&8;h=h>>>E;G=h>>>2&4;h=h>>>G;b=h>>>1&2;h=h>>>b;i=h>>>1&1;i=k[1097596+((E|F|G|b|i)+(h>>>i)<<2)>>2]|0;h=(k[i+4>>2]&-8)-o|0;b=i;while(1){a=k[b+16>>2]|0;if(!a){a=k[b+20>>2]|0;if(!a)break}b=(k[a+4>>2]&-8)-o|0;G=b>>>0>>0;h=G?b:h;b=a;i=G?a:i}e=k[274327]|0;if(i>>>0>>0)ua();g=i+o|0;if(i>>>0>=g>>>0)ua();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){b=i+20|0;a=k[b>>2]|0;if(!a){b=i+16|0;a=k[b>>2]|0;if(!a){n=0;break}}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)ua();else{k[b>>2]=0;n=a;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)ua();a=d+12|0;if((k[a>>2]|0)!=(i|0))ua();b=c+8|0;if((k[b>>2]|0)==(i|0)){k[a>>2]=c;k[b>>2]=d;n=c;break}else ua()}while(0);do if(f|0){a=k[i+28>>2]|0;b=1097596+(a<<2)|0;if((i|0)==(k[b>>2]|0)){k[b>>2]=n;if(!n){k[274324]=k[274324]&~(1<>>0<(k[274327]|0)>>>0)ua();a=f+16|0;if((k[a>>2]|0)==(i|0))k[a>>2]=n;else k[f+20>>2]=n;if(!n)break}b=k[274327]|0;if(n>>>0>>0)ua();k[n+24>>2]=f;a=k[i+16>>2]|0;do if(a|0)if(a>>>0>>0)ua();else{k[n+16>>2]=a;k[a+24>>2]=n;break}while(0);a=k[i+20>>2]|0;if(a|0)if(a>>>0<(k[274327]|0)>>>0)ua();else{k[n+20>>2]=a;k[a+24>>2]=n;break}}while(0);if(h>>>0<16){G=h+o|0;k[i+4>>2]=G|3;G=i+G+4|0;k[G>>2]=k[G>>2]|1}else{k[i+4>>2]=o|3;k[g+4>>2]=h|1;k[g+h>>2]=h;a=k[274325]|0;if(a|0){d=k[274328]|0;b=a>>>3;c=1097332+(b<<1<<2)|0;a=k[274323]|0;b=1<>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();else{p=a;q=b}}else{k[274323]=a|b;p=c+8|0;q=c}k[p>>2]=d;k[q+12>>2]=d;k[d+8>>2]=q;k[d+12>>2]=c}k[274325]=h;k[274328]=g}G=i+8|0;return G|0}}}else if(a>>>0<=4294967231){a=a+11|0;o=a&-8;j=k[274324]|0;if(j){c=0-o|0;a=a>>>8;if(a)if(o>>>0>16777215)i=31;else{q=(a+1048320|0)>>>16&8;z=a<>>16&4;z=z<>>16&2;i=14-(p|q|i)+(z<>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=k[1097596+(i<<2)>>2]|0;a:do if(!b){a=0;b=0;z=86}else{e=c;a=0;g=o<<((i|0)==31?0:25-(i>>>1)|0);h=b;b=0;while(1){d=k[h+4>>2]&-8;c=d-o|0;if(c>>>0>>0)if((d|0)==(o|0)){a=h;b=h;z=90;break a}else b=h;else c=e;d=k[h+20>>2]|0;h=k[h+16+(g>>>31<<2)>>2]|0;a=(d|0)==0|(d|0)==(h|0)?a:d;d=(h|0)==0;if(d){z=86;break}else{e=c;g=g<<(d&1^1)}}}while(0);if((z|0)==86){if((a|0)==0&(b|0)==0){a=2<>>12&16;q=q>>>m;l=q>>>5&8;q=q>>>l;n=q>>>2&4;q=q>>>n;p=q>>>1&2;q=q>>>p;a=q>>>1&1;a=k[1097596+((l|m|n|p|a)+(q>>>a)<<2)>>2]|0}if(!a){h=c;i=b}else z=90}if((z|0)==90)while(1){z=0;q=(k[a+4>>2]&-8)-o|0;d=q>>>0>>0;c=d?q:c;b=d?a:b;d=k[a+16>>2]|0;if(d|0){a=d;z=90;continue}a=k[a+20>>2]|0;if(!a){h=c;i=b;break}else z=90}if((i|0)!=0?h>>>0<((k[274325]|0)-o|0)>>>0:0){e=k[274327]|0;if(i>>>0>>0)ua();g=i+o|0;if(i>>>0>=g>>>0)ua();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){b=i+20|0;a=k[b>>2]|0;if(!a){b=i+16|0;a=k[b>>2]|0;if(!a){s=0;break}}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)ua();else{k[b>>2]=0;s=a;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)ua();a=d+12|0;if((k[a>>2]|0)!=(i|0))ua();b=c+8|0;if((k[b>>2]|0)==(i|0)){k[a>>2]=c;k[b>>2]=d;s=c;break}else ua()}while(0);do if(f|0){a=k[i+28>>2]|0;b=1097596+(a<<2)|0;if((i|0)==(k[b>>2]|0)){k[b>>2]=s;if(!s){k[274324]=k[274324]&~(1<>>0<(k[274327]|0)>>>0)ua();a=f+16|0;if((k[a>>2]|0)==(i|0))k[a>>2]=s;else k[f+20>>2]=s;if(!s)break}b=k[274327]|0;if(s>>>0>>0)ua();k[s+24>>2]=f;a=k[i+16>>2]|0;do if(a|0)if(a>>>0>>0)ua();else{k[s+16>>2]=a;k[a+24>>2]=s;break}while(0);a=k[i+20>>2]|0;if(a|0)if(a>>>0<(k[274327]|0)>>>0)ua();else{k[s+20>>2]=a;k[a+24>>2]=s;break}}while(0);do if(h>>>0>=16){k[i+4>>2]=o|3;k[g+4>>2]=h|1;k[g+h>>2]=h;a=h>>>3;if(h>>>0<256){c=1097332+(a<<1<<2)|0;b=k[274323]|0;a=1<>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();else{t=a;v=b}}else{k[274323]=b|a;t=c+8|0;v=c}k[t>>2]=g;k[v+12>>2]=g;k[g+8>>2]=v;k[g+12>>2]=c;break}a=h>>>8;if(a)if(h>>>0>16777215)c=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=h>>>(c+7|0)&1|c<<1}else c=0;d=1097596+(c<<2)|0;k[g+28>>2]=c;a=g+16|0;k[a+4>>2]=0;k[a>>2]=0;a=k[274324]|0;b=1<>2]=g;k[g+24>>2]=d;k[g+12>>2]=g;k[g+8>>2]=g;break}c=h<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(h|0)){z=148;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=145;break}else{c=c<<1;d=a}}if((z|0)==145)if(b>>>0<(k[274327]|0)>>>0)ua();else{k[b>>2]=g;k[g+24>>2]=d;k[g+12>>2]=g;k[g+8>>2]=g;break}else if((z|0)==148){a=d+8|0;b=k[a>>2]|0;G=k[274327]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=g;k[a>>2]=g;k[g+8>>2]=b;k[g+12>>2]=d;k[g+24>>2]=0;break}else ua()}}else{G=h+o|0;k[i+4>>2]=G|3;G=i+G+4|0;k[G>>2]=k[G>>2]|1}while(0);G=i+8|0;return G|0}}}else o=-1;while(0);c=k[274325]|0;if(c>>>0>=o>>>0){a=c-o|0;b=k[274328]|0;if(a>>>0>15){G=b+o|0;k[274328]=G;k[274325]=a;k[G+4>>2]=a|1;k[G+a>>2]=a;k[b+4>>2]=o|3}else{k[274325]=0;k[274328]=0;k[b+4>>2]=c|3;G=b+c+4|0;k[G>>2]=k[G>>2]|1}G=b+8|0;return G|0}a=k[274326]|0;if(a>>>0>o>>>0){E=a-o|0;k[274326]=E;G=k[274329]|0;F=G+o|0;k[274329]=F;k[F+4>>2]=E|1;k[G+4>>2]=o|3;G=G+8|0;return G|0}do if(!(k[274441]|0)){a=Ga(30)|0;if(!(a+-1&a)){k[274443]=a;k[274442]=a;k[274444]=-1;k[274445]=-1;k[274446]=0;k[274434]=0;v=(Ra(0)|0)&-16^1431655768;k[274441]=v;break}else ua()}while(0);g=o+48|0;d=k[274443]|0;h=o+47|0;c=d+h|0;d=0-d|0;i=c&d;if(i>>>0<=o>>>0){G=0;return G|0}a=k[274433]|0;if(a|0?(t=k[274431]|0,v=t+i|0,v>>>0<=t>>>0|v>>>0>a>>>0):0){G=0;return G|0}b:do if(!(k[274434]&4)){b=k[274329]|0;c:do if(b){e=1097740;while(1){a=k[e>>2]|0;if(a>>>0<=b>>>0?(r=e+4|0,(a+(k[r>>2]|0)|0)>>>0>b>>>0):0)break;a=k[e+8>>2]|0;if(!a){z=173;break c}else e=a}a=c-(k[274326]|0)&d;if(a>>>0<2147483647){b=Ba(a|0)|0;if((b|0)==((k[e>>2]|0)+(k[r>>2]|0)|0)){if((b|0)!=(-1|0)){g=b;f=a;z=193;break b}}else z=183}}else z=173;while(0);do if((z|0)==173?(u=Ba(0)|0,(u|0)!=(-1|0)):0){a=u;b=k[274442]|0;c=b+-1|0;if(!(c&a))a=i;else a=i-a+(c+a&0-b)|0;b=k[274431]|0;c=b+a|0;if(a>>>0>o>>>0&a>>>0<2147483647){v=k[274433]|0;if(v|0?c>>>0<=b>>>0|c>>>0>v>>>0:0)break;b=Ba(a|0)|0;if((b|0)==(u|0)){g=u;f=a;z=193;break b}else z=183}}while(0);d:do if((z|0)==183){c=0-a|0;do if(g>>>0>a>>>0&(a>>>0<2147483647&(b|0)!=(-1|0))?(w=k[274443]|0,w=h-a+w&0-w,w>>>0<2147483647):0)if((Ba(w|0)|0)==(-1|0)){Ba(c|0)|0;break d}else{a=w+a|0;break}while(0);if((b|0)!=(-1|0)){g=b;f=a;z=193;break b}}while(0);k[274434]=k[274434]|4;z=190}else z=190;while(0);if((((z|0)==190?i>>>0<2147483647:0)?(x=Ba(i|0)|0,y=Ba(0)|0,x>>>0>>0&((x|0)!=(-1|0)&(y|0)!=(-1|0))):0)?(f=y-x|0,f>>>0>(o+40|0)>>>0):0){g=x;z=193}if((z|0)==193){a=(k[274431]|0)+f|0;k[274431]=a;if(a>>>0>(k[274432]|0)>>>0)k[274432]=a;j=k[274329]|0;do if(j){e=1097740;while(1){a=k[e>>2]|0;b=e+4|0;c=k[b>>2]|0;if((g|0)==(a+c|0)){z=203;break}d=k[e+8>>2]|0;if(!d)break;else e=d}if(((z|0)==203?(k[e+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=a>>>0:0){k[b>>2]=c+f;G=j+8|0;G=(G&7|0)==0?0:0-G&7;F=j+G|0;G=f-G+(k[274326]|0)|0;k[274329]=F;k[274326]=G;k[F+4>>2]=G|1;k[F+G+4>>2]=40;k[274330]=k[274445];break}a=k[274327]|0;if(g>>>0>>0){k[274327]=g;h=g}else h=a;b=g+f|0;a=1097740;while(1){if((k[a>>2]|0)==(b|0)){z=211;break}a=k[a+8>>2]|0;if(!a){b=1097740;break}}if((z|0)==211)if(!(k[a+12>>2]&8)){k[a>>2]=g;m=a+4|0;k[m>>2]=(k[m>>2]|0)+f;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=b+8|0;a=b+((a&7|0)==0?0:0-a&7)|0;l=m+o|0;i=a-m-o|0;k[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(k[274328]|0)){G=(k[274325]|0)+i|0;k[274325]=G;k[274328]=l;k[l+4>>2]=G|1;k[l+G>>2]=G;break}b=k[a+4>>2]|0;if((b&3|0)==1){g=b&-8;e=b>>>3;e:do if(b>>>0>=256){f=k[a+24>>2]|0;d=k[a+12>>2]|0;do if((d|0)==(a|0)){d=a+16|0;c=d+4|0;b=k[c>>2]|0;if(!b){b=k[d>>2]|0;if(!b){E=0;break}else c=d}while(1){d=b+20|0;e=k[d>>2]|0;if(e|0){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)ua();else{k[c>>2]=0;E=b;break}}else{e=k[a+8>>2]|0;if(e>>>0>>0)ua();b=e+12|0;if((k[b>>2]|0)!=(a|0))ua();c=d+8|0;if((k[c>>2]|0)==(a|0)){k[b>>2]=d;k[c>>2]=e;E=d;break}else ua()}while(0);if(!f)break;b=k[a+28>>2]|0;c=1097596+(b<<2)|0;do if((a|0)!=(k[c>>2]|0)){if(f>>>0<(k[274327]|0)>>>0)ua();b=f+16|0;if((k[b>>2]|0)==(a|0))k[b>>2]=E;else k[f+20>>2]=E;if(!E)break e}else{k[c>>2]=E;if(E|0)break;k[274324]=k[274324]&~(1<>>0>>0)ua();k[E+24>>2]=f;b=a+16|0;c=k[b>>2]|0;do if(c|0)if(c>>>0>>0)ua();else{k[E+16>>2]=c;k[c+24>>2]=E;break}while(0);b=k[b+4>>2]|0;if(!b)break;if(b>>>0<(k[274327]|0)>>>0)ua();else{k[E+20>>2]=b;k[b+24>>2]=E;break}}else{c=k[a+8>>2]|0;d=k[a+12>>2]|0;b=1097332+(e<<1<<2)|0;do if((c|0)!=(b|0)){if(c>>>0>>0)ua();if((k[c+12>>2]|0)==(a|0))break;ua()}while(0);if((d|0)==(c|0)){k[274323]=k[274323]&~(1<>>0>>0)ua();b=d+8|0;if((k[b>>2]|0)==(a|0)){B=b;break}ua()}while(0);k[c+12>>2]=d;k[B>>2]=c}while(0);a=a+g|0;e=g+i|0}else e=i;a=a+4|0;k[a>>2]=k[a>>2]&-2;k[l+4>>2]=e|1;k[l+e>>2]=e;a=e>>>3;if(e>>>0<256){c=1097332+(a<<1<<2)|0;b=k[274323]|0;a=1<>2]|0;if(b>>>0>=(k[274327]|0)>>>0){F=a;G=b;break}ua()}while(0);k[F>>2]=l;k[G+12>>2]=l;k[l+8>>2]=G;k[l+12>>2]=c;break}a=e>>>8;do if(!a)c=0;else{if(e>>>0>16777215){c=31;break}F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=e>>>(c+7|0)&1|c<<1}while(0);d=1097596+(c<<2)|0;k[l+28>>2]=c;a=l+16|0;k[a+4>>2]=0;k[a>>2]=0;a=k[274324]|0;b=1<>2]=l;k[l+24>>2]=d;k[l+12>>2]=l;k[l+8>>2]=l;break}c=e<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(e|0)){z=281;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=278;break}else{c=c<<1;d=a}}if((z|0)==278)if(b>>>0<(k[274327]|0)>>>0)ua();else{k[b>>2]=l;k[l+24>>2]=d;k[l+12>>2]=l;k[l+8>>2]=l;break}else if((z|0)==281){a=d+8|0;b=k[a>>2]|0;G=k[274327]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=l;k[a>>2]=l;k[l+8>>2]=b;k[l+12>>2]=d;k[l+24>>2]=0;break}else ua()}}else{G=(k[274326]|0)+i|0;k[274326]=G;k[274329]=l;k[l+4>>2]=G|1}while(0);G=m+8|0;return G|0}else b=1097740;while(1){a=k[b>>2]|0;if(a>>>0<=j>>>0?(A=a+(k[b+4>>2]|0)|0,A>>>0>j>>>0):0)break;b=k[b+8>>2]|0}e=A+-47|0;b=e+8|0;b=e+((b&7|0)==0?0:0-b&7)|0;e=j+16|0;b=b>>>0>>0?j:b;a=b+8|0;c=g+8|0;c=(c&7|0)==0?0:0-c&7;G=g+c|0;c=f+-40-c|0;k[274329]=G;k[274326]=c;k[G+4>>2]=c|1;k[G+c+4>>2]=40;k[274330]=k[274445];c=b+4|0;k[c>>2]=27;k[a>>2]=k[274435];k[a+4>>2]=k[274436];k[a+8>>2]=k[274437];k[a+12>>2]=k[274438];k[274435]=g;k[274436]=f;k[274438]=0;k[274437]=a;a=b+24|0;do{a=a+4|0;k[a>>2]=7}while((a+4|0)>>>0>>0);if((b|0)!=(j|0)){f=b-j|0;k[c>>2]=k[c>>2]&-2;k[j+4>>2]=f|1;k[b>>2]=f;a=f>>>3;if(f>>>0<256){c=1097332+(a<<1<<2)|0;b=k[274323]|0;a=1<>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();else{C=a;D=b}}else{k[274323]=b|a;C=c+8|0;D=c}k[C>>2]=j;k[D+12>>2]=j;k[j+8>>2]=D;k[j+12>>2]=c;break}a=f>>>8;if(a)if(f>>>0>16777215)c=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=f>>>(c+7|0)&1|c<<1}else c=0;d=1097596+(c<<2)|0;k[j+28>>2]=c;k[j+20>>2]=0;k[e>>2]=0;a=k[274324]|0;b=1<>2]=j;k[j+24>>2]=d;k[j+12>>2]=j;k[j+8>>2]=j;break}c=f<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(f|0)){z=307;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=304;break}else{c=c<<1;d=a}}if((z|0)==304)if(b>>>0<(k[274327]|0)>>>0)ua();else{k[b>>2]=j;k[j+24>>2]=d;k[j+12>>2]=j;k[j+8>>2]=j;break}else if((z|0)==307){a=d+8|0;b=k[a>>2]|0;G=k[274327]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=j;k[a>>2]=j;k[j+8>>2]=b;k[j+12>>2]=d;k[j+24>>2]=0;break}else ua()}}}else{G=k[274327]|0;if((G|0)==0|g>>>0>>0)k[274327]=g;k[274435]=g;k[274436]=f;k[274438]=0;k[274332]=k[274441];k[274331]=-1;a=0;do{G=1097332+(a<<1<<2)|0;k[G+12>>2]=G;k[G+8>>2]=G;a=a+1|0}while((a|0)!=32);G=g+8|0;G=(G&7|0)==0?0:0-G&7;F=g+G|0;G=f+-40-G|0;k[274329]=F;k[274326]=G;k[F+4>>2]=G|1;k[F+G+4>>2]=40;k[274330]=k[274445]}while(0);a=k[274326]|0;if(a>>>0>o>>>0){E=a-o|0;k[274326]=E;G=k[274329]|0;F=G+o|0;k[274329]=F;k[F+4>>2]=E|1;k[G+4>>2]=o|3;G=G+8|0;return G|0}}G=xe()|0;k[G>>2]=12;G=0;return G|0}function df(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!a)return;c=a+-8|0;g=k[274327]|0;if(c>>>0>>0)ua();a=k[a+-4>>2]|0;b=a&3;if((b|0)==1)ua();d=a&-8;m=c+d|0;do if(!(a&1)){a=k[c>>2]|0;if(!b)return;j=c+(0-a)|0;i=a+d|0;if(j>>>0>>0)ua();if((j|0)==(k[274328]|0)){a=m+4|0;b=k[a>>2]|0;if((b&3|0)!=3){q=j;e=i;break}k[274325]=i;k[a>>2]=b&-2;k[j+4>>2]=i|1;k[j+i>>2]=i;return}d=a>>>3;if(a>>>0<256){b=k[j+8>>2]|0;c=k[j+12>>2]|0;a=1097332+(d<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)ua();if((k[b+12>>2]|0)!=(j|0))ua()}if((c|0)==(b|0)){k[274323]=k[274323]&~(1<>>0>>0)ua();a=c+8|0;if((k[a>>2]|0)==(j|0))f=a;else ua()}else f=c+8|0;k[b+12>>2]=c;k[f>>2]=b;q=j;e=i;break}f=k[j+24>>2]|0;c=k[j+12>>2]|0;do if((c|0)==(j|0)){c=j+16|0;b=c+4|0;a=k[b>>2]|0;if(!a){a=k[c>>2]|0;if(!a){h=0;break}else b=c}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)ua();else{k[b>>2]=0;h=a;break}}else{d=k[j+8>>2]|0;if(d>>>0>>0)ua();a=d+12|0;if((k[a>>2]|0)!=(j|0))ua();b=c+8|0;if((k[b>>2]|0)==(j|0)){k[a>>2]=c;k[b>>2]=d;h=c;break}else ua()}while(0);if(f){a=k[j+28>>2]|0;b=1097596+(a<<2)|0;if((j|0)==(k[b>>2]|0)){k[b>>2]=h;if(!h){k[274324]=k[274324]&~(1<>>0<(k[274327]|0)>>>0)ua();a=f+16|0;if((k[a>>2]|0)==(j|0))k[a>>2]=h;else k[f+20>>2]=h;if(!h){q=j;e=i;break}}c=k[274327]|0;if(h>>>0>>0)ua();k[h+24>>2]=f;a=j+16|0;b=k[a>>2]|0;do if(b|0)if(b>>>0>>0)ua();else{k[h+16>>2]=b;k[b+24>>2]=h;break}while(0);a=k[a+4>>2]|0;if(a)if(a>>>0<(k[274327]|0)>>>0)ua();else{k[h+20>>2]=a;k[a+24>>2]=h;q=j;e=i;break}else{q=j;e=i}}else{q=j;e=i}}else{q=c;e=d}while(0);if(q>>>0>=m>>>0)ua();a=m+4|0;b=k[a>>2]|0;if(!(b&1))ua();if(!(b&2)){if((m|0)==(k[274329]|0)){p=(k[274326]|0)+e|0;k[274326]=p;k[274329]=q;k[q+4>>2]=p|1;if((q|0)!=(k[274328]|0))return;k[274328]=0;k[274325]=0;return}if((m|0)==(k[274328]|0)){p=(k[274325]|0)+e|0;k[274325]=p;k[274328]=q;k[q+4>>2]=p|1;k[q+p>>2]=p;return}e=(b&-8)+e|0;d=b>>>3;do if(b>>>0>=256){f=k[m+24>>2]|0;a=k[m+12>>2]|0;do if((a|0)==(m|0)){c=m+16|0;b=c+4|0;a=k[b>>2]|0;if(!a){a=k[c>>2]|0;if(!a){n=0;break}else b=c}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0<(k[274327]|0)>>>0)ua();else{k[b>>2]=0;n=a;break}}else{b=k[m+8>>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();c=b+12|0;if((k[c>>2]|0)!=(m|0))ua();d=a+8|0;if((k[d>>2]|0)==(m|0)){k[c>>2]=a;k[d>>2]=b;n=a;break}else ua()}while(0);if(f|0){a=k[m+28>>2]|0;b=1097596+(a<<2)|0;if((m|0)==(k[b>>2]|0)){k[b>>2]=n;if(!n){k[274324]=k[274324]&~(1<>>0<(k[274327]|0)>>>0)ua();a=f+16|0;if((k[a>>2]|0)==(m|0))k[a>>2]=n;else k[f+20>>2]=n;if(!n)break}c=k[274327]|0;if(n>>>0>>0)ua();k[n+24>>2]=f;a=m+16|0;b=k[a>>2]|0;do if(b|0)if(b>>>0>>0)ua();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);a=k[a+4>>2]|0;if(a|0)if(a>>>0<(k[274327]|0)>>>0)ua();else{k[n+20>>2]=a;k[a+24>>2]=n;break}}}else{b=k[m+8>>2]|0;c=k[m+12>>2]|0;a=1097332+(d<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(k[274327]|0)>>>0)ua();if((k[b+12>>2]|0)!=(m|0))ua()}if((c|0)==(b|0)){k[274323]=k[274323]&~(1<>>0<(k[274327]|0)>>>0)ua();a=c+8|0;if((k[a>>2]|0)==(m|0))l=a;else ua()}else l=c+8|0;k[b+12>>2]=c;k[l>>2]=b}while(0);k[q+4>>2]=e|1;k[q+e>>2]=e;if((q|0)==(k[274328]|0)){k[274325]=e;return}}else{k[a>>2]=b&-2;k[q+4>>2]=e|1;k[q+e>>2]=e}a=e>>>3;if(e>>>0<256){c=1097332+(a<<1<<2)|0;b=k[274323]|0;a=1<>2]|0;if(b>>>0<(k[274327]|0)>>>0)ua();else{o=a;p=b}}else{k[274323]=b|a;o=c+8|0;p=c}k[o>>2]=q;k[p+12>>2]=q;k[q+8>>2]=p;k[q+12>>2]=c;return}a=e>>>8;if(a)if(e>>>0>16777215)c=31;else{o=(a+1048320|0)>>>16&8;p=a<>>16&4;p=p<>>16&2;c=14-(n|o|c)+(p<>>15)|0;c=e>>>(c+7|0)&1|c<<1}else c=0;d=1097596+(c<<2)|0;k[q+28>>2]=c;k[q+20>>2]=0;k[q+16>>2]=0;a=k[274324]|0;b=1<>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(e|0)){a=130;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){a=127;break}else{c=c<<1;d=a}}if((a|0)==127)if(b>>>0<(k[274327]|0)>>>0)ua();else{k[b>>2]=q;k[q+24>>2]=d;k[q+12>>2]=q;k[q+8>>2]=q;break}else if((a|0)==130){a=d+8|0;b=k[a>>2]|0;p=k[274327]|0;if(b>>>0>=p>>>0&d>>>0>=p>>>0){k[b+12>>2]=q;k[a>>2]=q;k[q+8>>2]=b;k[q+12>>2]=d;k[q+24>>2]=0;break}else ua()}}else{k[274324]=a|b;k[d>>2]=q;k[q+24>>2]=d;k[q+12>>2]=q;k[q+8>>2]=q}while(0);q=(k[274331]|0)+-1|0;k[274331]=q;if(!q)a=1097748;else return;while(1){a=k[a>>2]|0;if(!a)break;else a=a+8|0}k[274331]=-1;return}function ef(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(c>>>0>4294967279)oe();if(c>>>0<11){i[a>>0]=c<<1;a=a+1|0}else{e=c+16&-16;d=pe(e)|0;k[a+8>>2]=d;k[a>>2]=e|1;k[a+4>>2]=c;a=d}vf(a|0,b|0,c|0)|0;i[a+c>>0]=0;return}function ff(a){a=a|0;if(i[a>>0]&1)Xd(k[a+8>>2]|0);return}function gf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0;if((-18-b|0)>>>0>>0)oe();if(!(i[a>>0]&1))j=a+1|0;else j=k[a+8>>2]|0;if(b>>>0<2147483623){c=c+b|0;h=b<<1;c=c>>>0>>0?h:c;c=c>>>0<11?11:c+16&-16}else c=-17;h=pe(c)|0;if(e|0)vf(h|0,j|0,e|0)|0;if(f|0)vf(h+e|0,g|0,f|0)|0;if((d|0)!=(e|0))vf(h+e+f|0,j+e|0,d-e|0)|0;if((b|0)!=10)Xd(j);k[a+8>>2]=h;k[a>>2]=c|1;g=d+f|0;k[a+4>>2]=g;i[h+g>>0]=0;return}function hf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i[a>>0]|0;if(!(c&1))d=10;else{c=k[a>>2]|0;d=(c&-2)+-1|0;c=c&255}if(!(c&1))e=(c&255)>>>1;else e=k[a+4>>2]|0;if((d|0)==(e|0)){jf(a,d,1,d,d);c=i[a>>0]|0}if(!(c&1))d=a+1|0;else d=k[a+8>>2]|0;rf(d+e|0,b|0,1)|0;c=e+1|0;if(!(i[a>>0]&1))i[a>>0]=c<<1;else k[a+4>>2]=c;i[d+c>>0]=0;return}function jf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((-17-b|0)>>>0>>0)oe();if(!(i[a>>0]&1))g=a+1|0;else g=k[a+8>>2]|0;if(b>>>0<2147483623){c=c+b|0;f=b<<1;c=c>>>0>>0?f:c;c=c>>>0<11?11:c+16&-16}else c=-17;f=pe(c)|0;if(e|0)vf(f|0,g|0,e|0)|0;if((d|0)!=(e|0))vf(f+e|0,g+e|0,d-e|0)|0;if((b|0)!=10)Xd(g);k[a+8>>2]=f;k[a>>2]=c|1;return}function kf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i[a>>0]|0;if(!(d&1))f=10;else{d=k[a>>2]|0;f=(d&-2)+-1|0;d=d&255}e=(d&1)==0;if(e)d=(d&255)>>>1;else d=k[a+4>>2]|0;if((f-d|0)>>>0>=c>>>0){if(c|0){if(e)e=a+1|0;else e=k[a+8>>2]|0;vf(e+d|0,b|0,c|0)|0;d=d+c|0;if(!(i[a>>0]&1))i[a>>0]=d<<1;else k[a+4>>2]=d;i[e+d>>0]=0}}else gf(a,f,c-f+d|0,d,d,c,b);return}function lf(a,b){a=a|0;b=b|0;kf(a,b,Ve(b)|0);return}function mf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i[a>>0]|0;d=(c&1)!=0;if(d){e=(k[a>>2]&-2)+-1|0;f=k[a+4>>2]|0}else{e=10;f=(c&255)>>>1}if((f|0)==(e|0)){jf(a,e,1,e,e);if(!(i[a>>0]&1))d=7;else d=8}else if(d)d=8;else d=7;if((d|0)==7){i[a>>0]=(f<<1)+2;c=a+1|0}else if((d|0)==8){c=k[a+8>>2]|0;k[a+4>>2]=f+1}a=c+f|0;i[a>>0]=b;i[a+1>>0]=0;return}function nf(a,b){a=a|0;b=b|0;var c=0,d=0;c=i[a>>0]|0;d=(c&1)==0;if(d)c=(c&255)>>>1;else c=k[a+4>>2]|0;if(c>>>0>>0)ne();if(d){i[a>>0]=b<<1;c=a+1|0}else{c=k[a+8>>2]|0;k[a+4>>2]=b}i[c+b>>0]=0;return}function of(a,b){a=a|0;b=b|0;var c=0,d=0;c=i[a>>0]|0;if(!(c&1)){d=(c&255)>>>1;c=a+1|0}else{d=k[a+4>>2]|0;c=k[a+8>>2]|0}if(d>>>0>b>>>0){b=Ne(c+b|0,44,d-b|0)|0;c=(b|0)==0?-1:b-c|0}else c=-1;return c|0}function pf(){}function qf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function rf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function sf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function uf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function vf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c|0)>=4096)return Da(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function wf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)<(a|0)&(a|0)<(b+c|0)){d=a;b=b+c|0;a=a+c|0;while((c|0)>0){a=a-1|0;b=b-1|0;c=c-1|0;i[a>>0]=i[b>>0]|0}a=d}else vf(a,b,c)|0;return a|0}function xf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function yf(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function zf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function Af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=qf(j^a|0,i^b|0,j|0,i|0)|0;g=L;a=f^j;b=e^i;return qf((Ff(h,g,qf(f^c|0,e^d|0,f|0,e|0)|0,L,0)|0)^a|0,L^b|0,a|0,b|0)|0}function Bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=qf(g^a|0,f^b|0,g|0,f|0)|0;b=L;Ff(a,b,qf(j^c|0,i^d|0,j|0,i|0)|0,L,h)|0;d=qf(k[h>>2]^g|0,k[h+4>>2]^f|0,g|0,f|0)|0;c=L;r=e;return (L=c,d)|0}function Cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=zf(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function Df(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ff(a,b,c,d,0)|0}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;Ff(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function Ff(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g|0){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e|0){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=yf(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e|0){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e|0){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e|0){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((yf(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=tf(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;qf(j|0,c|0,d|0,n|0)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=qf(d|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e|0){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function Gf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Wa[a&7](b|0,c|0,d|0)|0}function Hf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Xa[a&3](b|0,c|0,d|0,e|0,f|0)}function If(a,b){a=a|0;b=b|0;Ya[a&15](b|0)}function Jf(a,b){a=a|0;b=b|0;return Za[a&3](b|0)|0}function Kf(a){a=a|0;_a[a&3]()}function Lf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;$a[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Mf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ab[a&3](b|0,c|0,d|0,e|0)}function Nf(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function Of(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function Pf(a){a=a|0;ka(2)}function Qf(a){a=a|0;ka(3);return 0}function Rf(){ka(4)}function Sf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(5)}function Tf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(6)} +function $a(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function ab(){return r|0}function bb(a){a=a|0;r=a}function cb(a,b){a=a|0;b=b|0;r=a;s=b}function db(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function eb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function fb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function gb(a){a=a|0;L=a}function hb(){return L|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0;d=980497+(a<<3&2040)|0;c=a>>>8;if(c&255|0)nd(b,c&255,l[d+5>>0]|0);c=a>>>16;if(c&255|0)nd(b,c&255,l[d+6>>0]|0);c=a>>>24;if(c|0)nd(b,c&255,l[d+7>>0]|0);return}function jb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,m=0,n=0,o=0;o=r;r=r+16|0;n=o+4|0;m=o;f=a+b|0;g=a+c|0;j=e+8|0;h=k[e+4>>2]|0;b=k[j>>2]|0;c=(i[f>>0]|0)==32?f+1|0:f;do{if(c>>>0>=g>>>0)break;k[n>>2]=c;f=l[1009576+(l[c>>0]|0)>>0]|0;k[m>>2]=f;c=c+f|0;f=ud(d,n,m)|0;if(f<<24>>24){k[e+32+(b<<3)>>2]=c-a;k[e+32+(b<<3)+4>>2]=f&255;b=b+1|0}}while((b|0)<(h|0));k[j>>2]=b;n=c-a|0;k[e+32+(b<<3)>>2]=n;k[e+32+(k[j>>2]<<3)+4>>2]=0;r=o;return n|0}function kb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;q=a+c|0;z=f+12|0;u=k[f+4>>2]|0;A=f+16|0;v=u+-1|0;w=d+16|0;r=d+12|0;y=a;s=e+16|0;t=e+12|0;h=k[z>>2]|0;g=k[A>>2]|0;p=a+b|0;while(1){if(p>>>0>=q>>>0){c=p;break}b=l[1009576+(l[p>>0]|0)>>0]|0;c=p+b|0;b=(l[1009576+(l[c>>0]|0)>>0]|0)+b|0;do if(b>>>0>5){o=qb(p,b)|0;a=k[d>>2]|0;m=k[w>>2]|0;n=(o>>>12)+o|0;i=(k[r>>2]|0)+-1&n;j=m&o;b=k[a+(i<<4)>>2]|0;if((b^j)&m){b=k[a+(i<<4)+4>>2]|0;if((b^j)&m){b=k[a+(i<<4)+8>>2]|0;if((b^j)&m){b=k[a+(i<<4)+12>>2]|0;if(!((b^j)&m))x=8}else x=8}else x=8}else x=8;if((x|0)==8){x=0;if(b){k[f+8040+(h<<3)>>2]=p-y;k[f+8040+(h<<3)+4>>2]=b&~m;h=h+1|0}}j=k[e>>2]|0;m=k[s>>2]|0;a=(k[t>>2]|0)+-1&n;i=m&o;b=k[j+(a<<4)>>2]|0;if((b^i)&m){b=k[j+(a<<4)+4>>2]|0;if((b^i)&m){b=k[j+(a<<4)+8>>2]|0;if((b^i)&m){b=k[j+(a<<4)+12>>2]|0;if((b^i)&m)break}}}if(b){k[f+16048+(g<<3)>>2]=p-y;k[f+16048+(g<<3)+4>>2]=b&~m;g=g+1|0}}while(0);if((g|0)<(v|0)&(h|0)<(u|0))p=c;else break}k[z>>2]=h;k[A>>2]=g;z=c-y|0;k[f+8040+(h<<3)>>2]=z;k[f+8040+(h<<3)+4>>2]=0;k[f+16048+(k[A>>2]<<3)>>2]=z;k[f+16048+(k[A>>2]<<3)+4>>2]=0;return}function lb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+16|0;C=D;t=a+b|0;u=a+c|0;B=f+8|0;b=k[B>>2]|0;A=k[f+4>>2]|0;v=C;k[v>>2]=0;k[v+4>>2]=0;v=C+4|0;w=d+16|0;x=d+12|0;y=e+12|0;z=e+16|0;g=0;c=(i[t>>0]|0)==32?t+1|0:t;do{if(c>>>0>=u>>>0)break;s=c+(l[979972+(l[c>>0]|0)>>0]|0)|0;s=s+(l[979972+(l[s>>0]|0)>>0]|0)|0;t=s+(l[979972+(l[s>>0]|0)>>0]|0)|0;t=t+(l[979972+(l[t>>0]|0)>>0]|0)|0;q=c;p=sb(c,t-q|0)|0;do if(!((p|0)==(k[C>>2]|0)?1:(p|0)==(k[v>>2]|0))){j=k[d>>2]|0;h=k[w>>2]|0;o=(p>>>12)+p|0;m=(k[x>>2]|0)+-1&o;n=h&p;c=k[j+(m<<4)>>2]|0;if((c^n)&h){c=k[j+(m<<4)+4>>2]|0;if((c^n)&h){c=k[j+(m<<4)+8>>2]|0;if((c^n)&h){c=k[j+(m<<4)+12>>2]|0;if(!((c^n)&h))m=8;else m=9}else m=8}else m=8}else m=8;if((m|0)==8){m=0;if(!c)m=9;else j=0}if((m|0)==9){c=k[y>>2]|0;if(!c)break;n=k[e>>2]|0;h=k[z>>2]|0;j=c+-1&o;m=h&p;c=k[n+(j<<4)>>2]|0;if((c^m)&h){c=k[n+(j<<4)+4>>2]|0;if((c^m)&h){c=k[n+(j<<4)+8>>2]|0;if((c^m)&h){c=k[n+(j<<4)+12>>2]|0;if((c^m)&h)break}}}if(!c)break;else j=-2147483648}k[C+(g<<2)>>2]=p;k[f+32+(b<<3)>>2]=q-a;k[f+32+(b<<3)+4>>2]=c&~h|j;b=b+1|0;g=g&1^1}while(0);c=(i[t>>0]|0)==32?t:s;if(c>>>0>>0)c=c+(l[980228+(l[c>>0]|0)>>0]|0)|0;else c=u}while((b|0)<(A|0));k[B>>2]=b;e=c-a|0;k[f+32+(b<<3)>>2]=e;k[f+32+(k[B>>2]<<3)+4>>2]=0;r=D;return e|0}function mb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;J=r;r=r+16|0;F=J;u=a+b|0;A=a+(c+1)|0;H=f+12|0;g=k[H>>2]|0;B=k[f+4>>2]|0;I=f+16|0;b=k[I>>2]|0;C=B+-1|0;k[F>>2]=0;k[F+4>>2]=0;k[F+8>>2]=0;k[F+12>>2]=0;u=(i[u>>0]|0)==32?u+1|0:u;x=F+8|0;y=e+16|0;z=e+12|0;E=a;v=d+16|0;w=d+12|0;n=0;a=g;g=0;q=u;D=u;j=u;while(1){if(D>>>0>=A>>>0){c=D;break}c=i[D>>0]|0;if(c<<24>>24==32){t=u;p=ub(u,j-t|0)|0;s=L;n=F;o=x;do if(!(((p|0)==(k[n>>2]|0)?(s|0)==(k[n+4>>2]|0):0)|((p|0)==(k[o>>2]|0)?(s|0)==(k[o+4>>2]|0):0))){h=F+(g<<3)|0;k[h>>2]=p;k[h+4>>2]=s;g=1-g|0;h=F+(g<<3)|0;c=k[h>>2]|0;h=k[h+4>>2]|0;do if(!((c|0)==0&(h|0)==0|(c|0)==(p|0)&(h|0)==(s|0))){c=vb(c,h,p,s)|0;j=L;m=k[e>>2]|0;o=k[y>>2]|0;n=k[z>>2]|0;h=rf(c|0,j|0,12)|0;h=of(h|0,L|0,c|0,j|0)|0;h=n+-1&h;j=rf(c|0,j|0,4)|0;j=o&j;c=k[m+(h<<4)>>2]|0;if((c^j)&o){c=k[m+(h<<4)+4>>2]|0;if((c^j)&o){c=k[m+(h<<4)+8>>2]|0;if((c^j)&o){c=k[m+(h<<4)+12>>2]|0;if((c^j)&o){c=n;break}}}}if(!c)c=n;else{k[f+16048+(b<<3)>>2]=q-E;k[f+16048+(b<<3)+4>>2]=c&~o;c=n;b=b+1|0}}else{c=k[z>>2]|0;o=k[y>>2]|0;m=k[e>>2]|0}while(0);q=rf(p|0,s|0,12)|0;q=of(q|0,L|0,p|0,s|0)|0;j=c+-1&q;p=rf(p|0,s|0,4)|0;h=o&p;c=k[m+(j<<4)>>2]|0;if((c^h)&o){c=k[m+(j<<4)+4>>2]|0;if((c^h)&o){c=k[m+(j<<4)+8>>2]|0;if((c^h)&o){c=k[m+(j<<4)+12>>2]|0;if(!((c^h)&o))G=17}else G=17}else G=17}else G=17;if((G|0)==17){G=0;if(c){k[f+16048+(b<<3)>>2]=t-E;k[f+16048+(b<<3)+4>>2]=c&~o;b=b+1|0}}m=k[d>>2]|0;n=k[v>>2]|0;h=(k[w>>2]|0)+-1&q;j=n&p;c=k[m+(h<<4)>>2]|0;if((c^j)&n){c=k[m+(h<<4)+4>>2]|0;if((c^j)&n){c=k[m+(h<<4)+8>>2]|0;if((c^j)&n){c=k[m+(h<<4)+12>>2]|0;if((c^j)&n)break}}}if(c){k[f+8040+(a<<3)>>2]=t-E;k[f+8040+(a<<3)+4>>2]=c&~n;a=a+1|0}}while(0);m=D+1|0;c=i[D>>0]|0;o=0;h=u;j=m}else{o=n+1|0;h=q;m=u}c=D+(l[1009576+(c&255)>>0]|0)|0;if((b|0)<(C|0)&(a|0)<(B|0)){n=o;q=h;D=c;j=(o|0)<9?c:j;u=m}else break}k[H>>2]=a;k[I>>2]=b;H=c-E|0;k[f+8040+(a<<3)>>2]=H;k[f+8040+(a<<3)+4>>2]=0;k[f+16048+(k[I>>2]<<3)>>2]=H;k[f+16048+(k[I>>2]<<3)+4>>2]=0;r=J;return}function nb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=(c|0)<8?c*12|0:100;e=c*5>>3;e=(e|0)<3?3:(e|0)>16?16:e;c=a-b|0;if((c|0)<(e|0))if((c|0)<1)d=0;else{b=(c*100|0)/(e|0)|0;d=(d|0)<(b|0)?d:b}return d|0}function ob(a,b){a=a|0;b=b|0;var c=0.0;if(b)if(a){if((b|0)>(a|0))c=+(b|0)/+(a|0);else c=+(a|0)/+(b|0);if(!(c<=1.5))if(c>4.0)a=0;else a=~~((4.0-c)*100.0/2.5);else a=100}else a=0;else a=100;return a|0}function pb(a,b){a=a|0;b=b|0;a=((Hc(a)|0)&255)<<8;return a|(l[980484+b>>0]|0)|0}function qb(a,b){a=a|0;b=b|0;var c=0;do if(b){c=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;if((b|0)<5){c=k[120+((b&3)<<2)>>2]&c;c=c>>>3^c;break}else{a=a+4|0;a=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=(a<<18^a)+(c>>>3^c)|0;break}}else c=0;while(0);return c|0}function rb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;do if((b|0)>=5){d=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;d=d>>>3^d;e=a+4|0;e=l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24;if((b|0)<9){a=k[120+((b&3)<<2)>>2]&e;d=(a<<4^a)+(d^c)|0;break}else{a=a+8|0;a=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);d=(d^c)+(e<<4^e)+(a<<2^a)|0;break}}else{d=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);d=d^c^d>>>3}while(0);return d|0}function sb(a,b){a=a|0;b=b|0;var c=0;if(!b)b=0;else{c=(i[a+-1>>0]|0)==32?17476:0;b=rb(a,b,(i[a+b>>0]|0)==32?c|1145307136:c)|0}return b|0}function tb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0;f=(i[a+-1>>0]|0)==32;e=f?c|17476:c;f=f?d:d;d=(i[a+b>>0]|0)==32;e=d?e|1145307136:e;f=d?f:f;switch(b+-1>>2|0){case 0:{b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=b;d=0;b=(rf(b|0,0,3)|0)^b;a=L;break}case 1:{h=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=rf(h|0,0,3)|0;g=L;c=a+4|0;b=k[120+((b&3)<<2)>>2]&(l[c>>0]|l[c+1>>0]<<8|l[c+2>>0]<<16|l[c+3>>0]<<24);c=of(b|0,0,h|0,0)|0;d=L;b=of((sf(b|0,0,4)|0)^b|0,L|0,j^h|0,g|0)|0;a=L;break}case 2:{j=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;g=rf(j|0,0,3)|0;h=L;m=a+4|0;m=l[m>>0]|l[m+1>>0]<<8|l[m+2>>0]<<16|l[m+3>>0]<<24;d=of(m|0,0,j|0,0)|0;c=L;h=of((sf(m|0,0,4)|0)^m|0,L|0,g^j|0,h|0)|0;j=L;a=a+8|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=of(d|0,c|0,b|0,0)|0;d=L;b=of(h|0,j|0,(sf(b|0,0,2)|0)^b|0,L|0)|0;a=L;break}case 3:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=rf(m|0,0,3)|0;h=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;c=of(g|0,0,m|0,0)|0;d=L;h=of((sf(g|0,0,4)|0)^g|0,L|0,j^m|0,h|0)|0;m=L;j=a+8|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=of(c|0,d|0,j|0,0)|0;c=L;j=of(h|0,m|0,(sf(j|0,0,2)|0)^j|0,L|0)|0;m=L;a=a+12|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=of(d|0,c|0,b|0,0)|0;d=L;b=of(j|0,m|0,(rf(b|0,0,8)|0)^b|0,L|0)|0;a=L;break}case 4:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;h=rf(m|0,0,3)|0;j=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;d=of(g|0,0,m|0,0)|0;c=L;j=of((sf(g|0,0,4)|0)^g|0,L|0,h^m|0,j|0)|0;m=L;h=a+8|0;h=l[h>>0]|l[h+1>>0]<<8|l[h+2>>0]<<16|l[h+3>>0]<<24;c=of(d|0,c|0,h|0,0)|0;d=L;h=of(j|0,m|0,(sf(h|0,0,2)|0)^h|0,L|0)|0;m=L;j=a+12|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=of(c|0,d|0,j|0,0)|0;c=L;j=of(h|0,m|0,(rf(j|0,0,8)|0)^j|0,L|0)|0;m=L;a=a+16|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=of(d|0,c|0,b|0,0)|0;d=L;b=of(j|0,m|0,(rf(b|0,0,4)|0)^b|0,L|0)|0;a=L;break}default:{m=l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24;j=rf(m|0,0,3)|0;h=L;g=a+4|0;g=l[g>>0]|l[g+1>>0]<<8|l[g+2>>0]<<16|l[g+3>>0]<<24;c=of(g|0,0,m|0,0)|0;d=L;h=of((sf(g|0,0,4)|0)^g|0,L|0,j^m|0,h|0)|0;m=L;j=a+8|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=of(c|0,d|0,j|0,0)|0;c=L;j=of(h|0,m|0,(sf(j|0,0,2)|0)^j|0,L|0)|0;m=L;h=a+12|0;h=l[h>>0]|l[h+1>>0]<<8|l[h+2>>0]<<16|l[h+3>>0]<<24;c=of(d|0,c|0,h|0,0)|0;d=L;h=of(j|0,m|0,(rf(h|0,0,8)|0)^h|0,L|0)|0;m=L;j=a+16|0;j=l[j>>0]|l[j+1>>0]<<8|l[j+2>>0]<<16|l[j+3>>0]<<24;d=of(c|0,d|0,j|0,0)|0;c=L;j=of(h|0,m|0,(rf(j|0,0,4)|0)^j|0,L|0)|0;m=L;a=a+20|0;b=k[120+((b&3)<<2)>>2]&(l[a>>0]|l[a+1>>0]<<8|l[a+2>>0]<<16|l[a+3>>0]<<24);c=of(d|0,c|0,b|0,0)|0;d=L;b=of(j|0,m|0,(rf(b|0,0,6)|0)^b|0,L|0)|0;a=L}}j=rf(c|0,d|0,17)|0;j=of(j|0,L|0,c|0,d|0)|0;m=L;h=rf(j|0,m|0,9)|0;m=of(h|0,L|0,j|0,m|0)|0;m=of(0,m&255|0,b^e|0,a^f|0)|0;return m|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if(!b){b=0;a=0}else{c=(i[a+-1>>0]|0)==32;e=c?17476:0;c=c?0:0;d=(i[a+b>>0]|0)==32;a=tb(a,b,d?e|1145307136:e,d?c:c)|0;b=L}L=b;return a|0}function vb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=rf(a|0,b|0,13)|0;e=L;b=sf(a|0,b|0,51)|0;d=of(f|b|0,e|L|0,c|0,d|0)|0;return d|0}function wb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0;h=r;r=r+48|0;i=h+24|0;k[i>>2]=0;k[i+4>>2]=1097857;k[i+8>>2]=23;k[i+12>>2]=26;f=kc(a,b,c,i,0,d,e,h,f,g)|0;r=h;return ((f|0)==26?0:f)|0}function xb(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;return kc(a,b,c,d,0,e,f,g,h,i)|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if(a<<16>>16){d=a&1023;e=k[b>>2]|0;do if((e|0)>0){c=0;while(1){f=b+4+(c<<1)|0;g=j[f>>1]|0;c=c+1|0;if((g&1023|0)==(d|0)){c=5;break}if((c|0)>=(e|0)){c=6;break}}if((c|0)==5){b=g<<16>>16>>10;a=a<<16>>16>>10;j[f>>1]=((b|0)>=(a|0)?b:a)<<10|d;break a}else if((c|0)==6)if((e|0)>13)break a;else break}while(0);k[b>>2]=e+1;j[b+4+(e<<1)>>1]=a}while(0);return}function zb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if(a<<16>>16){d=a&1023;e=k[b>>2]|0;do if((e|0)>0){c=0;while(1){f=b+4+(c<<1)|0;g=m[f>>1]|0;c=c+1|0;if((g&1023|0)==(d|0)){c=5;break}if((c|0)>=(e|0)){c=6;break}}if((c|0)==5){j[f>>1]=g+2048&64512|d;break a}else if((c|0)==6)if((e|0)>13)break a;else break}while(0);k[b>>2]=e+1;j[b+4+(e<<1)>>1]=a}while(0);return}function Ab(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0;if((k[a>>2]|0)>4){g=0;do{f=j[a+4+(g<<1)>>1]|0;d=f<<16>>16>>10;d=(d|0)>-1?d:0-d|0;a:do if((g|0)>0){e=g;while(1){b=e+-1|0;c=j[a+4+(b<<1)>>1]|0;h=c<<16>>16>>10;if((((h|0)>-1?h:0-h|0)|0)>=(d|0)){b=e;break a}j[a+4+(e<<1)>>1]=c;if((e|0)>1)e=b;else break}}else b=g;while(0);j[a+4+(b<<1)>>1]=f;g=g+1|0}while((g|0)<(k[a>>2]|0));k[a>>2]=4}return}function Bb(a){a=a|0;var b=0,c=0,d=0;d=i[a>>0]|0;b=(d&1)==0;d=b?(d&255)>>>1:k[a+4>>2]|0;if((d|0)>0){a=b?a+1|0:k[a+8>>2]|0;b=0;c=0;do{b=((i[a+c>>0]|0)==44&1)+b|0;c=c+1|0}while((c|0)!=(d|0))}else b=0;return b|0}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=c;c=0;a:while(1){if((c|0)<(g|0))f=c;else{c=0;break}while(1){d=f+g>>1;c=b+(d*12|0)|0;e=_d(k[c>>2]|0,a)|0;if((e|0)>=0)break;c=d+1|0;if((c|0)<(g|0))f=c;else{c=0;break a}}if((e|0)>0){g=d;c=f}else break}return c|0}function Db(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=181;b=0;a:while(1){if((b|0)<(f|0))e=b;else{b=0;break}while(1){c=e+f>>1;b=5776+(c<<3)|0;d=_d(k[b>>2]|0,a)|0;if((d|0)>=0)break;b=c+1|0;if((b|0)<(f|0))e=b;else{b=0;break a}}if((d|0)>0){f=c;b=e}else break}return b|0}function Eb(a){a=a|0;Ba(a|0)|0;cf()}function Fb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=c+-3|0;a:do if((d|0)>(b|0))do{e=a+b|0;e=l[e>>0]|l[e+1>>0]<<8|l[e+2>>0]<<16|l[e+3>>0]<<24;if((e^1010580540)+-16843009&(e&-2139062144^-2139062144)|0)break a;b=b+4|0}while((b|0)<(d|0));while(0);b:do if((b|0)<(c|0))while(1){if((i[a+b>>0]|0)==60)break b;b=b+1|0;if((b|0)>=(c|0)){b=-1;break}}else b=-1;while(0);return b|0}function Gb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do if((b|0)<(c|0))while(1){b:do switch(i[a+b>>0]|0){case 61:break a;case 34:{e=b+1|0;if((e|0)<(c|0)){d=b;b=e;while(1){switch(i[a+b>>0]|0){case 34:break b;case 92:{d=d+2|0;break}default:d=b}b=d+1|0;if((b|0)>=(c|0))break b}}else b=e;break}case 39:{e=b+1|0;if((e|0)<(c|0)){d=b;b=e;while(1){switch(i[a+b>>0]|0){case 39:break b;case 92:{d=d+2|0;break}default:d=b}b=d+1|0;if((b|0)>=(c|0))break b}}else b=e;break}default:{}}while(0);b=b+1|0;if((b|0)>=(c|0)){b=-1;break a}}else b=-1;while(0);return b|0}function Hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;g=Vd(d)|0;a:do if((c-b|0)>=(g|0)){f=g+b|0;while(1){if((c|0)<=(f|0))break;e=c+-1|0;if((i[a+e>>0]|0)==32)c=e;else break}c=c-g|0;if((c|0)>=(b|0)){c=a+c|0;if((g|0)>0){e=0;while(1){if((i[c+e>>0]|32|0)!=(i[d+e>>0]|0)){c=0;break a}e=e+1|0;if((e|0)>=(g|0)){c=1;break}}}else c=1}else c=0}else c=0;while(0);return c|0}function Ib(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Vd(d)|0;a:do if((c-b|0)>=(e|0)){c=c-e|0;b:do if((c|0)>(b|0))while(1){switch(i[a+b>>0]|0){case 39:case 34:case 32:break;default:break b}b=b+1|0;if((b|0)>=(c|0))break b}while(0);b=a+b|0;if((e|0)>0){c=0;while(1){if((i[b+c>>0]|32|0)!=(i[d+c>>0]|0)){b=0;break a}c=c+1|0;if((c|0)>=(e|0)){b=1;break}}}else b=1}else b=0;while(0);return b|0}function Jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;if((c|0)<(d|0)){f=1;do{e=l[b+c>>0]|0;g=(l[984554+e>>0]|0)>>>(f*3|0);f=g&3;do if(g&4|0)if(!f){Ce(a,1,i[984810+e>>0]|0);break}else{Ce(a,1,44);break}while(0);c=c+1|0}while((c|0)!=(d|0));if(!f)Ce(a,1,44)}return}function Kb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;a:do if((c|0)<(d|0)){b:while(1){switch(i[b+c>>0]|0){case 39:case 34:break b;case 32:break;default:{f=5;break a}}c=c+1|0;if((c|0)>=(d|0)){f=5;break a}}if((c|0)>=0){e=c+1|0;c:do if((e|0)<(d|0)){c=e;d:while(1){switch(i[b+c>>0]|0){case 39:case 34:break d;case 62:{f=8;break d}case 61:{f=9;break d}case 60:{f=10;break d}case 38:{f=11;break d}default:{}}c=c+1|0;if((c|0)>=(d|0))break c}if((f|0)==8)c=c+-1|0;else if((f|0)==9)c=c+-1|0;else if((f|0)==10)c=c+-1|0;else if((f|0)==11)c=c+-1|0;if((c|0)>=0){Jb(a,b,e,c);break a}}while(0);ze(a,1097857,0)}else f=5}else f=5;while(0);if((f|0)==5)ze(a,1097857,0);return}function Lb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0;o=r;r=r+32|0;n=o;d=i[a>>0]|0;l=a+4|0;e=k[l>>2]|0;c=(d&1)==0?(d&255)>>>1:e;if((c|0?(Bb(a)|0)<=4:0)?(c|0)>0:0){g=a+8|0;h=a+1|0;f=0;do{c=Ie(a,f)|0;if((c|0)==-1){if(!(d&1))e=(d&255)>>>1}else e=c;c=e-f|0;do if((c|0)<17){tf(n|0,((d&1)==0?h:k[g>>2]|0)+f|0,c|0)|0;i[n+c>>0]=0;c=Cb(n,136,213)|0;if(c|0){yb(j[c+8>>1]|0,b);yb(j[c+10>>1]|0,b);break}c=me(n,45)|0;if(c|0)i[c>>0]=0;if((Vd(n)|0)<4?(m=Cb(n,2692,257)|0,m|0):0){yb(j[m+8>>1]|0,b);yb(j[m+10>>1]|0,b)}}while(0);f=e+1|0;d=i[a>>0]|0;e=k[l>>2]|0}while((f|0)<(((d&1)==0?(d&255)>>>1:e)|0))}r=o;return}function Mb(a,b){a=a|0;b=b|0;var c=0,d=0;c=r;r=r+16|0;d=c;Jb(d,a,0,Vd(a)|0);Lb(d,b);Ae(d);r=c;return}function Nb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=r;r=r+16|0;d=e;c=Vd(a)|0;if((c|0)<=3){ne(d,a);i[d+3>>0]=0;if((c|0)>0){a=0;do{f=d+a|0;i[f>>0]=l[f>>0]|0|32;a=a+1|0}while((a|0)!=(c|0))}a=Db(d)|0;if(a|0){zb(j[a+4>>1]|0,b);zb(j[a+6>>1]|0,b)}}r=e;return}function Ob(a,b){a=a|0;b=b|0;switch(a|0){case 62:case 48:case 46:case 45:case 14:{zb(4112,b);break}case 47:case 20:case 13:{zb(4165,b);break}case 12:case 21:case 11:case 10:{zb(4104,b);break}case 44:case 16:{zb(4105,b);break}default:{}}return}function Pb(a,b){a=a|0;b=b|0;zb(a+8192&65535,b);return}function Qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;f=r;r=r+80|0;e=f;d=f+8|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;if((k[b>>2]|0)>0){c=0;do{g=j[b+4+(c<<1)>>1]|0;h=Ec(g&1023)|0;k[e>>2]=h;k[e+4>>2]=g<<16>>16>>10;ue(d,985273,e);Fe(a,d);c=c+1|0}while((c|0)<(k[b>>2]|0))}r=f;return}function Rb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;D=r;r=r+16|0;C=D;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;y=(c|0)<8192?c:8192;a:do if((y|0)>0){s=C+4|0;t=a+1|0;u=C+8|0;v=C+1|0;w=a+8|0;x=a+4|0;c=0;do{c=Fb(b,c,y)|0;if((c|0)<0)break a;d=c+1|0;if((d|0)<(y|0))c=d;else break a;b:while(1){switch(i[b+c>>0]|0){case 62:break b;case 60:{z=6;break b}case 38:{z=7;break b}default:{}}c=c+1|0;if((c|0)>=(y|0))break a}if((z|0)==6){z=0;c=c+-1|0}else if((z|0)==7){z=0;c=c+-1|0}if((c|0)<0)break a;if((((((!(Ib(b,d,c,985280)|0)?!(Ib(b,d,c,985284)|0):0)?!(Ib(b,d,c,985290)|0):0)?!(Ib(b,d,c,985298)|0):0)?!(Ib(b,d,c,985304)|0):0)?!(Ib(b,d,c,985309)|0):0)?(A=Ib(b,d,c,985312)|0,B=Gb(b,d,c)|0,(B|0)>-1):0){g=B;f=0;e=d;while(1){do if(A){if(Hb(b,e,g,985318)|0?Ib(b,g+1|0,c,985330)|0:0){z=25;break}if(Hb(b,e,g,985348)|0){d=g+1|0;if(!(Ib(b,d,c,985354)|0)?!(f|(Ib(b,d,c,985367)|0)):0){d=0;z=26}else z=25}else z=24}else z=24;while(0);if((z|0)==24)if(f)z=25;else{d=0;z=26}if((z|0)==25)if(Hb(b,e,g,985377)|0){d=1;z=29}else{d=1;z=26}if((z|0)==26){z=0;if(!(Hb(b,e,g,985386)|0)?!(Hb(b,e,g,985392)|0):0)e=g+1|0;else z=29}if((z|0)==29){z=0;p=g+1|0;Kb(C,b,p,c);q=i[C>>0]|0;f=(q&1)==0;q=f?(q&255)>>>1:k[s>>2]|0;c:do if(q|0){e=i[a>>0]|0;if(!(e&1)){e=(e&255)>>>1;g=t}else{e=k[x>>2]|0;g=k[w>>2]|0}l=f?v:k[u>>2]|0;d:do if(e>>>0>=q>>>0){m=g+e|0;n=l+q|0;o=g;if((e|0)<(q|0))break;h=m+(1-q)|0;if((h|0)==(g|0))break;j=i[l>>0]|0;e=g;e:while(1){if((i[e>>0]|0)==j<<24>>24){f=e;g=l;do{g=g+1|0;if((g|0)==(n|0))break e;f=f+1|0}while((i[f>>0]|0)==(i[g>>0]|0))}e=e+1|0;if((e|0)==(h|0))break d}if(!((e|0)==(m|0)|(e-o|0)==-1))break c}while(0);Ee(a,l,q)}while(0);Ae(C);e=p}g=Gb(b,e,c)|0;if((g|0)<=-1)break;else f=d}}c=c+1|0}while((c|0)<(y|0))}while(0);c=i[a>>0]|0;d=(c&1)==0;if(d)e=(c&255)>>>1;else e=k[a+4>>2]|0;if(e>>>0>1){if(d)c=(c&255)>>>1;else c=k[a+4>>2]|0;He(a,c+-1|0)}r=D;return}function Sb(a,b){a=a|0;b=b|0;var c=0;c=(b|0)<32?b:32;a:do if((c|0)>0){b=0;while(1){if((i[a+~b>>0]|0)==32)break a;b=b+1|0;if((b|0)>=(c|0)){b=0;break}}while(1){if((i[a+(0-b)>>0]&-64)<<24>>24!=-128)break a;b=b+1|0;if((b|0)>=(c|0)){b=0;break}}}else b=0;while(0);return b|0}function Tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;d=(b|0)<32?b:32;c=0;while(1){if((c|0)>=(d|0)){e=3;break}b=c+1|0;if((i[a+c>>0]|0)==32)break;else c=b}a:do if((e|0)==3)if((d|0)>0){b=0;while(1){if((i[a+b>>0]&-64)<<24>>24!=-128)break a;b=b+1|0;if((b|0)>=(d|0)){b=0;break}}}else b=0;while(0);return b|0}function Ub(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0;j=a+b|0;e=k[c>>2]|0;if((b|0)>0){b=0;h=a;do{f=i[h>>0]|0;g=f&255;do if((f&255)>=192){if((g&224|0)==192){g=l[h+1>>0]|0|g<<8;a=2;break}a=i[h+1>>0]|0;f=i[h+2>>0]|0;if((g&240|0)==224){g=(a&255)<<8|g<<16|f&255;a=3;break}else{g=(a&255)<<16|g<<24|(f&255)<<8|(l[h+3>>0]|0);a=4;break}}else a=1;while(0);h=h+a|0;m=d+(e<<2)|0;f=k[m>>2]|0;k[m>>2]=g;b=((g|0)==(f|0)?a:0)+b|0;e=(g^e<<4)&4095}while(h>>>0>>0)}else b=0;k[c>>2]=e;return b|0}function Vb(a,b){a=a|0;b=b|0;var c=0,d=0;c=b&-4;if((c|0)>0){d=0;b=0;do{b=((i[a+d>>0]|0)==32&1)+b+((i[a+(d|1)>>0]|0)==32&1)+((i[a+(d|2)>>0]|0)==32&1)+((i[a+(d|3)>>0]|0)==32&1)|0;d=d+4|0}while((d|0)<(c|0))}else b=0;return b|0}function Wb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;s=a+b|0;e=k[c>>2]|0;if((b|0)>0){q=a;p=0;r=a;m=a;n=0;while(1){g=i[r>>0]|0;j=g&255;f=q+1|0;i[q>>0]=g;do if(g<<24>>24!=32)if((g&255)>=192){if((j&224|0)==192){h=r+1|0;i[f>>0]=i[h>>0]|0;j=l[h>>0]|0|j<<8;f=q+2|0;h=p;o=2;break}h=r+1|0;i[f>>0]=i[h>>0]|0;g=r+2|0;f=q+3|0;i[q+2>>0]=i[g>>0]|0;if((j&240|0)==224){j=(l[h>>0]|0)<<8|j<<16|(l[g>>0]|0);h=p;o=3;break}else{o=r+3|0;i[f>>0]=i[o>>0]|0;j=(l[h>>0]|0)<<16|j<<24|(l[g>>0]|0)<<8|(l[o>>0]|0);f=q+4|0;h=p;o=4;break}}else{h=p;o=1}else{m=(p<<1|0)>(n|0)?m:f;f=m;h=0;o=1;n=0}while(0);r=r+o|0;q=d+(e<<2)|0;g=k[q>>2]|0;k[q>>2]=j;e=(j^e<<4)&4095;if(r>>>0>=s>>>0)break;else{q=f;p=((j|0)==(g|0)?o:0)+h|0;n=o+n|0}}}else f=a;k[c>>2]=e;e=f-a|0;if((e|0)>=(b+-3|0)){if((e|0)<(b|0))i[f>>0]=32}else{i[f>>0]=32;i[f+1>>0]=32;i[f+2>>0]=32;i[f+3>>0]=0}return e|0}function Xb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0;o=r;r=r+16|0;m=o;h=a+b|0;k[m>>2]=0;n=jf(16384)|0;qf(n|0,0,16384)|0;if((b|0)>0){j=h;c=a;l=a+1|0;d=a;e=0;f=a;do{g=j-f|0;g=(g|0)>48?48:g;while(1)if((i[f+g>>0]&-64)<<24>>24==-128)g=g+1|0;else break;p=Vb(f,g)|0;if((p|0)<12&(Ub(f,g,m,n)|0)<19){if(e){p=Tb(f,g)|0;e=g-p|0;f=f+p|0}else e=g;if((e|0)>0){uf(d|0,f|0,e|0)|0;d=d+e|0;g=e;e=0}else{g=e;e=0}}else if(!e){d=d+(0-(Sb(d,d-c|0)|0))|0;if((d|0)==(a|0)){i[a>>0]=32;d=l;e=1}else e=1}else e=1;f=f+g|0}while(f>>>0>>0)}else{c=a;d=a}c=d-c|0;if((c|0)>=(b+-3|0)){if((c|0)<(b|0))i[d>>0]=32}else{i[d>>0]=32;i[d+1>>0]=32;i[d+2>>0]=32;i[d+3>>0]=0}kf(n);r=o;return c|0}function Yb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=r;r=r+16|0;d=e;if((b|0)<256)b=0;else{k[d>>2]=0;c=jf(16384)|0;qf(c|0,0,16384)|0;if((Vb(a,256)|0)<64?(Ub(a,256,d,c)|0)<171:0)b=0;else b=1;kf(c)}r=e;return b|0}function Zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;y=r;r=r+48|0;x=y+32|0;t=y+16|0;s=y;q=0;do{d=j[a+568+(q<<1)>>1]|0;n=d&65535;do if(((((d<<16>>16!=-1?(o=k[a+616+(q<<2)>>2]|0,o|0):0)?(p=(k[a+808+(q<<2)>>2]|0)/(o|0)|0,(d&65535)<165&(p|0)<41):0)?(i=k[7224+(n<<2)>>2]|0,(i|0)!=26):0)?(l=rd(a,i&65535)|0,(l|0)>=0):0)?(m=k[a+616+(l<<2)>>2]|0,m|0):0){d=(k[a+808+(l<<2)>>2]|0)/(m|0)|0;e=(d|0)<(p|0);if(!e?!((n|0)<(i|0)&(d|0)==(p|0)):0){f=q;g=0;h=l}else{f=l;g=1;h=q}z=e?p:d;e=m+o|0;z=ha((z|0)>41?z:41,e)|0;j[a+568+(f<<1)>>1]=-1;k[a+712+(f<<2)>>2]=0;k[a+808+(f<<2)>>2]=0;k[a+712+(h<<2)>>2]=e;k[a+808+(h<<2)>>2]=z;if(!(c|(e|0)>9&b^1))if(g){h=Ec(i)|0;z=Ec(n)|0;k[s>>2]=h;k[s+4>>2]=d;k[s+8>>2]=m;k[s+12>>2]=z;pe(941016,985398,s);break}else{n=Ec(n)|0;z=Ec(i)|0;k[t>>2]=n;k[t+4>>2]=p;k[t+8>>2]=o;k[t+12>>2]=z;pe(941016,985398,t);break}}while(0);q=q+1|0}while((q|0)!=24);f=0;do{d=a+568+(f<<1)|0;z=j[d>>1]|0;e=z&65535;if(((z<<16>>16!=-1?(u=k[a+616+(f<<2)>>2]|0,v=a+808+(f<<2)|0,u|0):0)?(w=(k[v>>2]|0)/(u|0)|0,(w|0)<=40):0)?(j[d>>1]=-1,k[a+712+(f<<2)>>2]=0,k[v>>2]=0,!(c|(u|0)>9&b^1)):0){z=Ec(e)|0;k[x>>2]=z;k[x+4>>2]=w;k[x+8>>2]=u;pe(941016,985425,x)}f=f+1|0}while((f|0)!=24);r=y;return}function _b(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=c+616+(b<<2)|0;k[e>>2]=(k[c+616+(a<<2)>>2]|0)+(k[e>>2]|0);e=c+712+(b<<2)|0;d=c+712+(a<<2)|0;k[e>>2]=(k[d>>2]|0)+(k[e>>2]|0);e=c+808+(b<<2)|0;b=c+808+(a<<2)|0;k[e>>2]=(k[b>>2]|0)+(k[e>>2]|0);j[c+568+(a<<1)>>1]=-1;k[d>>2]=0;k[b>>2]=0;return}function $b(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0;j=r;r=r+16|0;i=j;f=b^1|c;g=0;do{d=m[a+568+(g<<1)>>1]|0;b=Fc(d)|0;a:do if(b|0){h=g;do{h=h+1|0;if((h|0)>=24)break a;e=m[a+568+(h<<1)>>1]|0}while((Fc(e)|0)!=(b|0));b=(k[a+616+(g<<2)>>2]|0)<(k[a+616+(h<<2)>>2]|0);c=b?g:h;if(!f){l=k[a+616+(c<<2)>>2]|0;n=(k[a+808+(c<<2)>>2]|0)/((l|0?l:1)|0)|0;o=Ec(b?d:e)|0;e=Ec(b?e:d)|0;k[i>>2]=o;k[i+4>>2]=n;k[i+8>>2]=l;k[i+12>>2]=e;pe(941016,985446,i)}_b(c,b?h:g,a)}while(0);g=g+1|0}while((g|0)!=24);r=j;return}function ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;l=r;r=r+48|0;h=l+32|0;j=l+24|0;g=l+16|0;f=l;se(985487,34,1,941016);e=k[a>>2]|0;if((e|0)!=26){m=Dc(e)|0;e=i[d>>0]|0?1097857:985485;d=k[b>>2]|0;k[f>>2]=m;k[f+4>>2]=e;k[f+8>>2]=d;pe(941016,985522,f)}e=k[a+4>>2]|0;if((e|0)!=26){f=Dc(e)|0;m=k[b+4>>2]|0;k[g>>2]=f;k[g+4>>2]=m;pe(941016,985535,g)}e=k[a+8>>2]|0;if((e|0)!=26){g=Dc(e)|0;m=k[b+8>>2]|0;k[j>>2]=g;k[j+4>>2]=m;pe(941016,985535,j)}k[h>>2]=k[c>>2];pe(941016,985546,h);se(1017206,5,1,941016);r=l;return}function bc(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var l=0.0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,u=0,v=0;k[c>>2]=0;n=c+4|0;k[n>>2]=0;r=c+8|0;k[r>>2]=0;k[d>>2]=26;m=d+4|0;k[m>>2]=26;q=d+8|0;k[q>>2]=26;k[e>>2]=0;u=e+4|0;k[u>>2]=0;v=e+8|0;k[v>>2]=0;o=f+8|0;s=f+16|0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;k[f+20>>2]=0;k[g>>2]=b;i[h>>0]=0;t=j[a+568>>1]|0;switch(t<<16>>16){case 26:case -1:{f=0;break}default:{k[d>>2]=t&65535;d=k[a+616>>2]|0;k[c>>2]=(k[a+808>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+712>>2]<<10|0)/(d|0)|0|0);p[f>>3]=l;f=d}}d=j[a+570>>1]|0;switch(d<<16>>16){case 26:case -1:{c=0;break}default:{k[m>>2]=d&65535;d=k[a+620>>2]|0;k[n>>2]=(k[a+812>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+716>>2]<<10|0)/(d|0)|0|0);p[o>>3]=l;c=d}}d=j[a+572>>1]|0;switch(d<<16>>16){case 26:case -1:{d=0;break}default:{k[q>>2]=d&65535;d=k[a+624>>2]|0;k[r>>2]=(k[a+816>>2]|0)/((d|0?d:1)|0)|0;if((d|0)<1)l=0.0;else l=+((k[a+720>>2]<<10|0)/(d|0)|0|0);p[s>>3]=l}}c=c+f|0;d=d+c|0;if((d|0)>(b|0)){k[g>>2]=d;b=d}r=(b|0)<1?1:b;f=(f*100|0)/(r|0)|0;k[e>>2]=f;s=(c*100|0)/(r|0)|0;c=((d*100|0)/(r|0)|0)-s|0;k[v>>2]=c;d=s-f|0;k[u>>2]=d;if((d|0)<(c|0)){d=d+1|0;k[u>>2]=d;k[v>>2]=c+-1}if((f|0)<(d|0)){k[e>>2]=f+1;k[u>>2]=d+-1}k[g>>2]=b;switch(t<<16>>16){case 26:case -1:{d=0;break}default:{d=k[a+616>>2]|0;d=((k[a+808>>2]|0)/((d|0?d:1)|0)|0|0)>40&1}}i[h>>0]=d;i[h>>0]=(100-(k[e>>2]|0)-(k[u>>2]|0)-(k[v>>2]|0)|0)>20?0:d;return}function cc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;y=r;r=r+32|0;w=y+8|0;v=y;q=y+12|0;k[q>>2]=k[1971];k[q+4>>2]=k[1972];k[q+8>>2]=k[1973];h=k[c>>2]|0;k[d>>2]=k[b>>2];i[e>>0]=(h|0)>1&1;j=0;m=0;l=0;p=3;while(1){if((k[b+(m<<2)>>2]|0)==25){o=(k[c+(m<<2)>>2]|0)+l|0;n=m+1|0;if((n|0)<3){h=m;j=n;while(1){k[q+(h<<2)>>2]=k[q+(j<<2)>>2];h=j+1|0;if((h|0)==3)break;else{u=j;j=h;h=u}}j=k[q>>2]|0}l=p+-1|0;h=((k[c>>2]|0)*100|0)/(101-o|0)|0;k[d>>2]=k[b+(j<<2)>>2];if((k[c+(j<<2)>>2]|0)<2){i[e>>0]=0;m=n;s=j;t=o;u=l}else{m=n;s=j;t=o;u=l}}else{m=m+1|0;s=j;t=l;u=p}if((m|0)==3)break;else{j=s;l=t;p=u}}o=k[q+4>>2]|0;p=k[c+(o<<2)>>2]|0;n=ha(p,a)|0;o=b+(o<<2)|0;l=k[b+(s<<2)>>2]|0;m=(l|0)==0;a:do if(m){j=k[o>>2]|0;switch(j|0){case 26:case 0:{x=24;break a}default:{}}if((n|0)>1499&(p|0)>16){h=(p*100|0)/(101-t-(k[c+(s<<2)>>2]|0)|0)|0;k[d>>2]=j;if((p|0)<2)i[e>>0]=0}else x=23}else{b=l+-4|0;if(b>>>0<11?(1035>>>(b&2047)&1)!=0:0){j=k[o>>2]|0;if(j>>>0<15){if(16561>>>(j&32767)&1){x=23;break}}else if((j|0)==26){x=23;break}if((n|0)>1499&(p|0)>19){h=(p*100|0)/(101-t-(k[c+(s<<2)>>2]|0)|0)|0;k[d>>2]=j;if((p|0)<2)i[e>>0]=0}else x=23}else x=23}while(0);if((x|0)==23){j=k[o>>2]|0;x=24}do if((x|0)==24){if(!j){if(m)break;h=((k[c+(s<<2)>>2]|0)*100|0)/(101-t-p|0)|0;break}x=j+-4|0;if(x>>>0<11?(1035>>>(x&2047)&1)!=0:0){if(l>>>0<15?16561>>>(l&32767)&1:0)break;h=((k[c+(s<<2)>>2]|0)*100|0)/(101-t-p|0)|0}}while(0);if((h|0)<26){if(!(f^1|g)){x=Ec(k[d>>2]|0)|0;k[v>>2]=x;k[v+4>>2]=h;pe(941016,985557,v)}k[d>>2]=26;i[e>>0]=0}if((h|0)<51)i[e>>0]=0;if((100-(k[c>>2]|0)-(k[c+4>>2]|0)-(k[c+8>>2]|0)|0)>20)i[e>>0]=0;if(!u){if(!(f^1|g)){x=Ec(k[d>>2]|0)|0;k[w>>2]=x;pe(941016,985593,w)}k[d>>2]=26;i[e>>0]=0}r=y;return}function dc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(Jc(a)|0){d=c+16|0;e=k[d>>2]|0;k[c+20+(e<<2)>>2]=b;k[d>>2]=e+1&3}if(Kc(a)|0){e=c+36|0;d=k[e>>2]|0;k[c+40+(d<<2)>>2]=b;k[e>>2]=d+1&3}return}function ec(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=pb(b,1)|0;if(Jc(a)|0?Jc(b)|0:0){e=c+56|0;f=k[e>>2]|0;k[c+60+(f<<2)>>2]=d;k[e>>2]=f+1&3}if(Kc(a)|0?Kc(b)|0:0){f=c+76|0;e=k[f>>2]|0;k[c+80+(e<<2)>>2]=d;k[f>>2]=e+1&3}return}function fc(a,b){a=a|0;b=b|0;var c=0,d=0;switch(a|0){case 16:{ec(16,69,b);break}case 69:{ec(69,16,b);break}default:{c=Fc(a)|0;if(c|0){d=0;do{if(!((d|0)==(a|0)|(c|0)!=(Fc(d)|0)))ec(a,d,b);d=d+1|0}while((d|0)!=512)}}}return}function gc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,l=0,n=0,o=0,p=0;p=r;r=r+64|0;h=p+8|0;g=p;n=p+32|0;o=p+16|0;l=p+12|0;k[n>>2]=0;if(!c){Rb(o,a,b);Lb(o,n);if(i[e+5>>0]|0?(c=i[o>>0]|0,f=(c&1)==0,(f?(c&255)>>>1:k[o+4>>2]|0)|0):0){c=k[e>>2]|0;k[g>>2]=f?o+1|0:k[o+8>>2]|0;pe(c,985624,g)}Ae(o)}if(d|0){f=k[d>>2]|0;if(f|0?i[f>>0]|0:0)Mb(f,n);f=k[d+4>>2]|0;if(f|0?i[f>>0]|0:0)Nb(f,n);f=k[d+8>>2]|0;if((f|0)!=23)Ob(f,n);f=k[d+12>>2]|0;if((f|0)!=26)Pb(f,n)}Ab(n);if(i[e+5>>0]|0){Qb(o,n);d=i[o>>0]|0;f=(d&1)==0;if((f?(d&255)>>>1:k[o+4>>2]|0)|0){d=k[e>>2]|0;k[h>>2]=f?o+1|0:k[o+8>>2]|0;pe(d,985648,h)}Ae(o)}d=k[n>>2]|0;c=(d|0)>0;if(c){b=0;do{a=j[n+4+(b<<1)>>1]|0;f=a&1023;a=a<<16>>16>>10;if((a|0)>0)dc(f,pb(f,a)|0,e);b=b+1|0}while((b|0)<(d|0))}k[l>>2]=0;hc(o,l);g=k[o>>2]|0;if(c){b=g+40|0;f=0;while(1){l=m[n+4+(f<<1)>>1]&1023;h=g+((Fc(l)|0)<<2)|0;k[h>>2]=(k[h>>2]|0)+1;switch(l|0){case 16:{k[b>>2]=(k[b>>2]|0)+1;break}case 69:{k[b>>2]=(k[b>>2]|0)+1;break}default:{}}f=f+1|0;if((f|0)==(d|0)){a=0;break}}do{l=j[n+4+(a<<1)>>1]|0;f=l&1023;a:do if((l<<16>>16>>10|0)>0){l=Fc(f)|0;if((l|0)>0?(k[g+(l<<2)>>2]|0)==1:0)fc(f,e);switch(f|0){case 16:case 69:break;default:break a}if((k[b>>2]|0)==1)fc(f,e)}while(0);a=a+1|0}while((a|0)!=(d|0))}b=g;if(g|0){f=o+4|0;a=k[f>>2]|0;if((a|0)!=(g|0))k[f>>2]=a+(~((a+-4-b|0)>>>2)<<2);Qe(g)}r=p;return}function hc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;k[a>>2]=0;e=a+4|0;k[e>>2]=0;k[a+8>>2]=0;ic(a);c=k[e>>2]|0;a=11;d=c;while(1){k[d>>2]=k[b>>2];a=a+-1|0;if(!a)break;else d=d+4|0}k[e>>2]=c+44;return}function ic(a){a=a|0;var b=0;b=gf(44)|0;k[a+4>>2]=b;k[a>>2]=b;k[a+8>>2]=b+44;return}function jc(a){a=a|0;var b=0,c=0,d=0;c=k[a>>2]|0;d=c;if(c|0){a=a+4|0;b=k[a>>2]|0;if((b|0)!=(c|0))k[a>>2]=b+(~((b+-4-d|0)>>>2)<<2);Qe(c)}return}function kc(a,b,c,d,e,f,g,h,j,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;U=r;r=r+3488|0;S=U+3112|0;O=U+3104|0;F=U+3096|0;E=U+3088|0;R=U+3080|0;L=U+3072|0;I=U+3064|0;H=U+3056|0;J=U+3040|0;C=U+3032|0;p=U+3024|0;o=U+3016|0;D=U+2112|0;m=U+3468|0;n=U+3308|0;z=U+3320|0;q=U;T=U+3168|0;A=U+3144|0;y=U+3136|0;G=U+3124|0;Q=U+3120|0;k[f>>2]=26;K=f+4|0;k[K>>2]=26;M=f+8|0;k[M>>2]=26;k[g>>2]=0;N=g+4|0;k[N>>2]=0;P=g+8|0;k[P>>2]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;k[h+16>>2]=0;k[h+20>>2]=0;k[j>>2]=0;i[l>>0]=0;if(e&8192|0){ze(D,a,b);if(!(e&512)){lc(n);B=(i[n>>0]&1)==0?n+1|0:k[n+8>>2]|0;k[p>>2]=b;k[p+4>>2]=B;pe(941016,985693,p);Ae(n)}else{mc(m);B=(i[m>>0]&1)==0?m+1|0:k[m+8>>2]|0;k[o>>2]=b;k[o+4>>2]=B;pe(941016,985674,o);Ae(m)}Ae(D)}if(!b)m=26;else{pd(D);k[z>>2]=941016;i[z+4>>0]=e>>>8&1;w=e>>>9&1;i[z+5>>0]=w;x=z+6|0;i[x>>0]=e>>>10&1;i[z+7>>0]=e>>>11&1;k[z+12>>2]=26;t=z+8|0;k[t>>2]=0;k[z+140>>2]=7896;o=z+144|0;k[o>>2]=0;m=z+16|0;n=m+120|0;do{k[m>>2]=0;m=m+4|0}while((m|0)<(n|0));u=e>>>12;gc(a,b,c,d,z);kd(q);kd(q+528|0);kd(q+1056|0);kd(q+1584|0);uc(T,a,b,c);k[o>>2]=T;n=A+4|0;o=A+12|0;k[A>>2]=0;k[A+4>>2]=0;k[A+8>>2]=0;k[A+12>>2]=0;k[A+16>>2]=26;k[y>>2]=0;s=jf(16384)|0;p=(e&4|0)!=0;if(p)qf(s|0,0,16384)|0;q=(e&2|0)==0;v=(e&1|0)!=0;B=0;while(1){if(!(Ac(T,A)|0)){o=21;break}m=k[n>>2]|0;if(q){if(!(v|(m|0)<2049)?Yb(k[A>>2]|0,m)|0:0){o=15;break}}else{m=Xb(k[A>>2]|0,m)|0;k[n>>2]=m}if(p){m=Wb(k[A>>2]|0,m,y,s)|0;k[n>>2]=m}k[t>>2]=k[o>>2];jd(A,z,D);B=m+B|0}if((o|0)==15){if(w|0){k[C>>2]=B;pe(941016,985708,C)}kf(s);m=kc(a,b,c,d,e|2,f,g,h,j,l)|0}else if((o|0)==21){kf(s);n=(w|0)!=0;m=u&1;if(n&(m|0)==0){if(!(i[x>>0]|0))se(1017206,5,1,941016);td(D)}p=(m|0)!=0;$b(D,n,p);sd(D);bc(D,B,G,f,g,h,j,l);do if(!(v|(B|0)<257)){if(i[l>>0]|0){m=k[g>>2]|0;if((m|0)>69){o=29;break}if(((k[N>>2]|0)+m|0)>92){o=29;break}}if(!(p|n^1))ac(f,g,j,l);if((B|0)<256){if(n){k[E>>2]=B;pe(941016,985862,E)}m=kc(a,b,c,d,e|93,f,g,h,j,l)|0;break}else{if(n){k[F>>2]=B;pe(941016,985937,F)}m=kc(a,b,c,d,e|13,f,g,h,j,l)|0;break}}else o=29;while(0);if((o|0)==29){Zb(D,n,p);sd(D);bc(D,B,G,f,g,h,j,l);cc(B,f,g,Q,l,n,p);m=n^1;if(!(p|m)){o=0;do{n=k[f+(o<<2)>>2]|0;if((n|0)!=26){j=Ec(n)|0;E=k[G+(o<<2)>>2]|0;F=k[g+(o<<2)>>2]|0;k[J>>2]=j;k[J+4>>2]=E;k[J+8>>2]=F;pe(941016,985771,J)}o=o+1|0}while((o|0)!=3);k[H>>2]=B;pe(941016,985761,H);H=Dc(k[Q>>2]|0)|0;J=i[l>>0]|0?32:42;k[I>>2]=H;k[I+4>>2]=J;pe(941016,985785,I);se(985793,9,1,941016)}if(m|p^1)m=k[Q>>2]|0;else{se(985803,37,1,941016);m=k[f>>2]|0;if((m|0)!=26){J=Ec(m)|0;g=k[g>>2]|0;k[L>>2]=J;k[L+4>>2]=g;pe(941016,985841,L)}m=k[K>>2]|0;if((m|0)!=26){L=Ec(m)|0;N=k[N>>2]|0;k[O>>2]=L;k[O+4>>2]=N;pe(941016,985841,O)}m=k[M>>2]|0;if((m|0)!=26){O=Ec(m)|0;P=k[P>>2]|0;k[S>>2]=O;k[S+4>>2]=P;pe(941016,985841,S)}m=k[Q>>2]|0;Q=Dc(m)|0;S=i[l>>0]|0?32:42;k[R>>2]=Q;k[R+4>>2]=S;pe(941016,985785,R);se(1017206,5,1,941016)}}}vc(T)}r=U;return m|0}function lc(a){a=a|0;ze(a,1097857,0);return}function mc(a){a=a|0;ze(a,1097857,0);return}function nc(a){a=a|0;a:do if(a>>>0>=256){if(a>>>0>=55296){switch(a&-16|0){case 64992:case 64976:{a=65533;break a}default:{}}if((a&65534|0)==65534)a=65533;else a=(a+-57344|0)>>>0<1056768?a:65533}}else a=k[7932+(a<<2)>>2]|0;while(0);return a|0}function oc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;a:do if((b|0)>0){g=0;c=0;d=0;while(1){f=i[a+g>>0]|0;if((f&-64)<<24>>24!=-128){e=(d|0)>7|((c|0)>24?1:((l[993817+((f&255)>>>4)>>0]|0)+g|0)>(b|0));if(e)break a;else d=(e&1^1)+d|0}switch(f<<24>>24){case 60:{f=1097824+c|0;i[f>>0]=38;i[f+1>>0]=108;i[f+2>>0]=116;i[f+3>>0]=59;c=c+4|0;break}case 62:{f=1097824+c|0;i[f>>0]=38;i[f+1>>0]=103;i[f+2>>0]=116;i[f+3>>0]=59;c=c+4|0;break}case 38:{f=1097824+c|0;i[f>>0]=i[993833]|0;i[f+1>>0]=i[993834]|0;i[f+2>>0]=i[993835]|0;i[f+3>>0]=i[993836]|0;i[f+4>>0]=i[993837]|0;c=c+5|0;break}case 39:{f=1097824+c|0;i[f>>0]=i[993839]|0;i[f+1>>0]=i[993840]|0;i[f+2>>0]=i[993841]|0;i[f+3>>0]=i[993842]|0;i[f+4>>0]=i[993843]|0;i[f+5>>0]=i[993844]|0;c=c+6|0;break}case 34:{f=1097824+c|0;i[f>>0]=i[993846]|0;i[f+1>>0]=i[993847]|0;i[f+2>>0]=i[993848]|0;i[f+3>>0]=i[993849]|0;i[f+4>>0]=i[993850]|0;i[f+5>>0]=i[993851]|0;c=c+6|0;break}default:{i[1097824+c>>0]=f;c=c+1|0}}g=g+1|0;if((g|0)>=(b|0))break a}}else c=0;while(0);i[1097824+c>>0]=0;return}function pc(a,b){a=a|0;b=b|0;do if(b>>>0>=128){if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;b=2;break}b=b>>>0>1114111?65533:b;if(b>>>0<65536){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;b=3;break}else{i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;b=4;break}}else{i[a>>0]=b;b=1}while(0);return b|0}function qc(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+16|0;c=d;if((b|0)>15)b=-1;else{tf(c|0,a|0,b|0)|0;i[c+b>>0]=0;b=Lc(c)|0;if((b|0)>-1)b=k[8956+(b<<3)+4>>2]|0;else b=-1}r=d;return b|0}function rc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0;j=a+b|0;a:do if((b|0)!=0?(i[a>>0]|0)==38:0){k[c>>2]=1;f=a+1|0;d=i[f>>0]|0;if(d<<24>>24==35){if((b|0)<4){d=-1;break}d=a+2|0;b:do switch(i[d>>0]|0){case 88:case 120:{d=a+3|0;do{if((i[d>>0]|0)!=48)break;d=d+1|0}while(d>>>0>>0);if((d|0)==(j|0)){d=-1;break a}f=i[d>>0]|0;if((f+-48&255)>=10)switch(f<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:{d=-1;break a}}c:do if(d>>>0>>0){e=f;b=d;while(1){if((e+-48&255)>=10)switch(e<<24>>24){case 65:case 66:case 67:case 68:case 69:case 70:case 97:case 98:case 99:case 100:case 101:case 102:break;default:{h=b;break c}}b=b+1|0;if(b>>>0>=j>>>0){h=b;break c}e=i[b>>0]|0}}else h=d;while(0);b=h;g=b-d|0;if((g|0)>=8?!((g|0)==8&f<<24>>24<56):0){d=65533;break b}d:do if(d>>>0>>0){g=f;e=0;while(1){f=e<<4;e=g<<24>>24;do if((g+-48&255)>=10)if((g+-97&255)<6){e=e+-87|0;break}else{e=(g+-65&255)<6?e+-55|0:0;break}else e=e+-48|0;while(0);f=e+f|0;e=d+1|0;if((e|0)==(h|0)){d=f;break d}d=e;g=i[e>>0]|0;e=f}}else d=0;while(0);d=nc(d)|0;break}case 48:{while(1){d=d+1|0;if(d>>>0>=j>>>0){l=32;break b}if((i[d>>0]|0)!=48){l=32;break}}break}default:l=32}while(0);do if((l|0)==32){if((d|0)==(j|0)){d=-1;break a}f=i[d>>0]|0;if((f+-48&255)>=10){d=-1;break a}e:do if(d>>>0>>0){b=d;while(1){b=b+1|0;if(b>>>0>=j>>>0){g=b;break e}if(((i[b>>0]|0)+-48&255)>=10){g=b;break}}}else g=d;while(0);b=g;e=b-d|0;if((e|0)>=9){if((e|0)!=10){d=65533;break}if((Yd(d,993853,10)|0)>=1){d=65533;break}}if(d>>>0>>0){e=(f<<24>>24)+-48|0;d=d+1|0;if((d|0)==(g|0))d=e;else{f=d;d=e;do{d=(d*10|0)+-48+(i[f>>0]|0)|0;f=f+1|0}while((f|0)!=(g|0))}}else d=0;d=nc(d)|0}while(0);if((d|0)==-1|b>>>0>j>>>0){d=-1;break}}else{g=f;if((b|0)>1?(d+-48&255)<10|((d&-33)+-65&255)<26:0){d=f;do{d=d+1|0;if(d>>>0>=j>>>0)break;h=i[d>>0]|0}while((h+-48&255)<10|((h&-33)+-65&255)<26);b=d;e=d}else{b=g;e=f}d=qc(f,b-g|0)|0;if((d|0)<0){d=-1;break}if((d|0)>255){if(e>>>0>=j>>>0){d=-1;break}if((i[e>>0]|0)!=59){d=-1;break}}}e=b;if(e>>>0>>0?(i[e>>0]|0)==59:0)b=e+1|0;k[c>>2]=b-a}else l=3;while(0);if((l|0)==3){k[c>>2]=0;d=-1}return d|0}function sc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;b=rc(a,b,d)|0;if((b|0)>0)b=pc(c,b)|0;else{k[d>>2]=1;b=0}k[e>>2]=b;return}function tc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;f=a+b|0;a:do if((b|0)>0){d=a;e=1008264;while(1){e=l[e+(l[1009064+(l[d>>0]|0)>>0]|0)>>0]|0;if((e|0)<=(c|0))break;d=d+1|0;if(d>>>0>>0)e=1008264+(e*20|0)|0;else break a}switch(e|0){case 0:case 2:{b=d-a|0;break a}default:{}}b=d-a|0;while(1){d=b+-1|0;if((b|0)<=1)break a;if((i[a+d>>0]|0)==60)break;else b=d}}while(0);return b|0}function uc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;k[a>>2]=b;k[a+4>>2]=b;k[a+8>>2]=b+c;k[a+12>>2]=c;i[a+16>>0]=d&1;i[a+28>>0]=1;i[a+29>>0]=1;k[a+32>>2]=1;c=a+36|0;Nc(c);d=a+88|0;Nc(d);b=jf(40960)|0;k[a+20>>2]=b;b=jf(61440)|0;k[a+24>>2]=b;Oc(c);Oc(d);return}function vc(a){a=a|0;var b=0;b=k[a+20>>2]|0;if(b|0)kf(b);b=k[a+24>>2]|0;if(b|0)kf(b);Pc(a+88|0);Pc(a+36|0);return}function wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0;u=r;r=r+32|0;o=u+12|0;s=u+8|0;q=u+4|0;n=u;p=u+16|0;k[q>>2]=0;a:do if((c|0)>0){m=a+16|0;j=a+32|0;a=0;e=0;while(1){wd(b+e|0,c-e|0,o);e=(k[o>>2]|0)+e|0;if((e|0)>=(c|0)){e=c;a=0;break a}g=b+e|0;h=i[g>>0]|0;f=h&255;b:do if(((h&-32)<<24>>24==32?(i[1009320+f>>0]|0)!=0:0)?(i[m>>0]|0)==0:0)switch(h<<24>>24){case 60:{a=tc(g,c-e|0,k[j>>2]|0)|0;k[q>>2]=a;break b}case 62:{k[q>>2]=1;a=1;break b}case 38:{sc(g,c-e|0,p,q,n);k[o>>2]=l[1009576+(l[p>>0]|0)>>0];k[s>>2]=p;a=(vd(s,o)|0)&255;t=12;break b}default:break b}else t=11;while(0);if((t|0)==11){a=l[1009576+f>>0]|0;k[q>>2]=a;k[o>>2]=a;k[s>>2]=g;a=(vd(s,o)|0)&255;t=12}if((t|0)==12){t=0;if(a|0)break a;a=k[q>>2]|0}e=a+e|0;if((e|0)>=(c|0)){a=0;break}}}else{e=0;a=0}while(0);k[d>>2]=a;r=u;return e|0}function xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0;w=r;r=r+16|0;p=w+4|0;o=w;t=a+20|0;m=k[t>>2]|0;k[b>>2]=m;u=b+4|0;k[u>>2]=0;v=a+4|0;k[b+8>>2]=(k[v>>2]|0)-(k[a>>2]|0);k[b+12>>2]=0;k[b+16>>2]=26;l=b+20|0;i[l>>0]=0;s=a+12|0;n=k[s>>2]|0;n=(n+-40928|0)>>>0<40928?(n|0)/2|0:40896;i[m>>0]=32;i[(k[t>>2]|0)+1>>0]=0;b=k[s>>2]|0;if((b|0)<1)b=0;else{m=a+16|0;j=a+32|0;c=0;g=b;h=0;a=1;b=0;while(1){d=k[v>>2]|0;e=d+b|0;f=i[e>>0]|0;f=f<<24>>24==13?10:f;if(((f&-32)<<24>>24==32?(i[1009320+(f&255)>>0]|0)!=0:0)?(i[m>>0]|0)==0:0){a:do switch(f<<24>>24){case 60:{b:do if((b|0)<(g+-3|0))switch(i[d+(b+1)>>0]|32|0){case 112:{d=(i[d+(b+2)>>0]|0)<64?10:32;break b}case 98:{if((i[d+(b+2)>>0]|32|0)!=114){d=32;break b}d=(i[d+(b+3)>>0]|0)<64?10:32;break b}case 116:{if((i[d+(b+2)>>0]|32|0)!=114){d=32;break b}d=(i[d+(b+3)>>0]|0)<64?10:32;break b}default:{d=32;break b}}else d=32;while(0);c=(tc(e,g-b|0,k[j>>2]|0)|0)+1|0;k[p>>2]=c;if(h)switch(d<<24>>24){case 10:case 32:{e=d;d=1;break a}default:{}}i[(k[t>>2]|0)+a>>0]=d;e=d;d=d<<24>>24==32|d<<24>>24==10;a=a+1|0;break}case 62:{k[p>>2]=1;i[(k[t>>2]|0)+a>>0]=62;c=1;e=62;d=h;a=a+1|0;break}case 38:{sc(e,g-b|0,(k[t>>2]|0)+a|0,p,o);c=k[p>>2]|0;e=38;d=h;a=(k[o>>2]|0)+a|0;break}default:{e=f;d=h}}while(0);h=c;b=c+b|0}else{if(h)switch(f<<24>>24){case 10:case 32:{d=1;break}default:q=22}else q=22;if((q|0)==22){q=0;i[(k[t>>2]|0)+a>>0]=f;d=f<<24>>24==32|f<<24>>24==10;a=a+1|0}h=c;e=f;b=b+1|0}if(!((a|0)<(n|0)|e<<24>>24!=10&e<<24>>24!=32)){q=25;break}if((a|0)>40927){q=28;break}g=k[s>>2]|0;if((g|0)<=(b|0))break;else{c=h;h=d}}if((q|0)==25)i[l>>0]=1;else if((q|0)==28)i[l>>0]=1;d=k[v>>2]|0;c:do if((b|0)>0){c=b;while(1){if((i[d+c>>0]&-64)<<24>>24!=-128){b=c;break c}b=c+-1|0;a=a+-1|0;if((c|0)>1)c=b;else break}}while(0);k[v>>2]=d+b;k[s>>2]=(k[s>>2]|0)-b;i[(k[t>>2]|0)+a>>0]=32;i[(k[t>>2]|0)+(a+1)>>0]=32;i[(k[t>>2]|0)+(a+2)>>0]=32;i[(k[t>>2]|0)+(a+3)>>0]=0;k[u>>2]=a;b=1}r=w;return b|0}function yc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;C=r;r=r+32|0;s=C+16|0;v=C+12|0;c=C+8|0;u=C+4|0;t=C;if(!(i[a+28>>0]|0))b=xc(a,b)|0;else{z=a+20|0;y=k[z>>2]|0;k[b>>2]=y;A=b+4|0;k[A>>2]=0;B=a+4|0;o=b+8|0;k[o>>2]=(k[B>>2]|0)-(k[a>>2]|0);d=b+12|0;k[d>>2]=0;k[b+16>>2]=26;p=b+20|0;i[p>>0]=0;x=a+12|0;q=k[x>>2]|0;q=(q+-40928|0)>>>0<40928?(q|0)/2|0:40896;k[u>>2]=0;k[t>>2]=0;i[y>>0]=32;i[(k[z>>2]|0)+1>>0]=0;y=a+36|0;Oc(y);Vc(y,k[o>>2]|0);b=wc(a,k[B>>2]|0,k[x>>2]|0,c)|0;k[B>>2]=(k[B>>2]|0)+b;k[x>>2]=(k[x>>2]|0)-b;if((b|0)==1)Tc(y,1);else{Vc(y,b);Uc(y,1)}b=k[x>>2]|0;if((b|0)<1){Rc(y);b=0}else{o=k[c>>2]|0;k[d>>2]=o;m=a+16|0;n=a+29|0;j=a+32|0;d=b;c=1;a=0;b=0;do{a:do if((d|0)>(b|0)){g=a;while(1){f=(k[B>>2]|0)+b|0;a=i[f>>0]|0;e=a&255;b:do if(((a&-32)<<24>>24==32?(i[1009320+e>>0]|0)!=0:0)?(i[m>>0]|0)==0:0){switch(a<<24>>24){case 62:case 60:{h=c;c=0;break a}case 38:break;default:break b}sc(f,d-b|0,(k[z>>2]|0)+c|0,u,t);g=(k[z>>2]|0)+c|0;k[s>>2]=l[1009576+(l[g>>0]|0)>>0];k[v>>2]=g;g=(vd(v,s)|0)&255}else w=15;while(0);if((w|0)==15){w=0;a=l[1009576+e>>0]|0;k[t>>2]=a;k[u>>2]=a;e=(k[z>>2]|0)+c|0;if((b|0)<(d+-3|0)){h=l[f>>0]|l[f+1>>0]<<8|l[f+2>>0]<<16|l[f+3>>0]<<24;i[e>>0]=h;i[e+1>>0]=h>>8;i[e+2>>0]=h>>16;i[e+3>>0]=h>>24}else tf(e|0,f|0,a|0)|0;g=(k[B>>2]|0)+b|0;k[s>>2]=l[1009576+(l[g>>0]|0)>>0];k[v>>2]=g;g=(vd(v,s)|0)&255}if((g|0)!=40&(g|0)!=(o|0)){if(!g){h=c;c=0;break a}d=k[u>>2]|0;h=(k[B>>2]|0)+b+d|0;k[s>>2]=l[1009576+(l[h>>0]|0)>>0];k[v>>2]=h;h=vd(v,s)|0;if(!(h<<24>>24==0|(h&255|0)==(o|0))?(i[n>>0]|0)!=0:0){h=c;c=g;break a}}else d=k[u>>2]|0;b=d+b|0;a=k[t>>2]|0;c=a+c|0;do if((d|0)!=(a|0))if((d|0)<(a|0)){Tc(y,d);Uc(y,a-d|0);break}else{Tc(y,a);Vc(y,d-a|0);break}else Tc(y,d);while(0);if((c|0)>40927)break;d=k[x>>2]|0;if((d|0)<=(b|0)){h=c;c=g;break a}}i[p>>0]=1;h=c;c=g}else{h=c;c=a}while(0);d=k[x>>2]|0;c:do if((d|0)>(b|0))while(1){wd((k[B>>2]|0)+b|0,d-b|0,s);d=k[s>>2]|0;k[u>>2]=d;b=d+b|0;Vc(y,d);d=k[x>>2]|0;if((d|0)<=(b|0)){a=c;break c}a=(k[B>>2]|0)+b|0;e=i[a>>0]|0;f=e&255;d:do if(((e&-32)<<24>>24==32?(i[1009320+f>>0]|0)!=0:0)?(i[m>>0]|0)==0:0)switch(e<<24>>24){case 60:{c=tc(a,d-b|0,k[j>>2]|0)|0;k[u>>2]=c;break d}case 62:{k[u>>2]=1;c=1;break d}case 38:{sc(a,d-b|0,(k[z>>2]|0)+h|0,u,t);c=(k[z>>2]|0)+h|0;k[s>>2]=l[1009576+(l[c>>0]|0)>>0];k[v>>2]=c;c=(vd(v,s)|0)&255;w=42;break d}default:{w=42;break d}}else w=41;while(0);if((w|0)==41){c=l[1009576+f>>0]|0;k[u>>2]=c;k[s>>2]=c;k[v>>2]=a;c=(vd(v,s)|0)&255;w=42}if((w|0)==42){w=0;if(c|0){a=c;break c}c=k[u>>2]|0}b=c+b|0;Vc(y,c);d=k[x>>2]|0;if((d|0)<=(b|0)){a=0;break}else c=0}else a=c;while(0);c=h+1|0;i[(k[z>>2]|0)+h>>0]=32;Uc(y,1);if((a|0)!=40&(a|0)!=(o|0))break;if((c|0)>=(q|0)){w=48;break}d=k[x>>2]|0}while((b|0)<(d|0));if((w|0)==48)i[p>>0]=1;e=k[x>>2]|0;e:do if((b|0)>0){a=(b|0)<(e|0);d=b;while(1){if(!a){b=d;break e}if((i[(k[B>>2]|0)+d>>0]&-64)<<24>>24!=-128){b=d;break e}b=d+-1|0;c=c+-1|0;if((d|0)>1)d=b;else break}}while(0);k[B>>2]=(k[B>>2]|0)+b;k[x>>2]=e-b;i[(k[z>>2]|0)+c>>0]=32;i[(k[z>>2]|0)+(c+1)>>0]=32;i[(k[z>>2]|0)+(c+2)>>0]=32;i[(k[z>>2]|0)+(c+3)>>0]=0;Uc(y,4);Rc(y);k[A>>2]=c;b=1}}r=C;return b|0}function zc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;c=r;r=r+16|0;g=c+4|0;d=a+88|0;Oc(d);e=b+4|0;f=a+24|0;xd(k[b>>2]|0,(k[e>>2]|0)+3|0,k[f>>2]|0,61440,(i[a+16>>0]|0)!=0,c+8|0,g,c,d);a=k[g>>2]|0;i[(k[f>>2]|0)+a>>0]=0;k[b>>2]=k[f>>2];k[e>>2]=a+-3;Rc(d);r=c;return}function Ac(a,b){a=a|0;b=b|0;var c=0;c=yc(a,b)|0;zc(a,b);return c|0}function Bc(a){a=a|0;a=(a|0)<0?0:a;return k[15988+(((a|0)>101?0:a)<<2)>>2]|0}function Cc(a){a=a|0;a=(a|0)<0?0:a;return k[16396+(((a|0)>101?0:a)<<2)>>2]|0}function Dc(a){a=a|0;a=(a|0)<0?26:a;return k[11076+(((a|0)>613?26:a)<<2)>>2]|0}function Ec(a){a=a|0;a=(a|0)<0?26:a;return k[13532+(((a|0)>613?26:a)<<2)>>2]|0}function Fc(a){a=a|0;do switch(a|0){case 40:case 38:{a=1;break}case 105:{a=2;break}case 135:{a=2;break}case 17:{a=3;break}case 68:{a=3;break}case 84:{a=4;break}case 83:{a=4;break}case 78:{a=5;break}case 28:{a=5;break}case 29:{a=5;break}case 160:{a=5;break}case 35:{a=6;break}case 64:{a=6;break}case 51:{a=6;break}case 43:{a=6;break}case 10:{a=7;break}case 80:{a=7;break}case 1:{a=7;break}case 31:{a=8;break}case 14:{a=8;break}case 12:{a=8;break}case 143:{a=9;break}case 147:{a=9;break}default:a=0}while(0);return a|0}function Gc(a){a=a|0;if(a>>>0>101)a=26;else a=k[16804+(a<<2)>>2]|0;return a|0}function Hc(a){a=a|0;if((a|0)<512)a=i[992810+a>>0]|0;else a=0;return a|0}function Ic(a,b){a=a|0;b=b|0;do if(a>>>0<=101){if((k[16396+(a<<2)>>2]|0)>>>0<2){b=k[16804+(a<<2)>>2]|0;break}b=b&255;if((a|0)==1){b=m[941344+(b<<1)>>1]|0;break}else{b=m[941856+(b<<1)>>1]|0;break}}else b=26;while(0);return b|0}function Jc(a){a=a|0;if((a|0)<512)a=(m[941344+((l[992810+a>>0]|0)<<1)>>1]|0|0)==(a|0);else a=0;return a|0}function Kc(a){a=a|0;if((a|0)<512)a=(m[941856+((l[992810+a>>0]|0)<<1)>>1]|0|0)==(a|0);else a=0;return a|0}function Lc(a){a=a|0;var b=0,c=0,d=0,e=0;c=0;e=265;a:while(1)while(1){if((c|0)>=(e|0)){b=-1;break a}b=c+e>>1;d=_d(a,k[8956+(b<<3)>>2]|0)|0;if((d|0)<0){e=b;continue a}if((d|0)>0)c=b+1|0;else break a}return b|0}function Mc(a){a=a|0;switch(a|0){case 1:{a=0;break}case 3:{a=1;break}case 6:{a=2;break}default:a=3}return a|0}function Nc(a){a=a|0;var b=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=1;a=a+16|0;b=a+36|0;do{k[a>>2]=0;a=a+4|0}while((a|0)<(b|0));return}function Oc(a){a=a|0;var b=0;if(!(i[a>>0]&1)){i[a+1>>0]=0;i[a>>0]=0}else{i[k[a+8>>2]>>0]=0;k[a+4>>2]=0}k[a+12>>2]=1;a=a+16|0;b=a+36|0;do{k[a>>2]=0;a=a+4|0}while((a|0)<(b|0));return}function Pc(a){a=a|0;Ae(a);return}function Qc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=a+16|0;g=k[j>>2]|0;do if(g|0){h=a+12|0;b=k[h>>2]|0;if((b|0)==1){e=i[a>>0]|0;f=(e&1)==0;if(f)c=(e&255)>>>1;else c=k[a+4>>2]|0;if(c|0){if(f){c=(e&255)>>>1;d=a+1|0}else{c=k[a+4>>2]|0;d=k[a+8>>2]|0}d=i[d+(c+-1)>>0]|0;if((d&-64)<<24>>24==64?(g+(d&63)|0)>>>0<64:0){if(f){c=(e&255)>>>1;b=a+1|0}else{c=k[a+4>>2]|0;b=k[a+8>>2]|0}a=b+(c+-1)|0;i[a>>0]=(l[a>>0]|0)+g;k[j>>2]=0;break}}}if(g>>>0>63){c=g;d=0;e=30;while(1){b=c>>>e&63;if(d|(b|0)!=0){Ge(a,b&255);b=1}else b=0;if((e|0)<=6)break;c=k[j>>2]|0;d=b;e=e+-6|0}c=k[j>>2]|0;b=k[h>>2]|0}else c=g;Ge(a,(c&63|b<<6)&255);k[j>>2]=0}while(0);return}function Rc(a){a=a|0;Sc(a);a=a+20|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;k[a+16>>2]=0;k[a+20>>2]=0;return}function Sc(a){a=a|0;var b=0,c=0;if(!(k[a+16>>2]|0)){b=i[a>>0]|0;if(!(b&1))b=(b&255)>>>1;else b=k[a+4>>2]|0;if(!b)c=6}else c=6;if((c|0)==6){Tc(a,1);Qc(a)}return}function Tc(a,b){a=a|0;b=b|0;var c=0;do if(b|0){c=a+44|0;k[c>>2]=(k[c>>2]|0)+b;c=a+48|0;k[c>>2]=(k[c>>2]|0)+b;c=a+12|0;if((k[c>>2]|0)==1){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}else{Qc(a);k[c>>2]=1;k[a+16>>2]=b;break}}while(0);return}function Uc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;do if(b|0){d=a+48|0;k[d>>2]=(k[d>>2]|0)+b;d=a+12|0;e=k[d>>2]|0;if((e|0)==2){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}c=a+16|0;if((b|0)==1&(e|0)==3?(k[c>>2]|0)==1:0){k[d>>2]=1;break}Qc(a);k[d>>2]=2;k[c>>2]=b}while(0);return}function Vc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;do if(b|0){d=a+44|0;k[d>>2]=(k[d>>2]|0)+b;d=a+12|0;e=k[d>>2]|0;if((e|0)==3){a=a+16|0;k[a>>2]=(k[a>>2]|0)+b;break}c=a+16|0;if((b|0)==1&(e|0)==2?(k[c>>2]|0)==1:0){k[d>>2]=1;break}Qc(a);k[d>>2]=3;k[c>>2]=b}while(0);return}function Wc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+16|0;l=t;od(f,l);h=k[l>>2]|0;o=Ic(a,h&255)|0;l=k[l+4>>2]|0;q=Ic(a,l&255)|0;n=f+16|0;if((d|0)>0)s=(m[n+(h<<1)>>1]<<10|0)/(d|0)|0;else s=0;p=(Mc(a)|0)+(o<<2)|0;p=j[(k[(k[e+140>>2]|0)+32>>2]|0)+(p<<1)>>1]|0;j[g>>1]=c;j[g+2>>1]=b;j[g+4>>1]=o;j[g+6>>1]=q;c=j[n+(h<<1)>>1]|0;j[g+8>>1]=c;h=j[n+(l<<1)>>1]|0;j[g+10>>1]=h;j[g+12>>1]=d;e=k[f+12>>2]|0;j[g+14>>1]=e;j[g+16>>1]=a;e=(nb(c&65535,h&65535,e&65535)|0)&255;h=g+18|0;i[h>>0]=e;e=Fc(o)|0;if(e|0?(e|0)==(Fc(q)|0):0)i[h>>0]=100;s=(ob(s,p)|0)&255;i[g+19>>0]=s;r=t;return}function Xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=(k[a+8>>2]|0)==1;f=e?a+96|0:a+116|0;d=e?a+16|0:a+36|0;c=k[d+4>>2]|0;if(c|0)ib(c,b);c=k[d+8>>2]|0;if(c|0)ib(c,b);c=k[d+12>>2]|0;if(c|0)ib(c,b);c=k[d+16>>2]|0;if(c|0)ib(c,b);e=e?a+56|0:a+76|0;c=k[f+4>>2]|0;if(c|0)ib(c,b);c=k[f+8>>2]|0;if(c|0)ib(c,b);c=k[f+12>>2]|0;if(c|0)ib(c,b);c=k[f+16>>2]|0;if(c|0)ib(c,b);d=b+16|0;c=k[e+4>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+8>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+12>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;c=k[e+16>>2]|0;if(c|0)j[d+((c>>>8&255)<<1)>>1]=0;return}function Yc(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,l=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+16|0;h=t;s=k[b+56064+(c<<2)>>2]|0;q=k[b+56064+(c+1<<2)>>2]|0;ld(f);k[e+16>>2]=0;k[e+20>>2]=0;if(i[d+7>>0]|0){p=k[d>>2]|0;k[h>>2]=s;k[h+4>>2]=q;pe(p,1017069,h)}k[e>>2]=s;k[e+12>>2]=q-s;if((q|0)>(s|0)){h=d+96|0;l=d+8|0;n=d+116|0;p=s;do{o=k[b+24056+(p<<3)+4>>2]|0;ib(o,f);e=b+24056+(p<<3)+2|0;c=j[e>>1]|0;if((c&65535)<2){md(f);c=j[e>>1]|0}if(c<<16>>16==3){e=(k[l>>2]|0)==1?h:n;c=k[e>>2]|0;k[e+4+(c<<2)>>2]=o;k[e>>2]=c+1&3}p=p+1|0}while((p|0)!=(q|0))}Xc(d,f);p=m[b+24056+(s<<3)>>1]|0;Wc(a,s,p,(m[b+24056+(q<<3)>>1]|0)-p|0,d,f,g);k[d+12>>2]=m[g+4>>1];r=t;return}function Zc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0;x=r;r=r+608|0;w=x+552|0;s=x+528|0;p=x;q=x+576|0;k[w>>2]=0;k[w+4>>2]=0;k[w+8>>2]=0;k[w+12>>2]=0;k[w+16>>2]=0;k[w+20>>2]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;k[s+20>>2]=0;g=b+24|0;if((k[g>>2]|0)>0){i=s+12|0;l=s+16|0;m=s+4|0;n=s+20|0;o=s+8|0;t=0;do{kd(p);Yc(a,b,t,c,s,p,q);h=k[d>>2]|0;if((h|0)<50){u=d+4+(h*20|0)|0;f=q;v=u+20|0;do{j[u>>1]=j[f>>1]|0;u=u+2|0;f=f+2|0}while((u|0)<(v|0));h=(k[d>>2]|0)+1|0;k[d>>2]=h};k[w>>2]=k[s>>2];k[w+4>>2]=k[s+4>>2];k[w+8>>2]=k[s+8>>2];k[w+12>>2]=k[s+12>>2];k[w+16>>2]=k[s+16>>2];k[w+20>>2]=k[s+20>>2];k[s>>2]=(k[s>>2]|0)+(k[i>>2]|0);k[m>>2]=(k[m>>2]|0)+(k[l>>2]|0);k[o>>2]=(k[o>>2]|0)+(k[n>>2]|0);t=t+1|0}while((t|0)<(k[g>>2]|0))}else h=k[d>>2]|0;i=k[b+20>>2]|0;f=j[b+24056+(i<<3)>>1]|0;g=d+4+(h*20|0)|0;u=g;v=u+20|0;do{j[u>>1]=0;u=u+2|0}while((u|0)<(v|0));j[g>>1]=f;j[d+4+(h*20|0)+2>>1]=i;k[e>>2]=k[w>>2];k[e+4>>2]=k[w+4>>2];k[e+8>>2]=k[w+8>>2];k[e+12>>2]=k[w+12>>2];k[e+16>>2]=k[w+16>>2];k[e+20>>2]=k[w+20>>2];r=x;return}function _c(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;if((k[a>>2]|0)>0){c=0;do{e=l[a+4+(c*20|0)+18>>0]|0;d=l[a+4+(c*20|0)+19>>0]|0;qd(b,j[a+4+(c*20|0)+4>>1]|0,m[a+4+(c*20|0)+12>>1]|0,m[a+4+(c*20|0)+8>>1]|0,e>>>0>>0?e:d);c=c+1|0}while((c|0)<(k[a>>2]|0))}return}function $c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;p=r;r=r+112|0;o=p+96|0;n=p+80|0;l=p+64|0;h=p+48|0;g=p+32|0;i=p+16|0;e=p;t=Bc(k[c>>2]|0)|0;d=c+8|0;s=k[d>>2]|0;j=c+12|0;q=k[j>>2]|0;m=c+16|0;f=k[m>>2]|0;k[e>>2]=t;k[e+4>>2]=s;k[e+8>>2]=q;k[e+12>>2]=f;pe(a,1017096,e);e=c+4|0;a:do if((k[e>>2]|0)>0){f=0;do{if((f|0)<(k[d>>2]|0)){s=k[c+32+(f<<3)>>2]|0;t=k[c+32+(f<<3)+4>>2]|0;oc(b+s|0,6);k[i>>2]=f;k[i+4>>2]=s;k[i+8>>2]=(t|0)<0?(t&2147483647)+2e9|0:t;k[i+12>>2]=1097824;pe(a,1017160,i)}if((f|0)<(k[j>>2]|0)){s=k[c+8040+(f<<3)>>2]|0;t=k[c+8040+(f<<3)+4>>2]|0;oc(b+s|0,12);k[g>>2]=f;k[g+4>>2]=s;k[g+8>>2]=t;k[g+12>>2]=1097824;pe(a,1017175,g)}if((f|0)<(k[m>>2]|0)){s=k[c+16048+(f<<3)>>2]|0;t=k[c+16048+(f<<3)+4>>2]|0;oc(b+s|0,12);k[h>>2]=f;k[h+4>>2]=s;k[h+8>>2]=t;k[h+12>>2]=1097824;pe(a,1017191,h)}if((f|0)<(k[d>>2]|0))se(1017206,5,1,a);if((f|0)>50)break a;f=f+1|0}while((f|0)<(k[e>>2]|0))}while(0);d=k[d>>2]|0;if((d|0)>50){s=k[c+32+(d<<3)>>2]|0;t=k[c+32+(d<<3)+4>>2]|0;oc(b+s|0,6);k[l>>2]=d;k[l+4>>2]=s;k[l+8>>2]=(t|0)<0?(t&2147483647)+2e9|0:t;k[l+12>>2]=1097824;pe(a,1017160,l)}d=k[j>>2]|0;if((d|0)>50){s=k[c+8040+(d<<3)>>2]|0;t=k[c+8040+(d<<3)+4>>2]|0;oc(b+s|0,12);k[n>>2]=d;k[n+4>>2]=s;k[n+8>>2]=t;k[n+12>>2]=1097824;pe(a,1017175,n)}d=k[m>>2]|0;if((d|0)>50){s=k[c+16048+(d<<3)>>2]|0;t=k[c+16048+(d<<3)+4>>2]|0;oc(b+s|0,12);k[o>>2]=d;k[o+4>>2]=s;k[o+8>>2]=t;k[o+12>>2]=1097824;pe(a,1017191,o)}se(1017206,5,1,a);r=p;return}function ad(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,n=0,o=0;l=r;r=r+48|0;j=l+40|0;g=l+16|0;h=l+8|0;d=l;f=c+20|0;k[d>>2]=k[f>>2];pe(a,1017212,d);d=k[f>>2]|0;if((d|0)>=0){e=0;while(1){if(!((e|0)>50&(e|0)<(d+-1|0))){o=m[c+24056+(e<<3)>>1]|0;n=i[1017266+(m[c+24056+(e<<3)+2>>1]|0)>>0]|0;d=k[c+24056+(e<<3)+4>>2]|0;oc(b+o|0,6);k[g>>2]=e;k[g+4>>2]=o;k[g+8>>2]=n;k[g+12>>2]=d;k[g+16>>2]=1097824;pe(a,1017271,g);d=k[f>>2]|0}if((e|0)<(d|0))e=e+1|0;else break}}se(1017206,5,1,a);e=c+24|0;k[h>>2]=k[e>>2];pe(a,1017242,h);if((k[e>>2]|0)>=0){d=0;while(1){o=k[c+56064+(d<<2)>>2]|0;k[j>>2]=d;k[j+4>>2]=o;pe(a,1017294,j);if((d|0)<(k[e>>2]|0))d=d+1|0;else break}}se(1017206,5,1,a);r=l;return}function bd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0,n=0,o=0,p=0;c=r;r=r+48|0;d=c;p=m[b>>1]|0;o=m[b+2>>1]|0;n=Ec(m[b+4>>1]|0)|0;l=m[b+8>>1]|0;i=Ec(m[b+6>>1]|0)|0;h=m[b+10>>1]|0;g=m[b+12>>1]|0;f=m[b+14>>1]|0;e=Bc(m[b+16>>1]|0)|0;b=j[b+18>>1]|0;k[d>>2]=p;k[d+4>>2]=o;k[d+8>>2]=n;k[d+12>>2]=l;k[d+16>>2]=i;k[d+20>>2]=h;k[d+24>>2]=g;k[d+28>>2]=f;k[d+32>>2]=e;k[d+36>>2]=b&255;k[d+40>>2]=(b&65535)>>>8&65535;pe(a,1017302,d);r=c;return}function cd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;e=r;r=r+16|0;d=e+8|0;c=e;k[c>>2]=k[b>>2];pe(a,1017351,c);se(1017382,101,1,a);if((k[b>>2]|0)>=0){c=0;while(1){k[d>>2]=c;pe(a,1017484,d);bd(a,b+4+(c*20|0)|0);if((c|0)<(k[b>>2]|0))c=c+1|0;else break}}se(1017206,5,1,a);r=e;return}function dd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=k[a+140>>2]|0;if(b){t=k[d+4>>2]|0;r=0;s=t;b=d+8|0;d=d+12|0}else{r=1;s=k[d+16>>2]|0;t=k[d+20>>2]|0;b=d+24|0;d=d+28|0}e=k[b>>2]|0;b=k[d>>2]|0;o=c+8|0;d=k[o>>2]|0;p=k[c+12>>2]|0;q=k[c+16>>2]|0;j[c+24056>>1]=k[c+28>>2];j[c+24058>>1]=r;n=pb(Gc(k[a+8>>2]|0)|0,1)|0;k[c+24060>>2]=n;if((q|0)>0|((p|0)>0|(d|0)>0)){n=b+4|0;m=e+4|0;g=0;i=0;l=0;b=1;while(1){h=k[c+32+(g<<3)>>2]|0;f=k[c+8040+(i<<3)>>2]|0;a=k[c+16048+(l<<3)>>2]|0;do if((i|0)>=(p|0)|(f|0)>(h|0)|(f|0)>(a|0)){if(!((a|0)>(f|0)|((l|0)>=(q|0)|(a|0)>(h|0)))){f=l+1|0;e=k[(k[n>>2]|0)+(k[c+16048+(l<<3)+4>>2]<<2)>>2]|0;if(!e){a=i;e=f;break}j[c+24056+(b<<3)>>1]=a;j[c+24056+(b<<3)+2>>1]=3;k[c+24056+(b<<3)+4>>2]=e;a=i;e=f;b=b+1|0;break}f=k[c+32+(g<<3)+4>>2]|0;a=f&2147483647;f=(f|0)<0?t:s;g=g+1|0;e=k[f+8>>2]|0;if((a|0)<(e|0)){e=k[(k[f+4>>2]|0)+(a<<2)>>2]|0;if(!e){a=i;e=l;break}j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=e;a=i;e=l;b=b+1|0;break}a=a-e+a|0;f=k[f+4>>2]|0;e=k[f+(a<<2)>>2]|0;a=k[f+(a+1<<2)>>2]|0;if(e){j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=e;b=b+1|0}if(!a){a=i;e=l}else{j[c+24056+(b<<3)>>1]=h;j[c+24056+(b<<3)+2>>1]=r;k[c+24056+(b<<3)+4>>2]=a;a=i;e=l;b=b+1|0}}else{a=i+1|0;e=k[(k[m>>2]|0)+(k[c+8040+(i<<3)+4>>2]<<2)>>2]|0;if(!e)e=l;else{j[c+24056+(b<<3)>>1]=f;j[c+24056+(b<<3)+2>>1]=2;k[c+24056+(b<<3)+4>>2]=e;e=l;b=b+1|0}}while(0);if((e|0)<(q|0)|((a|0)<(p|0)|(g|0)<(d|0))){i=a;l=e}else break}d=k[o>>2]|0}else b=1;k[c+20>>2]=b;j[c+24056+(b<<3)>>1]=k[c+32+(d<<3)>>2];k[c+24056+(b<<3)+4>>2]=0;return}function ed(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0;o=b&1^1;i=b?50:20;j=c+20|0;e=k[j>>2]|0;b=k[c+8>>2]|0;if((b|0)>0){l=(i>>>1)+i|0;n=i<<1;h=b;f=0;d=0;b=a;do{if((h|0)>=(l|0))if((h|0)<(n|0))g=h+1>>1;else g=i;else g=h;k[c+56064+(d<<2)>>2]=f;k[c+56268+(d<<2)>>2]=b;d=d+1|0;if((f|0)<(e|0)&(g|0)>0){a=0;b=f;do{a=((m[c+24056+(b<<3)+2>>1]|0|0)==(o|0)&1)+a|0;b=b+1|0}while((b|0)<(e|0)&(a|0)<(g|0));f=b}b=m[c+24056+(f<<3)>>1]|0;h=h-g|0}while((h|0)>0);e=k[j>>2]|0}else{k[c+56064>>2]=0;k[c+56268>>2]=m[c+24056>>1];d=1;b=a}k[c+24>>2]=d;k[c+56064+(d<<2)>>2]=e;k[c+56268+(d<<2)>>2]=b;return}function fd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0;j=r;r=r+1056|0;h=j+24|0;g=c+7|0;if(i[g>>0]|0){se(1017490,12,1,k[c>>2]|0);$c(k[c>>2]|0,k[a>>2]|0,f)}dd(c,e,f);ed(b,e,f);if(i[g>>0]|0){se(1017503,9,1,k[c>>2]|0);ad(k[c>>2]|0,k[a>>2]|0,f)}k[h>>2]=0;Zc(k[a+12>>2]|0,f,c,h,j);if(i[g>>0]|0)cd(k[c>>2]|0,h);_c(h,d);r=j;return}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;qd(d,(Gc(b)|0)&65535,a,a,100);k[c+12>>2]=26;return}function hd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;p=r;r=r+16|0;o=p;d=gf(56472)|0;k[d+4>>2]=1e3;l=d+8|0;k[d+8040>>2]=0;k[d+8044>>2]=0;k[d+16048>>2]=0;k[d+16052>>2]=0;j[d+24056>>1]=0;k[d+24060>>2]=0;k[d+56064>>2]=0;k[d+56268>>2]=0;k[l>>2]=0;k[l+4>>2]=0;k[l+8>>2]=0;k[l+12>>2]=0;k[l+16>>2]=0;k[l+20>>2]=0;k[l+24>>2]=0;k[l+28>>2]=0;k[d>>2]=k[a+12>>2];e=b+12|0;k[e>>2]=26;k[b+136>>2]=0;f=d+28|0;k[f>>2]=1;g=k[a+4>>2]|0;if((g|0)>1){h=b+7|0;n=b+140|0;m=1;do{if(i[h>>0]|0){q=k[b>>2]|0;k[o>>2]=m;k[o+4>>2]=g;pe(q,1017513,o)}q=m;m=jb(k[a>>2]|0,m,g,k[k[n>>2]>>2]|0,d)|0;s=k[n>>2]|0;kb(k[a>>2]|0,q,m,k[s+8>>2]|0,k[s+12>>2]|0,d);fd(a,q,b,c,1,d);k[l>>2]=0;k[l+4>>2]=0;k[l+8>>2]=0;k[l+12>>2]=0;k[l+16>>2]=0;k[f>>2]=m}while((m|0)<(g|0))}Qe(d);k[e>>2]=26;r=p;return}function id(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,l=0,m=0;d=gf(56472)|0;k[d+4>>2]=1e3;g=d+8|0;k[d+8040>>2]=0;k[d+8044>>2]=0;k[d+16048>>2]=0;k[d+16052>>2]=0;j[d+24056>>1]=0;k[d+24060>>2]=0;k[d+56064>>2]=0;k[d+56268>>2]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;k[g+20>>2]=0;k[g+24>>2]=0;k[g+28>>2]=0;k[d>>2]=k[a+12>>2];k[b+12>>2]=26;k[b+136>>2]=0;e=d+28|0;k[e>>2]=1;f=k[a+4>>2]|0;if((f|0)>1){i=b+140|0;h=1;do{m=k[i>>2]|0;l=h;h=lb(k[a>>2]|0,h,f,k[m+16>>2]|0,k[m+20>>2]|0,d)|0;m=k[i>>2]|0;mb(k[a>>2]|0,l,h,k[m+24>>2]|0,k[m+28>>2]|0,d);fd(a,l,b,c,0,d);k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;k[e>>2]=h}while((h|0)<(f|0))}Qe(d);return}function jd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0;g=r;r=r+32|0;f=g+16|0;e=g;d=g+20|0;if(!(i[b+7>>0]|0))d=a+12|0;else{l=k[b>>2]|0;h=a+12|0;n=Bc(k[h>>2]|0)|0;j=a+4|0;m=k[j>>2]|0;k[e>>2]=n;k[e+4>>2]=m;pe(l,1017545,e);ze(e,k[a>>2]|0,k[j>>2]|0);j=k[b>>2]|0;mc(d);k[f>>2]=(i[d>>0]&1)==0?d+1|0:k[d+8>>2]|0;pe(j,1017576,f);Ae(d);se(1017206,5,1,k[b>>2]|0);Ae(e);d=h}k[b+12>>2]=26;k[b+136>>2]=0;n=Cc(k[d>>2]|0)|0;switch(((n|0)!=3&(i[b+4>>0]|0)!=0?2:n)|0){case 1:case 0:{gd(k[a+4>>2]|0,k[a+12>>2]|0,b,c);break}case 3:{hd(a,b,c);break}case 2:{id(a,b,c);break}default:{}}r=g;return}function kd(a){a=a|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;return}function ld(a){a=a|0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;return}function md(a){a=a|0;a=a+12|0;k[a>>2]=(k[a>>2]|0)+1;return}function nd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;b=b&255;d=b>>>2;e=sf(1,0,d|0)|0;f=L;h=a;g=k[h>>2]|0;h=k[h+4>>2]|0;if((g&e|0)==0&(h&f|0)==0){d=a+16+(d<<3)|0;k[d>>2]=0;k[d+4>>2]=0;d=a;k[d>>2]=g|e;k[d+4>>2]=h|f}a=a+16+(b<<1)|0;j[a>>1]=(m[a>>1]|0)+c;return}function od(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,n=0,o=0,p=0,q=0;q=r;r=r+16|0;p=q;k[b>>2]=-1;n=b+4|0;k[n>>2]=-1;o=b+8|0;k[o>>2]=-1;k[p>>2]=-1;k[p+4>>2]=-1;k[p+8>>2]=-1;d=a;c=k[d>>2]|0;d=k[d+4>>2]|0;if(!((c|0)==0&(d|0)==0)){i=a+16|0;j=p+8|0;l=p+4|0;g=0;while(1){if(!((c&1|0)==0&0==0)){h=0;do{e=h+g|0;f=m[i+(e<<1)>>1]|0;if((f|0)>(k[j>>2]|0)){a=k[l>>2]|0;if((f|0)>(a|0)){k[j>>2]=a;k[o>>2]=k[n>>2];a=k[p>>2]|0;if((f|0)>(a|0)){k[l>>2]=a;k[n>>2]=k[b>>2];a=0}else a=1}else a=2;k[p+(a<<2)>>2]=f;k[b+(a<<2)>>2]=e}h=h+1|0}while((h|0)!=4)}c=rf(c|0,d|0,1)|0;d=L;if((c|0)==0&(d|0)==0)break;else g=g+4|0}}r=q;return}function pd(a){a=a|0;var b=0;b=a+536|0;k[b>>2]=0;k[b+4>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0;k[b+16>>2]=0;k[b+20>>2]=0;k[b+24>>2]=0;k[b+28>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;k[a+16>>2]=0;k[a+20>>2]=0;a=a+568|0;b=a+48|0;do{k[a>>2]=-1;a=a+4|0}while((a|0)<(b|0));return}function qd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,l=0,m=0;k[a>>2]=(k[a>>2]|0)+1;g=b&65535;l=g&15;m=j[a+568+(l<<1)>>1]|0;do if(m<<16>>16==b<<16>>16){b=a+616+(l<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(l<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(l<<2)|0;k[a>>2]=(k[a>>2]|0)+d}else{f=l^8;i=j[a+568+(f<<1)>>1]|0;if(i<<16>>16==b<<16>>16){b=a+616+(f<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(f<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(f<<2)|0;k[a>>2]=(k[a>>2]|0)+d;break}g=g&7|16;h=j[a+568+(g<<1)>>1]|0;if(h<<16>>16==b<<16>>16){b=a+616+(g<<2)|0;k[b>>2]=(k[b>>2]|0)+c;b=a+712+(g<<2)|0;k[b>>2]=(k[b>>2]|0)+d;d=ha(e,c)|0;a=a+808+(g<<2)|0;k[a>>2]=(k[a>>2]|0)+d;break}if(m<<16>>16!=-1){if(i<<16>>16!=-1)if(h<<16>>16==-1)f=g;else{f=(k[a+616+(f<<2)>>2]|0)<(k[a+616+(l<<2)>>2]|0)?f:l;f=(k[a+616+(g<<2)>>2]|0)<(k[a+616+(f<<2)>>2]|0)?g:f}}else f=l;j[a+568+(f<<1)>>1]=b;k[a+616+(f<<2)>>2]=c;k[a+712+(f<<2)>>2]=d;d=ha(e,c)|0;k[a+808+(f<<2)>>2]=d}while(0);return}function rd(a,b){a=a|0;b=b|0;var c=0,d=0;a:do if(!(k[a+4>>2]|0)){d=b&65535;c=d&15;if((j[a+568+(c<<1)>>1]|0)!=b<<16>>16){c=c^8;if((j[a+568+(c<<1)>>1]|0)!=b<<16>>16){c=d&7|16;c=(j[a+568+(c<<1)>>1]|0)==b<<16>>16?c:-1}}}else{c=0;while(1){if((j[a+568+(c<<1)>>1]|0)==b<<16>>16)break a;c=c+1|0;if((c|0)>=24){c=-1;break}}}while(0);return c|0}function sd(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,l=0;l=0;while(1){g=a+568+(l<<1)|0;if((j[g>>1]|0)==-1)k[a+616+(l<<2)>>2]=-1;b=l;l=l+1|0;if((l|0)>=24)continue;h=a+616+(b<<2)|0;i=a+712+(b<<2)|0;e=a+808+(b<<2)|0;f=l;do{b=a+568+(f<<1)|0;c=a+616+(f<<2)|0;if((j[b>>1]|0)==-1){k[c>>2]=-1;d=-1}else d=k[c>>2]|0;if((k[h>>2]|0)<(d|0)){d=j[g>>1]|0;j[g>>1]=j[b>>1]|0;j[b>>1]=d;d=k[h>>2]|0;k[h>>2]=k[c>>2];k[c>>2]=d;d=k[i>>2]|0;c=a+712+(f<<2)|0;k[i>>2]=k[c>>2];k[c>>2]=d;c=k[e>>2]|0;d=a+808+(f<<2)|0;k[e>>2]=k[d>>2];k[d>>2]=c}f=f+1|0}while((f|0)!=24);if((l|0)==3)break}k[a+4>>2]=1;return}function td(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=r;r=r+32|0;e=f+8|0;d=f;se(1017581,14,1,941016);c=0;do{b=j[a+568+(c<<1)>>1]|0;if(b<<16>>16!=-1){i=Ec(b&65535)|0;h=k[a+616+(c<<2)>>2]|0;g=k[a+712+(c<<2)>>2]|0;b=k[a+808+(c<<2)>>2]|0;k[e>>2]=c;k[e+4>>2]=i;k[e+8>>2]=h;k[e+12>>2]=g;k[e+16>>2]=b;pe(941016,1017620,e)}c=c+1|0}while((c|0)!=24);k[d>>2]=k[a>>2];pe(941016,1017596,d);r=f;return}function ud(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;e=k[c>>2]|0;do if((e|0)>=1){f=k[b>>2]|0;g=(k[a+32>>2]|0)+(k[a>>2]|0)|0;d=k[a+16>>2]|0;h=i[f>>0]|0;a=h&255;if(h<<24>>24>-1){a=i[g+a>>0]|0;k[b>>2]=f+1;k[c>>2]=e+-1;break}if((e|0)>1&(a&224|0)==192){a=i[g+(l[g+a>>0]<>0]|0)>>0]|0;k[b>>2]=f+2;k[c>>2]=e+-2;break}if((e|0)>2&(a&240|0)==224){a=g+(l[g+a>>0]<>0]|0)>>0]<>0]|0)>>0]|0;k[b>>2]=f+3;k[c>>2]=e+-3;break}if((a&248|0)==240&(e|0)>3){a=g+(l[g+(l[g+a>>0]<>0]|0)>>0]<>0]|0)>>0]<>0]|0)>>0]|0;k[b>>2]=f+4;k[c>>2]=e+-4;break}else{k[b>>2]=f+1;k[c>>2]=e+-1;a=0;break}}else a=0;while(0);return a|0}function vd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=k[b>>2]|0;do if((c|0)>=1){d=k[a>>2]|0;f=i[d>>0]|0;e=f&255;if(f<<24>>24>-1){f=j[942368+(e<<1)>>1]|0;k[a>>2]=d+1;k[b>>2]=c+-1;c=f&255;break}if((c|0)>1&(e&224|0)==192){f=j[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0;k[a>>2]=d+2;k[b>>2]=c+-2;c=f&255;break}if((c|0)>2&(e&240|0)==224){f=j[942368+((m[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+2>>0]|0)<<1)>>1]|0;k[a>>2]=d+3;k[b>>2]=c+-3;c=f&255;break}if((e&248|0)==240&(c|0)>3){f=j[942368+((m[942368+((m[942368+((m[942368+(e<<1)>>1]|0)<<6<<1)+((l[d+1>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+2>>0]|0)<<1)>>1]|0)<<6<<1)+((l[d+3>>0]|0)<<1)>>1]|0;k[a>>2]=d+4;k[b>>2]=c+-4;c=f&255;break}else{k[a>>2]=d+1;k[b>>2]=c+-1;c=0;break}}else c=0;while(0);return c|0}function wd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,m=0;h=a+b|0;j=h+-7|0;k[c>>2]=0;if(b|0){b=a;a:do{b:do if(b>>>0>>0){g=b;while(1){d=k[g>>2]|0;b=g+4|0;e=k[b>>2]|0;f=g+8|0;if((d+-656877351|d+1145324612|e+-656877351|e+1145324612)&-2139062144|0){if((i[1008008+(l[g+1>>0]|0)>>0]|i[1008008+(d&255)>>0]|i[1008008+(l[g+2>>0]|0)>>0]|i[1008008+(l[g+3>>0]|0)>>0])<<24>>24){b=g;break b}if((i[1008008+(l[g+5>>0]|0)>>0]|i[1008008+(e&255)>>0]|i[1008008+(l[g+6>>0]|0)>>0]|i[1008008+(l[g+7>>0]|0)>>0])<<24>>24)break b}if(f>>>0>>0)g=f;else{b=f;break}}}while(0);if(b>>>0>>0)d=993864;else{d=993864;m=13;break}while(1){f=i[d+(l[b>>0]|0)>>0]|0;e=b+1|0;if((f&255)>239)break;b=993864+((f&255)<<6)|0;if(e>>>0>>0){d=b;b=e}else{d=b;b=e;m=13;break a}}c:do if((d-993864|0)>>>0>=64)do{b=b+-1|0;if(b>>>0<=a>>>0)break c}while((i[b>>0]&-64)<<24>>24==-128);while(0)}while(f<<24>>24==-3);d:do if((m|0)==13)if((d-993864|0)>>>0>=64)do{b=b+-1|0;if(b>>>0<=a>>>0)break d}while((i[b>>0]&-64)<<24>>24==-128);while(0);k[c>>2]=b-a}return}function xd(a,b,c,d,e,f,g,h,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;H=(j|0)==0;I=(j|0)!=0;E=0;F=0;G=0;while(1){C=a;x=a+b|0;D=c;y=c+d|0;z=x;if((d|0)<(b|0))if(H){r=239;q=0;o=0;n=0}else{Tc(j,0);r=239;q=0;o=0;n=0}else{A=1009832;u=0;B=a;p=D;r=0;o=C;n=0;a:while(1){s=o;if(s>>>0>>0){q=i[s>>0]|0;w=i[A+(q&255)>>0]|0;r=w&255;i[p>>0]=q;o=s+1|0;p=p+1|0;if((w&255)>239)w=q;else{w=B;A=1009832+(r<<6)|0;u=q;B=w;continue}}else w=u;if((r|0)<=239){J=43;break}b:do switch(r|0){case 247:{if(H)q=B;else{Tc(j,-2-B+o|0);Vc(j,2);q=o}i[p+-3>>0]=i[A+((w&255)+64)>>0]|0;A=1009832;u=0;B=q;p=p+-2|0;r=0;n=n+1|0;continue a}case 248:{if(H)q=B;else{Tc(j,o+~B|0);Vc(j,1);q=o}u=w&255;i[p+-3>>0]=i[A+(u+128)>>0]|0;i[p+-2>>0]=i[A+(u+64)>>0]|0;A=1009832;u=0;B=q;p=p+-1|0;r=0;n=n+1|0;continue a}case 246:{if(H)q=B;else{Tc(j,o+~B|0);Vc(j,1);q=o}i[p+-2>>0]=i[A+((w&255)+64)>>0]|0;A=1009832;u=0;B=q;p=p+-1|0;r=0;n=n+1|0;continue a}case 245:{q=w&255;r=p;i[r+-3>>0]=i[A+(q+192)>>0]|0;J=23;break}case 244:{q=w&255;r=p;J=23;break}case 243:{q=w&255;r=p;J=24;break}case 251:{i[p+-1>>0]=i[A+(w&255|256)>>0]|0;w=B;A=1009832;u=0;r=0;n=n+1|0;B=w;continue a}case 250:{q=A;r=w&255;if((q-1009832|0)>>>0<320){r=l[A+(r|512)>>0]<<8;break b}else{r=l[A+(r+128)>>0]<<8;J=29;break b}}case 249:case 252:{r=0;J=29;break}default:{J=10;break a}}while(0);if((J|0)==23){i[r+-2>>0]=i[A+(q+128)>>0]|0;J=24}else if((J|0)==29){J=0;q=A}if((J|0)==24){J=0;i[r+-1>>0]=i[A+(q+64)>>0]|0;w=B;A=1009832;u=0;r=0;n=n+1|0;B=w;continue}s=w&255;r=l[A+((q-1009832|0)>>>0<320?s|256:s+64|0)>>0]|r;s=974880+(r<<2)|0;v=l[s>>0]&127;q=l[974880+(r<<2)+1>>0]|0;if(!((q&128|0)==0|e)){s=r+1|0;q=l[974880+(s<<2)+1>>0]|0;s=974880+(s<<2)|0}u=q&127;r=m[s+2>>1]|0;q=p+(0-v)|0;t=q+u|0;if((y-t|0)<(z-o|0)){r=239;J=39;break}tf(q|0,1016936+r|0,u|0)|0;n=n+1|0;do if(!H){if(u>>>0>v>>>0){Tc(j,o-B|0);Uc(j,u-v|0);p=o;break}if(u>>>0>>0){Tc(j,o-B-v+u|0);Vc(j,v-u|0);p=o}else p=B}else p=B;while(0);if((i[s>>0]|0)>=0){A=1009832;u=0;B=p;p=t;r=0;continue}r=l[1016936+(r+u)>>0]|0;A=1009832+(r<<6)|0;u=w;B=p;p=t}c:do if((J|0)==10)J=39;else if((J|0)==43){J=0;if((A-1009832|0)>>>0<320)r=241;else while(1){q=o+-1|0;o=q;p=p+-1|0;if(q>>>0<=a>>>0){r=240;break c}if((i[q>>0]&-64)<<24>>24!=-128){r=240;break}}}while(0);d:do if((J|0)==39){J=0;o=o+-1|0;p=p+-1|0;if((A-1009832|0)>>>0>=320)do{q=o+-1|0;o=q;p=p+-1|0;if(q>>>0<=a>>>0)break d}while((i[q>>0]&-64)<<24>>24==-128)}while(0);if(I&o>>>0>B>>>0)Tc(j,o-B|0);q=o-C|0;o=p-D|0}F=q+F|0;G=o+G|0;E=n+E|0;if((r|0)!=253)break;else{a=a+q|0;b=b-q|0;c=c+o|0;d=d-o|0}}k[f>>2]=F;k[g>>2]=G;k[h>>2]=E;return}function yd(a){a=a|0;if(a|0)Qe(a);return}function zd(a){a=a|0;return Ec(k[a>>2]|0)|0}function Ad(a){a=a|0;return i[a+4>>0]|0}function Bd(a){a=a|0;if(a|0){Cd(a);Qe(a)}return}function Cd(a){a=a|0;var b=0;b=k[a+4>>2]|0;if(b|0)Qe(b);b=k[a+8>>2]|0;if(b|0)Qe(b);b=k[a+12>>2]|0;if(b|0)Qe(b);return}function Dd(a,b,c){a=a|0;b=b|0;c=c|0;return Ed(b,c)|0}function Ed(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=r;r=r+32|0;e=c+16|0;d=c+4|0;f=c+28|0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[d>>2]=0;k[d+4>>2]=0;k[d+8>>2]=0;i[f>>0]=0;a=wb(a,Vd(a)|0,b,e,d,c,f)|0;b=gf(20)|0;Fd(b,(i[f>>0]|0)!=0,a,e,d);r=c;return b|0}function Fd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;k[a>>2]=c;i[a+16>>0]=b&1;b=gf(8)|0;c=k[e>>2]&255;k[b>>2]=k[d>>2];i[b+4>>0]=c;k[a+4>>2]=b;b=gf(8)|0;c=k[e+4>>2]&255;k[b>>2]=k[d+4>>2];i[b+4>>0]=c;k[a+8>>2]=b;b=gf(8)|0;e=k[e+8>>2]&255;k[b>>2]=k[d+8>>2];i[b+4>>0]=e;k[a+12>>2]=b;return}function Gd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Hd(b,c,d,e,f)|0}function Hd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,l=0;f=r;r=r+80|0;l=f+56|0;h=f+40|0;g=f+28|0;j=f+72|0;k[l>>2]=e;k[l+4>>2]=c;k[l+8>>2]=d;k[l+12>>2]=26;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;i[j>>0]=0;e=xb(a,Vd(a)|0,b,l,h,g,f,f+24|0,j)|0;c=gf(20)|0;Fd(c,(i[j>>0]|0)!=0,e,h,g);r=f;return c|0}function Id(a){a=a|0;return (i[a+16>>0]|0)!=0|0}function Jd(a){a=a|0;return Ec(k[a>>2]|0)|0}function Kd(a,b){a=a|0;b=b|0;if(b>>>0>=3)Ka(0,b|0,3)|0;return k[a+4+(b<<2)>>2]|0}function Ld(a){a=a|0;if(a|0)Qe(a);return}function Md(a){a=a|0;return Ec(k[a>>2]|0)|0}function Nd(a){a=a|0;if(a|0)Qe(a);return}function Od(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=Pd(ua(6,c|0)|0)|0;r=b;return a|0}function Pd(a){a=a|0;var b=0;if(a>>>0>4294963200){b=Qd()|0;k[b>>2]=0-a;a=-1}return a|0}function Qd(){var a=0;if(!0)a=1097308;else{a=(Ha()|0)+64|0;a=k[a>>2]|0}return a|0}function Rd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;i=p+32|0;n=a+28|0;g=k[n>>2]|0;k[i>>2]=g;o=a+20|0;g=(k[o>>2]|0)-g|0;k[i+4>>2]=g;k[i+8>>2]=b;k[i+12>>2]=c;h=a+60|0;j=a+44|0;e=2;b=g+c|0;while(1){if(!0){k[m>>2]=k[h>>2];k[m+4>>2]=i;k[m+8>>2]=e;f=Pd(Ra(146,m|0)|0)|0}else{Oa(8,a|0);k[l>>2]=k[h>>2];k[l+4>>2]=i;k[l+8>>2]=e;f=Pd(Ra(146,l|0)|0)|0;ta(0)}if((b|0)==(f|0)){b=6;break}if((f|0)<0){b=8;break}b=b-f|0;d=k[i+4>>2]|0;if(f>>>0<=d>>>0)if((e|0)==2){k[n>>2]=(k[n>>2]|0)+f;g=d;d=i;e=2}else{g=d;d=i}else{g=k[j>>2]|0;k[n>>2]=g;k[o>>2]=g;g=k[i+12>>2]|0;f=f-d|0;d=i+8|0;e=e+-1|0}k[d>>2]=(k[d>>2]|0)+f;k[d+4>>2]=g-f;i=d}if((b|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((b|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((e|0)==2)c=0;else c=c-(k[i+4>>2]|0)|0}r=p;return c|0}function Sd(a){a=a|0;return}function Td(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((Pd(Qa(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function Ud(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;d=b&255;a:do if(!d)a=a+(Vd(a)|0)|0;else{if(a&3){c=b&255;do{e=i[a>>0]|0;if(e<<24>>24==0?1:e<<24>>24==c<<24>>24)break a;a=a+1|0}while((a&3|0)!=0)}d=ha(d,16843009)|0;c=k[a>>2]|0;b:do if(!((c&-2139062144^-2139062144)&c+-16843009))do{e=c^d;if((e&-2139062144^-2139062144)&e+-16843009|0)break b;a=a+4|0;c=k[a>>2]|0}while(!((c&-2139062144^-2139062144)&c+-16843009|0));while(0);c=b&255;while(1){e=i[a>>0]|0;if(e<<24>>24==0?1:e<<24>>24==c<<24>>24)break;else a=a+1|0}}while(0);return a|0}function Vd(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function Wd(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=rf(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+Wd(a*18446744073709551616.0,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function Xd(a,b){a=+a;b=b|0;return +(+Wd(a,b))}function Yd(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a:do if(!c)c=0;else{while(1){d=i[a>>0]|0;e=i[b>>0]|0;if(d<<24>>24!=e<<24>>24)break;c=c+-1|0;if(!c){c=0;break a}else{a=a+1|0;b=b+1|0}}c=(d&255)-(e&255)|0}while(0);return c|0}function Zd(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[1094098+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=1094186;c=5;break}}if((c|0)==2)if(!b)b=1094186;else{a=1094186;c=5}if((c|0)==5)while(1){do{c=a;a=a+1|0}while((i[c>>0]|0)!=0);b=b+-1|0;if(!b){b=a;break}else c=5}return b|0}function _d(a,b){a=a|0;b=b|0;var c=0,d=0;d=i[a>>0]|0;c=i[b>>0]|0;if(d<<24>>24==0?1:d<<24>>24!=c<<24>>24)b=d;else{do{a=a+1|0;b=b+1|0;d=i[a>>0]|0;c=i[b>>0]|0}while(!(d<<24>>24==0?1:d<<24>>24!=c<<24>>24));b=d}return (b&255)-(c&255)|0}function $d(a,b){a=a|0;b=b|0;if(!a)a=0;else a=ae(a,b)|0;return a|0}function ae(a,b){a=a|0;b=b|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=Qd()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function be(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;o=r;r=r+128|0;j=o+112|0;l=o;m=l;p=941128;q=m+112|0;do{k[m>>2]=k[p>>2];m=m+4|0;p=p+4|0}while((m|0)<(q|0));if((b+-1|0)>>>0>2147483646)if(!b){e=j;f=1;n=4}else{q=Qd()|0;k[q>>2]=75}else{e=a;f=b;n=4}if((n|0)==4?(q=-2-e|0,q=f>>>0>q>>>0?q:f,k[l+48>>2]=q,h=l+20|0,k[h>>2]=e,k[l+44>>2]=e,p=e+q|0,g=l+16|0,k[g>>2]=p,k[l+28>>2]=p,de(l,c,d)|0,q|0):0){q=k[h>>2]|0;i[q+(((q|0)==(k[g>>2]|0))<<31>>31)>>0]=0}r=o;return}function ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;tf(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function de(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+224|0;m=q+120|0;p=q+80|0;o=q;n=q+136|0;d=p;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[m>>2]=k[c>>2];if((ee(0,b,m,o,p)|0)<0)c=-1;else{c=k[a>>2]|0;l=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;j=a+48|0;if(!(k[j>>2]|0)){d=a+44|0;e=k[d>>2]|0;k[d>>2]=n;f=a+28|0;k[f>>2]=n;g=a+20|0;k[g>>2]=n;k[j>>2]=80;h=a+16|0;k[h>>2]=n+80;c=ee(a,b,m,o,p)|0;if(e){Ua[k[a+36>>2]&7](a,0,0)|0;c=(k[g>>2]|0)==0?-1:c;k[d>>2]=e;k[j>>2]=0;k[h>>2]=0;k[f>>2]=0;k[g>>2]=0}}else c=ee(a,b,m,o,p)|0;p=k[a>>2]|0;k[a>>2]=p|l;c=(p&32|0)==0?c:-1}r=q;return c|0}function ee(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0.0,n=0,o=0,q=0,s=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0;ia=r;r=r+624|0;ca=ia+24|0;ea=ia+16|0;da=ia+588|0;$=ia+576|0;ba=ia;W=ia+536|0;ga=ia+8|0;fa=ia+528|0;M=(a|0)!=0;N=W+40|0;V=N;W=W+39|0;X=ga+4|0;Y=da;Z=0-Y|0;_=$+12|0;$=$+11|0;aa=_;O=aa-Y|0;P=-2-Y|0;Q=aa+2|0;R=ca+288|0;S=da+9|0;T=S;U=da+8|0;f=0;g=0;o=0;x=b;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=Qd()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);b=i[x>>0]|0;if(!(b<<24>>24)){K=244;break}else g=x;b:while(1){switch(b<<24>>24){case 37:{b=g;K=9;break b}case 0:{b=g;break b}default:{}}J=g+1|0;b=i[J>>0]|0;g=J}c:do if((K|0)==9)while(1){K=0;if((i[b+1>>0]|0)!=37)break c;g=g+1|0;b=b+2|0;if((i[b>>0]|0)==37)K=9;else break}while(0);v=g-x|0;if(M?(k[a>>2]&32|0)==0:0)fe(x,v,a)|0;if((g|0)!=(x|0)){g=v;x=b;continue}n=b+1|0;g=i[n>>0]|0;h=(g<<24>>24)+-48|0;if(h>>>0<10){J=(i[b+2>>0]|0)==36;n=J?b+3|0:n;g=i[n>>0]|0;s=J?h:-1;o=J?1:o}else s=-1;b=g<<24>>24;d:do if((b&-32|0)==32){h=0;do{if(!(1<>24)+-32|h;n=n+1|0;g=i[n>>0]|0;b=g<<24>>24}while((b&-32|0)==32)}else h=0;while(0);do if(g<<24>>24==42){g=n+1|0;b=(i[g>>0]|0)+-48|0;if(b>>>0<10?(i[n+2>>0]|0)==36:0){k[e+(b<<2)>>2]=10;b=1;n=n+3|0;g=k[d+((i[g>>0]|0)+-48<<3)>>2]|0}else{if(o|0){f=-1;break a}if(!M){u=h;J=0;n=g;I=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);J=k[b>>2]|0;k[c>>2]=b+4;b=0;n=g;g=J}if((g|0)<0){u=h|8192;J=b;I=0-g|0}else{u=h;J=b;I=g}}else{b=(g<<24>>24)+-48|0;if(b>>>0<10){g=0;do{g=(g*10|0)+b|0;n=n+1|0;b=(i[n>>0]|0)+-48|0}while(b>>>0<10);if((g|0)<0){f=-1;break a}else{u=h;J=o;I=g}}else{u=h;J=o;I=0}}while(0);e:do if((i[n>>0]|0)==46){b=n+1|0;g=i[b>>0]|0;if(g<<24>>24!=42){h=(g<<24>>24)+-48|0;if(h>>>0<10)g=0;else{o=0;break}while(1){g=(g*10|0)+h|0;b=b+1|0;h=(i[b>>0]|0)+-48|0;if(h>>>0>=10){o=g;break e}}}b=n+2|0;g=(i[b>>0]|0)+-48|0;if(g>>>0<10?(i[n+3>>0]|0)==36:0){k[e+(g<<2)>>2]=10;o=k[d+((i[b>>0]|0)+-48<<3)>>2]|0;b=n+4|0;break}if(J|0){f=-1;break a}if(M){H=(k[c>>2]|0)+(4-1)&~(4-1);o=k[H>>2]|0;k[c>>2]=H+4}else o=0}else{o=-1;b=n}while(0);q=0;while(1){g=(i[b>>0]|0)+-65|0;if(g>>>0>57){f=-1;break a}H=b+1|0;g=i[1095990+(q*58|0)+g>>0]|0;h=g&255;if((h+-1|0)>>>0<8){b=H;q=h}else break}if(!(g<<24>>24)){f=-1;break}n=(s|0)>-1;do if(g<<24>>24==19)if(n){f=-1;break a}else K=52;else{if(n){k[e+(s<<2)>>2]=h;F=d+(s<<3)|0;G=k[F+4>>2]|0;K=ba;k[K>>2]=k[F>>2];k[K+4>>2]=G;K=52;break}if(!M){f=0;break a}he(ba,h,c)}while(0);if((K|0)==52?(K=0,!M):0){g=v;o=J;x=H;continue}s=i[b>>0]|0;s=(q|0)!=0&(s&15|0)==3?s&-33:s;h=u&-65537;G=(u&8192|0)==0?u:h;f:do switch(s|0){case 110:switch(q|0){case 0:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 1:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 2:{g=k[ba>>2]|0;k[g>>2]=f;k[g+4>>2]=((f|0)<0)<<31>>31;g=v;o=J;x=H;continue a}case 3:{j[k[ba>>2]>>1]=f;g=v;o=J;x=H;continue a}case 4:{i[k[ba>>2]>>0]=f;g=v;o=J;x=H;continue a}case 6:{k[k[ba>>2]>>2]=f;g=v;o=J;x=H;continue a}case 7:{g=k[ba>>2]|0;k[g>>2]=f;k[g+4>>2]=((f|0)<0)<<31>>31;g=v;o=J;x=H;continue a}default:{g=v;o=J;x=H;continue a}}case 112:{q=G|8;o=o>>>0>8?o:8;s=120;K=64;break}case 88:case 120:{q=G;K=64;break}case 111:{h=ba;g=k[h>>2]|0;h=k[h+4>>2]|0;if((g|0)==0&(h|0)==0)b=N;else{b=N;do{b=b+-1|0;i[b>>0]=g&7|48;g=rf(g|0,h|0,3)|0;h=L}while(!((g|0)==0&(h|0)==0))}if(!(G&8)){g=G;q=0;n=1096470;K=77}else{q=V-b|0;g=G;o=(o|0)>(q|0)?o:q+1|0;q=0;n=1096470;K=77}break}case 105:case 100:{g=ba;b=k[g>>2]|0;g=k[g+4>>2]|0;if((g|0)<0){b=pf(0,0,b|0,g|0)|0;g=L;h=ba;k[h>>2]=b;k[h+4>>2]=g;h=1;n=1096470;K=76;break f}if(!(G&2048)){n=G&1;h=n;n=(n|0)==0?1096470:1096472;K=76}else{h=1;n=1096471;K=76}break}case 117:{g=ba;b=k[g>>2]|0;g=k[g+4>>2]|0;h=0;n=1096470;K=76;break}case 99:{i[W>>0]=k[ba>>2];b=W;s=1;v=0;u=1096470;g=N;break}case 109:{g=Qd()|0;g=Zd(k[g>>2]|0)|0;K=82;break}case 115:{g=k[ba>>2]|0;g=g|0?g:1096480;K=82;break}case 67:{k[ga>>2]=k[ba>>2];k[X>>2]=0;k[ba>>2]=ga;b=ga;o=-1;K=86;break}case 83:{b=k[ba>>2]|0;if(!o){ke(a,32,I,0,G);b=0;K=97}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{m=+p[ba>>3];k[ea>>2]=0;p[t>>3]=m;if((k[t+4>>2]|0)>=0)if(!(G&2048)){F=G&1;E=F;F=(F|0)==0?1096488:1096493}else{E=1;F=1096490}else{m=-m;E=1;F=1096487}p[t>>3]=m;D=k[t+4>>2]&2146435072;do if(D>>>0<2146435072|(D|0)==2146435072&0<0){w=+Xd(m,ea)*2.0;g=w!=0.0;if(g)k[ea>>2]=(k[ea>>2]|0)+-1;B=s|32;if((B|0)==97){u=s&32;x=(u|0)==0?F:F+9|0;v=E|2;b=12-o|0;do if(!(o>>>0>11|(b|0)==0)){m=8.0;do{b=b+-1|0;m=m*16.0}while((b|0)!=0);if((i[x>>0]|0)==45){m=-(m+(-w-m));break}else{m=w+m-m;break}}else m=w;while(0);g=k[ea>>2]|0;b=(g|0)<0?0-g|0:g;b=ie(b,((b|0)<0)<<31>>31,_)|0;if((b|0)==(_|0)){i[$>>0]=48;b=$}i[b+-1>>0]=(g>>31&2)+43;q=b+-2|0;i[q>>0]=s+15;n=(o|0)<1;h=(G&8|0)==0;g=da;while(1){F=~~m;b=g+1|0;i[g>>0]=l[1096454+F>>0]|u;m=(m-+(F|0))*16.0;do if((b-Y|0)==1){if(h&(n&m==0.0))break;i[b>>0]=46;b=g+2|0}while(0);if(!(m!=0.0))break;else g=b}h=q;o=(o|0)!=0&(P+b|0)<(o|0)?Q+o-h|0:O-h+b|0;n=o+v|0;ke(a,32,I,n,G);if(!(k[a>>2]&32))fe(x,v,a)|0;ke(a,48,I,n,G^65536);g=b-Y|0;if(!(k[a>>2]&32))fe(da,g,a)|0;b=aa-h|0;ke(a,48,o-(g+b)|0,0,0);if(!(k[a>>2]&32))fe(q,b,a)|0;ke(a,32,I,n,G^8192);b=(n|0)<(I|0)?I:n;break}b=(o|0)<0?6:o;if(g){g=(k[ea>>2]|0)+-28|0;k[ea>>2]=g;m=w*268435456.0}else{m=w;g=k[ea>>2]|0}D=(g|0)<0?ca:R;C=D;h=D;do{A=~~m>>>0;k[h>>2]=A;h=h+4|0;m=(m-+(A>>>0))*1.0e9}while(m!=0.0);g=k[ea>>2]|0;if((g|0)>0){n=D;o=h;while(1){q=(g|0)>29?29:g;g=o+-4|0;do if(g>>>0>=n>>>0){h=0;do{z=sf(k[g>>2]|0,0,q|0)|0;z=of(z|0,L|0,h|0,0)|0;A=L;y=Cf(z|0,A|0,1e9,0)|0;k[g>>2]=y;h=Bf(z|0,A|0,1e9,0)|0;g=g+-4|0}while(g>>>0>=n>>>0);if(!h)break;n=n+-4|0;k[n>>2]=h}while(0);h=o;while(1){if(h>>>0<=n>>>0)break;g=h+-4|0;if(!(k[g>>2]|0))h=g;else break}g=(k[ea>>2]|0)-q|0;k[ea>>2]=g;if((g|0)>0)o=h;else break}}else n=D;if((g|0)<0){x=((b+25|0)/9|0)+1|0;y=(B|0)==102;do{v=0-g|0;v=(v|0)>9?9:v;do if(n>>>0>>0){g=(1<>>v;u=0;q=n;do{A=k[q>>2]|0;k[q>>2]=(A>>>v)+u;u=ha(A&g,o)|0;q=q+4|0}while(q>>>0>>0);g=(k[n>>2]|0)==0?n+4|0:n;if(!u){n=g;g=h;break}k[h>>2]=u;n=g;g=h+4|0}else{n=(k[n>>2]|0)==0?n+4|0:n;g=h}while(0);h=y?D:n;h=(g-h>>2|0)>(x|0)?h+(x<<2)|0:g;g=(k[ea>>2]|0)+v|0;k[ea>>2]=g}while((g|0)<0);x=n;y=h}else{x=n;y=h}do if(x>>>0>>0){g=(C-x>>2)*9|0;n=k[x>>2]|0;if(n>>>0<10)break;else h=10;do{h=h*10|0;g=g+1|0}while(n>>>0>=h>>>0)}else g=0;while(0);z=(B|0)==103;A=(b|0)!=0;h=b-((B|0)!=102?g:0)+((A&z)<<31>>31)|0;if((h|0)<(((y-C>>2)*9|0)+-9|0)){o=h+9216|0;h=D+4+(((o|0)/9|0)+-1024<<2)|0;o=((o|0)%9|0)+1|0;if((o|0)<9){n=10;do{n=n*10|0;o=o+1|0}while((o|0)!=9)}else n=10;u=k[h>>2]|0;v=(u>>>0)%(n>>>0)|0;o=(h+4|0)==(y|0);do if(o&(v|0)==0)n=x;else{w=(((u>>>0)/(n>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;q=(n|0)/2|0;if(v>>>0>>0)m=.5;else m=o&(v|0)==(q|0)?1.0:1.5;do if(E){if((i[F>>0]|0)!=45)break;w=-w;m=-m}while(0);o=u-v|0;k[h>>2]=o;if(!(w+m!=w)){n=x;break}B=o+n|0;k[h>>2]=B;if(B>>>0>999999999){g=x;while(1){n=h+-4|0;k[h>>2]=0;if(n>>>0>>0){g=g+-4|0;k[g>>2]=0}B=(k[n>>2]|0)+1|0;k[n>>2]=B;if(B>>>0>999999999)h=n;else{q=g;h=n;break}}}else q=x;g=(C-q>>2)*9|0;o=k[q>>2]|0;if(o>>>0<10){n=q;break}else n=10;do{n=n*10|0;g=g+1|0}while(o>>>0>=n>>>0);n=q}while(0);h=h+4|0;x=n;h=y>>>0>h>>>0?h:y}else h=y;v=0-g|0;B=h;while(1){if(B>>>0<=x>>>0){y=0;break}h=B+-4|0;if(!(k[h>>2]|0))B=h;else{y=1;break}}do if(z){b=(A&1^1)+b|0;if((b|0)>(g|0)&(g|0)>-5){s=s+-1|0;b=b+-1-g|0}else{s=s+-2|0;b=b+-1|0}h=G&8;if(h|0)break;do if(y){h=k[B+-4>>2]|0;if(!h){n=9;break}if(!((h>>>0)%10|0)){o=10;n=0}else{n=0;break}do{o=o*10|0;n=n+1|0}while(!((h>>>0)%(o>>>0)|0|0))}else n=9;while(0);h=((B-C>>2)*9|0)+-9|0;if((s|32|0)==102){h=h-n|0;h=(h|0)<0?0:h;b=(b|0)<(h|0)?b:h;h=0;break}else{h=h+g-n|0;h=(h|0)<0?0:h;b=(b|0)<(h|0)?b:h;h=0;break}}else h=G&8;while(0);u=b|h;o=(u|0)!=0&1;q=(s|32|0)==102;if(q){g=(g|0)>0?g:0;s=0}else{n=(g|0)<0?v:g;n=ie(n,((n|0)<0)<<31>>31,_)|0;if((aa-n|0)<2)do{n=n+-1|0;i[n>>0]=48}while((aa-n|0)<2);i[n+-1>>0]=(g>>31&2)+43;C=n+-2|0;i[C>>0]=s;g=aa-C|0;s=C}v=E+1+b+o+g|0;ke(a,32,I,v,G);if(!(k[a>>2]&32))fe(F,E,a)|0;ke(a,48,I,v,G^65536);do if(q){n=x>>>0>D>>>0?D:x;h=n;do{g=ie(k[h>>2]|0,0,S)|0;do if((h|0)==(n|0)){if((g|0)!=(S|0))break;i[U>>0]=48;g=U}else{if(g>>>0<=da>>>0)break;qf(da|0,48,g-Y|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}while(0);if(!(k[a>>2]&32))fe(g,T-g|0,a)|0;h=h+4|0}while(h>>>0<=D>>>0);do if(u|0){if(k[a>>2]&32|0)break;fe(1096522,1,a)|0}while(0);if((b|0)>0&h>>>0>>0)while(1){g=ie(k[h>>2]|0,0,S)|0;if(g>>>0>da>>>0){qf(da|0,48,g-Y|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}if(!(k[a>>2]&32))fe(g,(b|0)>9?9:b,a)|0;h=h+4|0;g=b+-9|0;if(!((b|0)>9&h>>>0>>0)){b=g;break}else b=g}ke(a,48,b+9|0,9,0)}else{q=y?B:x+4|0;if((b|0)>-1){o=(h|0)==0;n=x;do{g=ie(k[n>>2]|0,0,S)|0;if((g|0)==(S|0)){i[U>>0]=48;g=U}do if((n|0)==(x|0)){h=g+1|0;if(!(k[a>>2]&32))fe(g,1,a)|0;if(o&(b|0)<1){g=h;break}if(k[a>>2]&32|0){g=h;break}fe(1096522,1,a)|0;g=h}else{if(g>>>0<=da>>>0)break;qf(da|0,48,g+Z|0)|0;do g=g+-1|0;while(g>>>0>da>>>0)}while(0);h=T-g|0;if(!(k[a>>2]&32))fe(g,(b|0)>(h|0)?h:b,a)|0;b=b-h|0;n=n+4|0}while(n>>>0>>0&(b|0)>-1)}ke(a,48,b+18|0,18,0);if(k[a>>2]&32|0)break;fe(s,aa-s|0,a)|0}while(0);ke(a,32,I,v,G^8192);b=(v|0)<(I|0)?I:v}else{q=(s&32|0)!=0;o=m!=m|0.0!=0.0;g=o?0:E;n=g+3|0;ke(a,32,I,n,h);b=k[a>>2]|0;if(!(b&32)){fe(F,g,a)|0;b=k[a>>2]|0}if(!(b&32))fe(o?(q?1096514:1096518):q?1096506:1096510,3,a)|0;ke(a,32,I,n,G^8192);b=(n|0)<(I|0)?I:n}while(0);g=b;o=J;x=H;continue a}default:{b=x;h=G;s=o;v=0;u=1096470;g=N}}while(0);g:do if((K|0)==64){h=ba;g=k[h>>2]|0;h=k[h+4>>2]|0;n=s&32;if(!((g|0)==0&(h|0)==0)){b=N;do{b=b+-1|0;i[b>>0]=l[1096454+(g&15)>>0]|n;g=rf(g|0,h|0,4)|0;h=L}while(!((g|0)==0&(h|0)==0));K=ba;if((q&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){g=q;q=0;n=1096470;K=77}else{g=q;q=2;n=1096470+(s>>4)|0;K=77}}else{b=N;g=q;q=0;n=1096470;K=77}}else if((K|0)==76){b=ie(b,g,N)|0;g=G;q=h;K=77}else if((K|0)==82){K=0;G=je(g,0,o)|0;F=(G|0)==0;b=g;s=F?o:G-g|0;v=0;u=1096470;g=F?g+o|0:G}else if((K|0)==86){K=0;h=0;g=0;q=b;while(1){n=k[q>>2]|0;if(!n)break;g=$d(fa,n)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}ke(a,32,I,h,G);if(!h){b=0;K=97}else{n=0;while(1){g=k[b>>2]|0;if(!g){b=h;K=97;break g}g=$d(fa,g)|0;n=g+n|0;if((n|0)>(h|0)){b=h;K=97;break g}if(!(k[a>>2]&32))fe(fa,g,a)|0;if(n>>>0>=h>>>0){b=h;K=97;break}else b=b+4|0}}}while(0);if((K|0)==97){K=0;ke(a,32,I,b,G^8192);g=(I|0)>(b|0)?I:b;o=J;x=H;continue}if((K|0)==77){K=0;h=(o|0)>-1?g&-65537:g;g=ba;g=(k[g>>2]|0)!=0|(k[g+4>>2]|0)!=0;if((o|0)!=0|g){s=(g&1^1)+(V-b)|0;s=(o|0)>(s|0)?o:s;v=q;u=n;g=N}else{b=N;s=0;v=q;u=n;g=N}}q=g-b|0;n=(s|0)<(q|0)?q:s;o=v+n|0;g=(I|0)<(o|0)?o:I;ke(a,32,g,o,h);if(!(k[a>>2]&32))fe(u,v,a)|0;ke(a,48,g,o,h^65536);ke(a,48,n,q,0);if(!(k[a>>2]&32))fe(b,q,a)|0;ke(a,32,g,o,h^8192);o=J;x=H}h:do if((K|0)==244)if(!a)if(!o)f=0;else{f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b){b=0;break}he(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}while(1){f=f+1|0;if(b|0){f=-1;break h}if((f|0)>=10){f=1;break h}b=k[e+(f<<2)>>2]|0}}while(0);r=ia;return f|0}function fe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(ge(c)|0)){e=k[d>>2]|0;f=5}else d=0;else f=5;a:do if((f|0)==5){g=c+20|0;d=k[g>>2]|0;f=d;if((e-d|0)>>>0>>0){d=Ua[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Ua[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);tf(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function ge(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function he(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function ie(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=Cf(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=a;a=Bf(a|0,b|0,10,0)|0;if(!(b>>>0>9|(b|0)==9&d>>>0>4294967295))break;else b=L}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function je(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24)break a;a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);b:do if((g|0)==5)if(d){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009|0)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}else c=0;while(0);return (c|0?a:0)|0}function ke(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;g=r;r=r+256|0;f=g;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;qf(f|0,b|0,(e>>>0>256?256:e)|0)|0;d=k[a>>2]|0;c=(d&32|0)==0;if(e>>>0>255){b=e;do{if(c){fe(f,256,a)|0;d=k[a>>2]|0}b=b+-256|0;c=(d&32|0)==0}while(b>>>0>255);if(c)e=e&255;else break}else if(!c)break;fe(f,e,a)|0}while(0);r=g;return}function le(){return 0}function me(a,b){a=a|0;b=b|0;a=Ud(a,b)|0;return ((i[a>>0]|0)==(b&255)<<24>>24?a:0)|0}function ne(a,b){a=a|0;b=b|0;oe(a,b,4);return}function oe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=b;a:do if(!((e^a)&3)){d=(c|0)!=0;if(d&(e&3|0)!=0)do{e=i[b>>0]|0;i[a>>0]=e;if(!(e<<24>>24))break a;c=c+-1|0;b=b+1|0;a=a+1|0;d=(c|0)!=0}while(d&(b&3|0)!=0);if(d){if(i[b>>0]|0){b:do if(c>>>0>3)do{d=k[b>>2]|0;if((d&-2139062144^-2139062144)&d+-16843009|0)break b;k[a>>2]=d;c=c+-4|0;b=b+4|0;a=a+4|0}while(c>>>0>3);while(0);f=11}}else c=0}else f=11;while(0);c:do if((f|0)==11)if(!c)c=0;else while(1){f=i[b>>0]|0;i[a>>0]=f;if(!(f<<24>>24))break c;c=c+-1|0;a=a+1|0;if(!c){c=0;break}else b=b+1|0}while(0);qf(a|0,0,c|0)|0;return}function pe(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;de(a,b,e)|0;r=d;return}function qe(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(ge(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Ua[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function re(){var a=0,b=0,c=0;do if((k[235273]|0)>=0?(le()|0)!=0:0){if((i[941091]|0)!=10?(a=k[235259]|0,a>>>0<(k[235258]|0)>>>0):0){k[235259]=a+1;i[a>>0]=10;break}qe(941016,10)|0}else c=3;while(0);do if((c|0)==3){if((i[941091]|0)!=10?(b=k[235259]|0,b>>>0<(k[235258]|0)>>>0):0){k[235259]=b+1;i[b>>0]=10;break}qe(941016,10)|0}while(0);return}function se(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;fe(a,ha(c,b)|0,d)|0;return}function te(a,b,c){a=a|0;b=b|0;c=c|0;be(a,2147483647,b,c);return}function ue(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;te(a,b,e);r=d;return}function ve(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;i=k[274328]|0;b=i>>>a;if(b&3|0){b=(b&1^1)+a|0;c=1097352+(b<<1<<2)|0;d=c+8|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[274332]|0)>>>0)Na();a=g+12|0;if((k[a>>2]|0)==(e|0)){k[a>>2]=c;k[d>>2]=g;break}else Na()}else k[274328]=i&~(1<>2]=G|3;G=e+G+4|0;k[G>>2]=k[G>>2]|1;G=f;return G|0}g=k[274330]|0;if(o>>>0>g>>>0){if(b|0){c=2<>>12&16;c=c>>>h;e=c>>>5&8;c=c>>>e;f=c>>>2&4;c=c>>>f;d=c>>>1&2;c=c>>>d;b=c>>>1&1;b=(e|h|f|d|b)+(c>>>b)|0;c=1097352+(b<<1<<2)|0;d=c+8|0;f=k[d>>2]|0;h=f+8|0;e=k[h>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[274332]|0)>>>0)Na();a=e+12|0;if((k[a>>2]|0)==(f|0)){k[a>>2]=c;k[d>>2]=e;j=k[274330]|0;break}else Na()}else{k[274328]=i&~(1<>2]=o|3;d=f+o|0;k[d+4>>2]=g|1;k[d+g>>2]=g;if(j|0){e=k[274333]|0;b=j>>>3;c=1097352+(b<<1<<2)|0;a=k[274328]|0;b=1<>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();else{l=a;m=b}}else{k[274328]=a|b;l=c+8|0;m=c}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=c}k[274330]=g;k[274333]=d;G=h;return G|0}a=k[274329]|0;if(a){h=(a&0-a)+-1|0;F=h>>>12&16;h=h>>>F;E=h>>>5&8;h=h>>>E;G=h>>>2&4;h=h>>>G;b=h>>>1&2;h=h>>>b;i=h>>>1&1;i=k[1097616+((E|F|G|b|i)+(h>>>i)<<2)>>2]|0;h=(k[i+4>>2]&-8)-o|0;b=i;while(1){a=k[b+16>>2]|0;if(!a){a=k[b+20>>2]|0;if(!a)break}b=(k[a+4>>2]&-8)-o|0;G=b>>>0>>0;h=G?b:h;b=a;i=G?a:i}e=k[274332]|0;if(i>>>0>>0)Na();g=i+o|0;if(i>>>0>=g>>>0)Na();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){b=i+20|0;a=k[b>>2]|0;if(!a){b=i+16|0;a=k[b>>2]|0;if(!a){n=0;break}}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)Na();else{k[b>>2]=0;n=a;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Na();a=d+12|0;if((k[a>>2]|0)!=(i|0))Na();b=c+8|0;if((k[b>>2]|0)==(i|0)){k[a>>2]=c;k[b>>2]=d;n=c;break}else Na()}while(0);do if(f|0){a=k[i+28>>2]|0;b=1097616+(a<<2)|0;if((i|0)==(k[b>>2]|0)){k[b>>2]=n;if(!n){k[274329]=k[274329]&~(1<>>0<(k[274332]|0)>>>0)Na();a=f+16|0;if((k[a>>2]|0)==(i|0))k[a>>2]=n;else k[f+20>>2]=n;if(!n)break}b=k[274332]|0;if(n>>>0>>0)Na();k[n+24>>2]=f;a=k[i+16>>2]|0;do if(a|0)if(a>>>0>>0)Na();else{k[n+16>>2]=a;k[a+24>>2]=n;break}while(0);a=k[i+20>>2]|0;if(a|0)if(a>>>0<(k[274332]|0)>>>0)Na();else{k[n+20>>2]=a;k[a+24>>2]=n;break}}while(0);if(h>>>0<16){G=h+o|0;k[i+4>>2]=G|3;G=i+G+4|0;k[G>>2]=k[G>>2]|1}else{k[i+4>>2]=o|3;k[g+4>>2]=h|1;k[g+h>>2]=h;a=k[274330]|0;if(a|0){d=k[274333]|0;b=a>>>3;c=1097352+(b<<1<<2)|0;a=k[274328]|0;b=1<>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();else{p=a;q=b}}else{k[274328]=a|b;p=c+8|0;q=c}k[p>>2]=d;k[q+12>>2]=d;k[d+8>>2]=q;k[d+12>>2]=c}k[274330]=h;k[274333]=g}G=i+8|0;return G|0}}}else if(a>>>0<=4294967231){a=a+11|0;o=a&-8;j=k[274329]|0;if(j){c=0-o|0;a=a>>>8;if(a)if(o>>>0>16777215)i=31;else{q=(a+1048320|0)>>>16&8;z=a<>>16&4;z=z<>>16&2;i=14-(p|q|i)+(z<>>15)|0;i=o>>>(i+7|0)&1|i<<1}else i=0;b=k[1097616+(i<<2)>>2]|0;a:do if(!b){a=0;b=0;z=86}else{e=c;a=0;g=o<<((i|0)==31?0:25-(i>>>1)|0);h=b;b=0;while(1){d=k[h+4>>2]&-8;c=d-o|0;if(c>>>0>>0)if((d|0)==(o|0)){a=h;b=h;z=90;break a}else b=h;else c=e;d=k[h+20>>2]|0;h=k[h+16+(g>>>31<<2)>>2]|0;a=(d|0)==0|(d|0)==(h|0)?a:d;d=(h|0)==0;if(d){z=86;break}else{e=c;g=g<<(d&1^1)}}}while(0);if((z|0)==86){if((a|0)==0&(b|0)==0){a=2<>>12&16;q=q>>>m;l=q>>>5&8;q=q>>>l;n=q>>>2&4;q=q>>>n;p=q>>>1&2;q=q>>>p;a=q>>>1&1;a=k[1097616+((l|m|n|p|a)+(q>>>a)<<2)>>2]|0}if(!a){h=c;i=b}else z=90}if((z|0)==90)while(1){z=0;q=(k[a+4>>2]&-8)-o|0;d=q>>>0>>0;c=d?q:c;b=d?a:b;d=k[a+16>>2]|0;if(d|0){a=d;z=90;continue}a=k[a+20>>2]|0;if(!a){h=c;i=b;break}else z=90}if((i|0)!=0?h>>>0<((k[274330]|0)-o|0)>>>0:0){e=k[274332]|0;if(i>>>0>>0)Na();g=i+o|0;if(i>>>0>=g>>>0)Na();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){b=i+20|0;a=k[b>>2]|0;if(!a){b=i+16|0;a=k[b>>2]|0;if(!a){s=0;break}}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)Na();else{k[b>>2]=0;s=a;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Na();a=d+12|0;if((k[a>>2]|0)!=(i|0))Na();b=c+8|0;if((k[b>>2]|0)==(i|0)){k[a>>2]=c;k[b>>2]=d;s=c;break}else Na()}while(0);do if(f|0){a=k[i+28>>2]|0;b=1097616+(a<<2)|0;if((i|0)==(k[b>>2]|0)){k[b>>2]=s;if(!s){k[274329]=k[274329]&~(1<>>0<(k[274332]|0)>>>0)Na();a=f+16|0;if((k[a>>2]|0)==(i|0))k[a>>2]=s;else k[f+20>>2]=s;if(!s)break}b=k[274332]|0;if(s>>>0>>0)Na();k[s+24>>2]=f;a=k[i+16>>2]|0;do if(a|0)if(a>>>0>>0)Na();else{k[s+16>>2]=a;k[a+24>>2]=s;break}while(0);a=k[i+20>>2]|0;if(a|0)if(a>>>0<(k[274332]|0)>>>0)Na();else{k[s+20>>2]=a;k[a+24>>2]=s;break}}while(0);do if(h>>>0>=16){k[i+4>>2]=o|3;k[g+4>>2]=h|1;k[g+h>>2]=h;a=h>>>3;if(h>>>0<256){c=1097352+(a<<1<<2)|0;b=k[274328]|0;a=1<>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();else{t=a;v=b}}else{k[274328]=b|a;t=c+8|0;v=c}k[t>>2]=g;k[v+12>>2]=g;k[g+8>>2]=v;k[g+12>>2]=c;break}a=h>>>8;if(a)if(h>>>0>16777215)c=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=h>>>(c+7|0)&1|c<<1}else c=0;d=1097616+(c<<2)|0;k[g+28>>2]=c;a=g+16|0;k[a+4>>2]=0;k[a>>2]=0;a=k[274329]|0;b=1<>2]=g;k[g+24>>2]=d;k[g+12>>2]=g;k[g+8>>2]=g;break}c=h<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(h|0)){z=148;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=145;break}else{c=c<<1;d=a}}if((z|0)==145)if(b>>>0<(k[274332]|0)>>>0)Na();else{k[b>>2]=g;k[g+24>>2]=d;k[g+12>>2]=g;k[g+8>>2]=g;break}else if((z|0)==148){a=d+8|0;b=k[a>>2]|0;G=k[274332]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=g;k[a>>2]=g;k[g+8>>2]=b;k[g+12>>2]=d;k[g+24>>2]=0;break}else Na()}}else{G=h+o|0;k[i+4>>2]=G|3;G=i+G+4|0;k[G>>2]=k[G>>2]|1}while(0);G=i+8|0;return G|0}}}else o=-1;while(0);c=k[274330]|0;if(c>>>0>=o>>>0){a=c-o|0;b=k[274333]|0;if(a>>>0>15){G=b+o|0;k[274333]=G;k[274330]=a;k[G+4>>2]=a|1;k[G+a>>2]=a;k[b+4>>2]=o|3}else{k[274330]=0;k[274333]=0;k[b+4>>2]=c|3;G=b+c+4|0;k[G>>2]=k[G>>2]|1}G=b+8|0;return G|0}a=k[274331]|0;if(a>>>0>o>>>0){E=a-o|0;k[274331]=E;G=k[274334]|0;F=G+o|0;k[274334]=F;k[F+4>>2]=E|1;k[G+4>>2]=o|3;G=G+8|0;return G|0}do if(!(k[274446]|0)){a=Fa(30)|0;if(!(a+-1&a)){k[274448]=a;k[274447]=a;k[274449]=-1;k[274450]=-1;k[274451]=0;k[274439]=0;v=(Pa(0)|0)&-16^1431655768;k[274446]=v;break}else Na()}while(0);g=o+48|0;d=k[274448]|0;h=o+47|0;c=d+h|0;d=0-d|0;i=c&d;if(i>>>0<=o>>>0){G=0;return G|0}a=k[274438]|0;if(a|0?(t=k[274436]|0,v=t+i|0,v>>>0<=t>>>0|v>>>0>a>>>0):0){G=0;return G|0}b:do if(!(k[274439]&4)){b=k[274334]|0;c:do if(b){e=1097760;while(1){a=k[e>>2]|0;if(a>>>0<=b>>>0?(r=e+4|0,(a+(k[r>>2]|0)|0)>>>0>b>>>0):0)break;a=k[e+8>>2]|0;if(!a){z=173;break c}else e=a}a=c-(k[274331]|0)&d;if(a>>>0<2147483647){b=Aa(a|0)|0;if((b|0)==((k[e>>2]|0)+(k[r>>2]|0)|0)){if((b|0)!=(-1|0)){g=b;f=a;z=193;break b}}else z=183}}else z=173;while(0);do if((z|0)==173?(u=Aa(0)|0,(u|0)!=(-1|0)):0){a=u;b=k[274447]|0;c=b+-1|0;if(!(c&a))a=i;else a=i-a+(c+a&0-b)|0;b=k[274436]|0;c=b+a|0;if(a>>>0>o>>>0&a>>>0<2147483647){v=k[274438]|0;if(v|0?c>>>0<=b>>>0|c>>>0>v>>>0:0)break;b=Aa(a|0)|0;if((b|0)==(u|0)){g=u;f=a;z=193;break b}else z=183}}while(0);d:do if((z|0)==183){c=0-a|0;do if(g>>>0>a>>>0&(a>>>0<2147483647&(b|0)!=(-1|0))?(w=k[274448]|0,w=h-a+w&0-w,w>>>0<2147483647):0)if((Aa(w|0)|0)==(-1|0)){Aa(c|0)|0;break d}else{a=w+a|0;break}while(0);if((b|0)!=(-1|0)){g=b;f=a;z=193;break b}}while(0);k[274439]=k[274439]|4;z=190}else z=190;while(0);if((((z|0)==190?i>>>0<2147483647:0)?(x=Aa(i|0)|0,y=Aa(0)|0,x>>>0>>0&((x|0)!=(-1|0)&(y|0)!=(-1|0))):0)?(f=y-x|0,f>>>0>(o+40|0)>>>0):0){g=x;z=193}if((z|0)==193){a=(k[274436]|0)+f|0;k[274436]=a;if(a>>>0>(k[274437]|0)>>>0)k[274437]=a;j=k[274334]|0;do if(j){e=1097760;while(1){a=k[e>>2]|0;b=e+4|0;c=k[b>>2]|0;if((g|0)==(a+c|0)){z=203;break}d=k[e+8>>2]|0;if(!d)break;else e=d}if(((z|0)==203?(k[e+12>>2]&8|0)==0:0)?j>>>0>>0&j>>>0>=a>>>0:0){k[b>>2]=c+f;G=j+8|0;G=(G&7|0)==0?0:0-G&7;F=j+G|0;G=f-G+(k[274331]|0)|0;k[274334]=F;k[274331]=G;k[F+4>>2]=G|1;k[F+G+4>>2]=40;k[274335]=k[274450];break}a=k[274332]|0;if(g>>>0>>0){k[274332]=g;h=g}else h=a;b=g+f|0;a=1097760;while(1){if((k[a>>2]|0)==(b|0)){z=211;break}a=k[a+8>>2]|0;if(!a){b=1097760;break}}if((z|0)==211)if(!(k[a+12>>2]&8)){k[a>>2]=g;m=a+4|0;k[m>>2]=(k[m>>2]|0)+f;m=g+8|0;m=g+((m&7|0)==0?0:0-m&7)|0;a=b+8|0;a=b+((a&7|0)==0?0:0-a&7)|0;l=m+o|0;i=a-m-o|0;k[m+4>>2]=o|3;do if((a|0)!=(j|0)){if((a|0)==(k[274333]|0)){G=(k[274330]|0)+i|0;k[274330]=G;k[274333]=l;k[l+4>>2]=G|1;k[l+G>>2]=G;break}b=k[a+4>>2]|0;if((b&3|0)==1){g=b&-8;e=b>>>3;e:do if(b>>>0>=256){f=k[a+24>>2]|0;d=k[a+12>>2]|0;do if((d|0)==(a|0)){d=a+16|0;c=d+4|0;b=k[c>>2]|0;if(!b){b=k[d>>2]|0;if(!b){E=0;break}else c=d}while(1){d=b+20|0;e=k[d>>2]|0;if(e|0){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Na();else{k[c>>2]=0;E=b;break}}else{e=k[a+8>>2]|0;if(e>>>0>>0)Na();b=e+12|0;if((k[b>>2]|0)!=(a|0))Na();c=d+8|0;if((k[c>>2]|0)==(a|0)){k[b>>2]=d;k[c>>2]=e;E=d;break}else Na()}while(0);if(!f)break;b=k[a+28>>2]|0;c=1097616+(b<<2)|0;do if((a|0)!=(k[c>>2]|0)){if(f>>>0<(k[274332]|0)>>>0)Na();b=f+16|0;if((k[b>>2]|0)==(a|0))k[b>>2]=E;else k[f+20>>2]=E;if(!E)break e}else{k[c>>2]=E;if(E|0)break;k[274329]=k[274329]&~(1<>>0>>0)Na();k[E+24>>2]=f;b=a+16|0;c=k[b>>2]|0;do if(c|0)if(c>>>0>>0)Na();else{k[E+16>>2]=c;k[c+24>>2]=E;break}while(0);b=k[b+4>>2]|0;if(!b)break;if(b>>>0<(k[274332]|0)>>>0)Na();else{k[E+20>>2]=b;k[b+24>>2]=E;break}}else{c=k[a+8>>2]|0;d=k[a+12>>2]|0;b=1097352+(e<<1<<2)|0;do if((c|0)!=(b|0)){if(c>>>0>>0)Na();if((k[c+12>>2]|0)==(a|0))break;Na()}while(0);if((d|0)==(c|0)){k[274328]=k[274328]&~(1<>>0>>0)Na();b=d+8|0;if((k[b>>2]|0)==(a|0)){B=b;break}Na()}while(0);k[c+12>>2]=d;k[B>>2]=c}while(0);a=a+g|0;e=g+i|0}else e=i;a=a+4|0;k[a>>2]=k[a>>2]&-2;k[l+4>>2]=e|1;k[l+e>>2]=e;a=e>>>3;if(e>>>0<256){c=1097352+(a<<1<<2)|0;b=k[274328]|0;a=1<>2]|0;if(b>>>0>=(k[274332]|0)>>>0){F=a;G=b;break}Na()}while(0);k[F>>2]=l;k[G+12>>2]=l;k[l+8>>2]=G;k[l+12>>2]=c;break}a=e>>>8;do if(!a)c=0;else{if(e>>>0>16777215){c=31;break}F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=e>>>(c+7|0)&1|c<<1}while(0);d=1097616+(c<<2)|0;k[l+28>>2]=c;a=l+16|0;k[a+4>>2]=0;k[a>>2]=0;a=k[274329]|0;b=1<>2]=l;k[l+24>>2]=d;k[l+12>>2]=l;k[l+8>>2]=l;break}c=e<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(e|0)){z=281;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=278;break}else{c=c<<1;d=a}}if((z|0)==278)if(b>>>0<(k[274332]|0)>>>0)Na();else{k[b>>2]=l;k[l+24>>2]=d;k[l+12>>2]=l;k[l+8>>2]=l;break}else if((z|0)==281){a=d+8|0;b=k[a>>2]|0;G=k[274332]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=l;k[a>>2]=l;k[l+8>>2]=b;k[l+12>>2]=d;k[l+24>>2]=0;break}else Na()}}else{G=(k[274331]|0)+i|0;k[274331]=G;k[274334]=l;k[l+4>>2]=G|1}while(0);G=m+8|0;return G|0}else b=1097760;while(1){a=k[b>>2]|0;if(a>>>0<=j>>>0?(A=a+(k[b+4>>2]|0)|0,A>>>0>j>>>0):0)break;b=k[b+8>>2]|0}e=A+-47|0;b=e+8|0;b=e+((b&7|0)==0?0:0-b&7)|0;e=j+16|0;b=b>>>0>>0?j:b;a=b+8|0;c=g+8|0;c=(c&7|0)==0?0:0-c&7;G=g+c|0;c=f+-40-c|0;k[274334]=G;k[274331]=c;k[G+4>>2]=c|1;k[G+c+4>>2]=40;k[274335]=k[274450];c=b+4|0;k[c>>2]=27;k[a>>2]=k[274440];k[a+4>>2]=k[274441];k[a+8>>2]=k[274442];k[a+12>>2]=k[274443];k[274440]=g;k[274441]=f;k[274443]=0;k[274442]=a;a=b+24|0;do{a=a+4|0;k[a>>2]=7}while((a+4|0)>>>0>>0);if((b|0)!=(j|0)){f=b-j|0;k[c>>2]=k[c>>2]&-2;k[j+4>>2]=f|1;k[b>>2]=f;a=f>>>3;if(f>>>0<256){c=1097352+(a<<1<<2)|0;b=k[274328]|0;a=1<>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();else{C=a;D=b}}else{k[274328]=b|a;C=c+8|0;D=c}k[C>>2]=j;k[D+12>>2]=j;k[j+8>>2]=D;k[j+12>>2]=c;break}a=f>>>8;if(a)if(f>>>0>16777215)c=31;else{F=(a+1048320|0)>>>16&8;G=a<>>16&4;G=G<>>16&2;c=14-(E|F|c)+(G<>>15)|0;c=f>>>(c+7|0)&1|c<<1}else c=0;d=1097616+(c<<2)|0;k[j+28>>2]=c;k[j+20>>2]=0;k[e>>2]=0;a=k[274329]|0;b=1<>2]=j;k[j+24>>2]=d;k[j+12>>2]=j;k[j+8>>2]=j;break}c=f<<((c|0)==31?0:25-(c>>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(f|0)){z=307;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){z=304;break}else{c=c<<1;d=a}}if((z|0)==304)if(b>>>0<(k[274332]|0)>>>0)Na();else{k[b>>2]=j;k[j+24>>2]=d;k[j+12>>2]=j;k[j+8>>2]=j;break}else if((z|0)==307){a=d+8|0;b=k[a>>2]|0;G=k[274332]|0;if(b>>>0>=G>>>0&d>>>0>=G>>>0){k[b+12>>2]=j;k[a>>2]=j;k[j+8>>2]=b;k[j+12>>2]=d;k[j+24>>2]=0;break}else Na()}}}else{G=k[274332]|0;if((G|0)==0|g>>>0>>0)k[274332]=g;k[274440]=g;k[274441]=f;k[274443]=0;k[274337]=k[274446];k[274336]=-1;a=0;do{G=1097352+(a<<1<<2)|0;k[G+12>>2]=G;k[G+8>>2]=G;a=a+1|0}while((a|0)!=32);G=g+8|0;G=(G&7|0)==0?0:0-G&7;F=g+G|0;G=f+-40-G|0;k[274334]=F;k[274331]=G;k[F+4>>2]=G|1;k[F+G+4>>2]=40;k[274335]=k[274450]}while(0);a=k[274331]|0;if(a>>>0>o>>>0){E=a-o|0;k[274331]=E;G=k[274334]|0;F=G+o|0;k[274334]=F;k[F+4>>2]=E|1;k[G+4>>2]=o|3;G=G+8|0;return G|0}}G=Qd()|0;k[G>>2]=12;G=0;return G|0} +function we(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;if(!a)return;c=a+-8|0;g=k[274332]|0;if(c>>>0>>0)Na();a=k[a+-4>>2]|0;b=a&3;if((b|0)==1)Na();d=a&-8;m=c+d|0;do if(!(a&1)){a=k[c>>2]|0;if(!b)return;j=c+(0-a)|0;i=a+d|0;if(j>>>0>>0)Na();if((j|0)==(k[274333]|0)){a=m+4|0;b=k[a>>2]|0;if((b&3|0)!=3){q=j;e=i;break}k[274330]=i;k[a>>2]=b&-2;k[j+4>>2]=i|1;k[j+i>>2]=i;return}d=a>>>3;if(a>>>0<256){b=k[j+8>>2]|0;c=k[j+12>>2]|0;a=1097352+(d<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0>>0)Na();if((k[b+12>>2]|0)!=(j|0))Na()}if((c|0)==(b|0)){k[274328]=k[274328]&~(1<>>0>>0)Na();a=c+8|0;if((k[a>>2]|0)==(j|0))f=a;else Na()}else f=c+8|0;k[b+12>>2]=c;k[f>>2]=b;q=j;e=i;break}f=k[j+24>>2]|0;c=k[j+12>>2]|0;do if((c|0)==(j|0)){c=j+16|0;b=c+4|0;a=k[b>>2]|0;if(!a){a=k[c>>2]|0;if(!a){h=0;break}else b=c}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0>>0)Na();else{k[b>>2]=0;h=a;break}}else{d=k[j+8>>2]|0;if(d>>>0>>0)Na();a=d+12|0;if((k[a>>2]|0)!=(j|0))Na();b=c+8|0;if((k[b>>2]|0)==(j|0)){k[a>>2]=c;k[b>>2]=d;h=c;break}else Na()}while(0);if(f){a=k[j+28>>2]|0;b=1097616+(a<<2)|0;if((j|0)==(k[b>>2]|0)){k[b>>2]=h;if(!h){k[274329]=k[274329]&~(1<>>0<(k[274332]|0)>>>0)Na();a=f+16|0;if((k[a>>2]|0)==(j|0))k[a>>2]=h;else k[f+20>>2]=h;if(!h){q=j;e=i;break}}c=k[274332]|0;if(h>>>0>>0)Na();k[h+24>>2]=f;a=j+16|0;b=k[a>>2]|0;do if(b|0)if(b>>>0>>0)Na();else{k[h+16>>2]=b;k[b+24>>2]=h;break}while(0);a=k[a+4>>2]|0;if(a)if(a>>>0<(k[274332]|0)>>>0)Na();else{k[h+20>>2]=a;k[a+24>>2]=h;q=j;e=i;break}else{q=j;e=i}}else{q=j;e=i}}else{q=c;e=d}while(0);if(q>>>0>=m>>>0)Na();a=m+4|0;b=k[a>>2]|0;if(!(b&1))Na();if(!(b&2)){if((m|0)==(k[274334]|0)){p=(k[274331]|0)+e|0;k[274331]=p;k[274334]=q;k[q+4>>2]=p|1;if((q|0)!=(k[274333]|0))return;k[274333]=0;k[274330]=0;return}if((m|0)==(k[274333]|0)){p=(k[274330]|0)+e|0;k[274330]=p;k[274333]=q;k[q+4>>2]=p|1;k[q+p>>2]=p;return}e=(b&-8)+e|0;d=b>>>3;do if(b>>>0>=256){f=k[m+24>>2]|0;a=k[m+12>>2]|0;do if((a|0)==(m|0)){c=m+16|0;b=c+4|0;a=k[b>>2]|0;if(!a){a=k[c>>2]|0;if(!a){n=0;break}else b=c}while(1){c=a+20|0;d=k[c>>2]|0;if(d|0){a=d;b=c;continue}c=a+16|0;d=k[c>>2]|0;if(!d)break;else{a=d;b=c}}if(b>>>0<(k[274332]|0)>>>0)Na();else{k[b>>2]=0;n=a;break}}else{b=k[m+8>>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();c=b+12|0;if((k[c>>2]|0)!=(m|0))Na();d=a+8|0;if((k[d>>2]|0)==(m|0)){k[c>>2]=a;k[d>>2]=b;n=a;break}else Na()}while(0);if(f|0){a=k[m+28>>2]|0;b=1097616+(a<<2)|0;if((m|0)==(k[b>>2]|0)){k[b>>2]=n;if(!n){k[274329]=k[274329]&~(1<>>0<(k[274332]|0)>>>0)Na();a=f+16|0;if((k[a>>2]|0)==(m|0))k[a>>2]=n;else k[f+20>>2]=n;if(!n)break}c=k[274332]|0;if(n>>>0>>0)Na();k[n+24>>2]=f;a=m+16|0;b=k[a>>2]|0;do if(b|0)if(b>>>0>>0)Na();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);a=k[a+4>>2]|0;if(a|0)if(a>>>0<(k[274332]|0)>>>0)Na();else{k[n+20>>2]=a;k[a+24>>2]=n;break}}}else{b=k[m+8>>2]|0;c=k[m+12>>2]|0;a=1097352+(d<<1<<2)|0;if((b|0)!=(a|0)){if(b>>>0<(k[274332]|0)>>>0)Na();if((k[b+12>>2]|0)!=(m|0))Na()}if((c|0)==(b|0)){k[274328]=k[274328]&~(1<>>0<(k[274332]|0)>>>0)Na();a=c+8|0;if((k[a>>2]|0)==(m|0))l=a;else Na()}else l=c+8|0;k[b+12>>2]=c;k[l>>2]=b}while(0);k[q+4>>2]=e|1;k[q+e>>2]=e;if((q|0)==(k[274333]|0)){k[274330]=e;return}}else{k[a>>2]=b&-2;k[q+4>>2]=e|1;k[q+e>>2]=e}a=e>>>3;if(e>>>0<256){c=1097352+(a<<1<<2)|0;b=k[274328]|0;a=1<>2]|0;if(b>>>0<(k[274332]|0)>>>0)Na();else{o=a;p=b}}else{k[274328]=b|a;o=c+8|0;p=c}k[o>>2]=q;k[p+12>>2]=q;k[q+8>>2]=p;k[q+12>>2]=c;return}a=e>>>8;if(a)if(e>>>0>16777215)c=31;else{o=(a+1048320|0)>>>16&8;p=a<>>16&4;p=p<>>16&2;c=14-(n|o|c)+(p<>>15)|0;c=e>>>(c+7|0)&1|c<<1}else c=0;d=1097616+(c<<2)|0;k[q+28>>2]=c;k[q+20>>2]=0;k[q+16>>2]=0;a=k[274329]|0;b=1<>>1)|0);d=k[d>>2]|0;while(1){if((k[d+4>>2]&-8|0)==(e|0)){a=130;break}b=d+16+(c>>>31<<2)|0;a=k[b>>2]|0;if(!a){a=127;break}else{c=c<<1;d=a}}if((a|0)==127)if(b>>>0<(k[274332]|0)>>>0)Na();else{k[b>>2]=q;k[q+24>>2]=d;k[q+12>>2]=q;k[q+8>>2]=q;break}else if((a|0)==130){a=d+8|0;b=k[a>>2]|0;p=k[274332]|0;if(b>>>0>=p>>>0&d>>>0>=p>>>0){k[b+12>>2]=q;k[a>>2]=q;k[q+8>>2]=b;k[q+12>>2]=d;k[q+24>>2]=0;break}else Na()}}else{k[274329]=a|b;k[d>>2]=q;k[q+24>>2]=d;k[q+12>>2]=q;k[q+8>>2]=q}while(0);q=(k[274336]|0)+-1|0;k[274336]=q;if(!q)a=1097768;else return;while(1){a=k[a>>2]|0;if(!a)break;else a=a+8|0}k[274336]=-1;return}function xe(){wa(1096524,1096553,1164,1096636)}function ye(){wa(1096657,1096553,1175,1096686)}function ze(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if(c>>>0>4294967279)xe();if(c>>>0<11){i[a>>0]=c<<1;a=a+1|0}else{e=c+16&-16;d=gf(e)|0;k[a+8>>2]=d;k[a>>2]=e|1;k[a+4>>2]=c;a=d}tf(a|0,b|0,c|0)|0;i[a+c>>0]=0;return}function Ae(a){a=a|0;if(i[a>>0]&1)Qe(k[a+8>>2]|0);return}function Be(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,l=0,m=0;if((-18-b|0)>>>0>>0)xe();if(!(i[a>>0]&1))m=a+1|0;else m=k[a+8>>2]|0;if(b>>>0<2147483623){j=c+b|0;l=b<<1;j=j>>>0>>0?l:j;j=j>>>0<11?11:j+16&-16}else j=-17;l=gf(j)|0;if(e|0)tf(l|0,m|0,e|0)|0;if(g|0)tf(l+e|0,h|0,g|0)|0;c=d-f|0;if((c|0)!=(e|0))tf(l+e+g|0,m+e+f|0,c-e|0)|0;if((b|0)!=10)Qe(m);k[a+8>>2]=l;k[a>>2]=j|1;b=c+g|0;k[a+4>>2]=b;i[l+b>>0]=0;return}function Ce(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;if(b|0){d=i[a>>0]|0;if(!(d&1))e=10;else{d=k[a>>2]|0;e=(d&-2)+-1|0;d=d&255}if(!(d&1))f=(d&255)>>>1;else f=k[a+4>>2]|0;if((e-f|0)>>>0>>0){De(a,e,b-e+f|0,f,f);d=i[a>>0]|0}if(!(d&1))e=a+1|0;else e=k[a+8>>2]|0;qf(e+f|0,c|0,b|0)|0;d=f+b|0;if(!(i[a>>0]&1))i[a>>0]=d<<1;else k[a+4>>2]=d;i[e+d>>0]=0}return}function De(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;if((-17-b|0)>>>0>>0)xe();if(!(i[a>>0]&1))g=a+1|0;else g=k[a+8>>2]|0;if(b>>>0<2147483623){c=c+b|0;f=b<<1;c=c>>>0>>0?f:c;c=c>>>0<11?11:c+16&-16}else c=-17;f=gf(c)|0;if(e|0)tf(f|0,g|0,e|0)|0;if((d|0)!=(e|0))tf(f+e|0,g+e|0,d-e|0)|0;if((b|0)!=10)Qe(g);k[a+8>>2]=f;k[a>>2]=c|1;return}function Ee(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;d=i[a>>0]|0;if(!(d&1))f=10;else{d=k[a>>2]|0;f=(d&-2)+-1|0;d=d&255}e=(d&1)==0;if(e)d=(d&255)>>>1;else d=k[a+4>>2]|0;if((f-d|0)>>>0>=c>>>0){if(c|0){if(e)e=a+1|0;else e=k[a+8>>2]|0;tf(e+d|0,b|0,c|0)|0;d=d+c|0;if(!(i[a>>0]&1))i[a>>0]=d<<1;else k[a+4>>2]=d;i[e+d>>0]=0}}else Be(a,f,c-f+d|0,d,d,0,c,b);return}function Fe(a,b){a=a|0;b=b|0;Ee(a,b,Vd(b)|0);return}function Ge(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=i[a>>0]|0;d=(c&1)!=0;if(d){e=(k[a>>2]&-2)+-1|0;f=k[a+4>>2]|0}else{e=10;f=(c&255)>>>1}if((f|0)==(e|0)){De(a,e,1,e,e);if(!(i[a>>0]&1))d=7;else d=8}else if(d)d=8;else d=7;if((d|0)==7){i[a>>0]=(f<<1)+2;c=a+1|0}else if((d|0)==8){c=k[a+8>>2]|0;k[a+4>>2]=f+1}a=c+f|0;i[a>>0]=b;i[a+1>>0]=0;return}function He(a,b){a=a|0;b=b|0;var c=0,d=0;c=i[a>>0]|0;d=(c&1)==0;if(d)c=(c&255)>>>1;else c=k[a+4>>2]|0;if(c>>>0>>0)ye();if(d){i[a>>0]=b<<1;c=a+1|0}else{c=k[a+8>>2]|0;k[a+4>>2]=b}i[c+b>>0]=0;return}function Ie(a,b){a=a|0;b=b|0;var c=0,d=0;c=i[a>>0]|0;if(!(c&1)){d=(c&255)>>>1;c=a+1|0}else{d=k[a+4>>2]|0;c=k[a+8>>2]|0}if(d>>>0>b>>>0){b=je(c+b|0,44,d-b|0)|0;c=(b|0)==0?-1:b-c|0}else c=-1;return c|0}function Je(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Ke()|0;if(a|0?(d=k[a>>2]|0,d|0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=1096989;Ne(1097084,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Te(8,d,e)|0){h=k[e>>2]|0;h=Xa[k[(k[h>>2]|0)+8>>2]&3](h)|0;k[f>>2]=1096989;k[f+4>>2]=a;k[f+8>>2]=h;Ne(1096998,f)}else{k[h>>2]=1096989;k[h+4>>2]=a;Ne(1097043,h)}}Ne(1097122,g)}function Ke(){var a=0,b=0;a=r;r=r+16|0;if(!(Ia(1097808,2)|0)){b=Ga(k[274453]|0)|0;r=a;return b|0}else Ne(1096810,a);return 0}function Le(){var a=0;a=r;r=r+16|0;if(!(Ja(1097812,9)|0)){r=a;return}else Ne(1096760,a)}function Me(a){a=a|0;var b=0;b=r;r=r+16|0;we(a);if(!(La(k[274453]|0,0)|0)){r=b;return}else Ne(1096707,b)}function Ne(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;de(941016,a,c)|0;re();Na()}function Oe(a){a=a|0;return}function Pe(a){a=a|0;Qe(a);return}function Qe(a){a=a|0;we(a);return}function Re(a){a=a|0;return}function Se(a){a=a|0;return}function Te(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=Ue(b,16)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;_a[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function Ue(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+64|0;q=s;p=k[a>>2]|0;o=a+(k[p+-8>>2]|0)|0;p=k[p+-4>>2]|0;k[q>>2]=b;k[q+4>>2]=a;k[q+8>>2]=48;h=q+12|0;l=q+16|0;a=q+20|0;c=q+24|0;d=q+28|0;e=q+32|0;f=q+40|0;g=(p|0)==(b|0);m=h;n=m+40|0;do{k[m>>2]=0;m=m+4|0}while((m|0)<(n|0));j[h+40>>1]=0;i[h+42>>0]=0;a:do if(g){k[q+48>>2]=1;Za[k[(k[b>>2]|0)+20>>2]&3](b,q,o,o,1,0);a=(k[c>>2]|0)==1?o:0}else{Va[k[(k[p>>2]|0)+24>>2]&3](p,q,o,1,0);switch(k[q+36>>2]|0){case 0:{a=(k[f>>2]|0)==1&(k[d>>2]|0)==1&(k[e>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{a=0;break a}}if((k[c>>2]|0)!=1?!((k[f>>2]|0)==0&(k[d>>2]|0)==1&(k[e>>2]|0)==1):0){a=0;break}a=k[l>>2]|0}while(0);r=s;return a|0}function Ve(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))We(b,c,d,e);else{a=k[a+8>>2]|0;Za[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function We(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;i[a+53>>0]=1;do if((k[a+4>>2]|0)==(c|0)){i[a+52>>0]=1;c=a+16|0;e=k[c>>2]|0;if(!e){k[c>>2]=b;k[a+24>>2]=d;k[a+36>>2]=1;if(!((d|0)==1?(k[a+48>>2]|0)==1:0))break;i[a+54>>0]=1;break}if((e|0)!=(b|0)){d=a+36|0;k[d>>2]=(k[d>>2]|0)+1;i[a+54>>0]=1;break}e=a+24|0;c=k[e>>2]|0;if((c|0)==2){k[e>>2]=d;c=d}if((c|0)==1?(k[a+48>>2]|0)==1:0)i[a+54>>0]=1}while(0);return}function Xe(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Va[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(h=b+20|0,(k[h>>2]|0)!=(c|0)):0){k[b+32>>2]=d;g=b+44|0;if((k[g>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;d=b+53|0;i[d>>0]=0;a=k[a+8>>2]|0;Za[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[d>>0]|0)if(!(i[f>>0]|0)){f=1;d=13}else d=17;else{f=0;d=13}do if((d|0)==13){k[h>>2]=c;c=b+40|0;k[c>>2]=(k[c>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f){d=17;break}else{f=4;break}}if(f)d=17;else f=4}while(0);if((d|0)==17)f=3;k[g>>2]=f;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function Ye(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Ze(b,c,d);else{a=k[a+8>>2]|0;_a[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function Ze(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+16|0;e=k[d>>2]|0;do if(e){if((e|0)!=(b|0)){c=a+36|0;k[c>>2]=(k[c>>2]|0)+1;k[a+24>>2]=2;i[a+54>>0]=1;break}d=a+24|0;if((k[d>>2]|0)==2)k[d>>2]=c}else{k[d>>2]=b;k[a+24>>2]=c;k[a+36>>2]=1}while(0);return}function _e(a){a=a|0;Qe(a);return}function $e(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))We(b,c,d,e);return}function af(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))Ze(b,c,d);return}function cf(){var a=0,b=0,c=0,d=0;c=r;r=r+16|0;d=c+8|0;a=Ke()|0;if((a|0?(b=k[a>>2]|0,b|0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0){Ya[k[b+12>>2]&3]();Ne(1097134,c)}c=k[235310]|0;k[235310]=c+0;Ya[c&3]();Ne(1097134,d)}function df(a){a=a|0;return}function ef(a){a=a|0;Qe(a);return}function ff(a){a=a|0;return 1097187}function gf(a){a=a|0;var b=0,c=0;b=(a|0)==0?1:a;while(1){c=ve(b)|0;if(c|0){a=6;break}a=hf()|0;if(!a){a=5;break}Ya[a&3]()}if((a|0)==5){c=xa(4)|0;k[c>>2]=941332;Ma(c|0,72,6)}else if((a|0)==6)return c|0;return 0}function hf(){var a=0;a=k[274454]|0;k[274454]=a+0;return a|0}function jf(a){a=a|0;return gf(a)|0}function kf(a){a=a|0;Qe(a);return}function lf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Ua[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function mf(a){a=a|0;if(!a)a=0;else a=(Ue(a,104)|0)!=0;return a&1|0}function nf(){}function of(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function pf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function qf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function rf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function sf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<=4096)return Ca(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function uf(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)<(a|0)&(a|0)<(b+c|0)){d=a;b=b+c|0;a=a+c|0;while((c|0)>0){a=a-1|0;b=b-1|0;c=c-1|0;i[a>>0]=i[b>>0]|0}a=d}else tf(a,b,c)|0;return a|0}function vf(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function wf(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function xf(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function yf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=pf(j^a|0,i^b|0,j|0,i|0)|0;g=L;a=f^j;b=e^i;return pf((Df(h,g,pf(f^c|0,e^d|0,f|0,e|0)|0,L,0)|0)^a|0,L^b|0,a|0,b|0)|0}function zf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=pf(g^a|0,f^b|0,g|0,f|0)|0;b=L;Df(a,b,pf(j^c|0,i^d|0,j|0,i|0)|0,L,h)|0;d=pf(k[h>>2]^g|0,k[h+4>>2]^f|0,g|0,f|0)|0;c=L;r=e;return (L=c,d)|0}function Af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=xf(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function Bf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Df(a,b,c,d,0)|0}function Cf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;Df(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function Df(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g|0){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e|0){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=wf(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e|0){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e|0){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e|0){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((wf(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=of(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;pf(j|0,c|0,d|0,n|0)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=pf(d|0,n|0,o&m|0,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l|0)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e|0){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function Ef(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ua[a&7](b|0,c|0,d|0)|0}function Ff(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Va[a&3](b|0,c|0,d|0,e|0,f|0)}function Gf(a,b){a=a|0;b=b|0;Wa[a&15](b|0)}function Hf(a,b){a=a|0;b=b|0;return Xa[a&3](b|0)|0}function If(a){a=a|0;Ya[a&3]()}function Jf(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Za[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function Kf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;_a[a&3](b|0,c|0,d|0,e|0)}function Lf(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function Mf(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function Nf(a){a=a|0;ka(2)}function Of(a){a=a|0;ka(3);return 0}function Pf(){ka(4)}function Qf(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(5)}function Rf(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(6)} // EMSCRIPTEN_END_FUNCS -var Wa=[Nf,_d,ze,ye,Se,Nf,Nf,Nf];var Xa=[Of,he,ce,Of];var Ya=[Pf,Vd,fe,Yd,Zd,Wd,ke,le,Td,Ae,Pf,Pf,Pf,Pf,Pf,Pf];var Za=[Qf,me,ve,Qf];var _a=[Rf,Qd,Sd,Rf];var $a=[Sf,ge,ae,Sf];var ab=[Tf,ie,de,Tf];return{_emscripten_bind_LanguageInfo_getLanguageCode_0:Ld,_bitshift64Lshr:uf,_bitshift64Shl:sf,_malloc:cf,___cxa_is_pointer_type:ue,_emscripten_bind_LanguageGuess_getPercent_0:Cd,_emscripten_bind_VoidPtr___destroy___0:Pd,_memset:rf,_memcpy:vf,_emscripten_bind_LanguageInfo_getIsReliable_0:Kd,_i64Subtract:qf,_emscripten_bind_LanguageInfo___destroy___0:Dd,_i64Add:tf,_emscripten_bind_LanguageInfo_get_languages_1:Md,_emscripten_bind_Language_getLanguageCode_0:Od,_emscripten_bind_LanguageGuess___destroy___0:Ad,_emscripten_bind_Language___destroy___0:Nd,___cxa_can_catch:te,_free:df,_emscripten_bind_LanguageInfo_detectLanguage_5:Id,_memmove:wf,_emscripten_bind_LanguageInfo_detectLanguage_2:Fd,_emscripten_bind_LanguageGuess_getLanguageCode_0:Bd,runPostSets:pf,_emscripten_replace_memory:Va,stackAlloc:bb,stackSave:cb,stackRestore:db,establishStackSpace:eb,setThrew:fb,setTempRet0:ib,getTempRet0:jb,dynCall_iiii:Gf,dynCall_viiiii:Hf,dynCall_vi:If,dynCall_ii:Jf,dynCall_v:Kf,dynCall_viiiiii:Lf,dynCall_viiii:Mf}}) +var Ua=[Lf,Rd,Td,ce,Te,Lf,Lf,Lf];var Va=[Mf,af,Xe,Mf];var Wa=[Nf,Oe,_e,Re,Se,Pe,df,ef,Sd,Me,Nf,Nf,Nf,Nf,Nf,Nf];var Xa=[Of,Od,ff,Of];var Ya=[Pf,Je,Le,Pf];var Za=[Qf,$e,Ve,Qf];var _a=[Rf,bf,Ye,Rf];return{_emscripten_bind_LanguageInfo_getLanguageCode_0:Jd,_bitshift64Lshr:rf,_bitshift64Shl:sf,_malloc:ve,___cxa_is_pointer_type:mf,_emscripten_bind_LanguageGuess_getPercent_0:Ad,_emscripten_bind_VoidPtr___destroy___0:Nd,_memset:qf,_memcpy:tf,_emscripten_bind_LanguageInfo_getIsReliable_0:Id,_i64Subtract:pf,_emscripten_bind_LanguageInfo___destroy___0:Bd,_i64Add:of,_emscripten_bind_LanguageInfo_get_languages_1:Kd,_emscripten_bind_Language_getLanguageCode_0:Md,_emscripten_bind_LanguageGuess___destroy___0:yd,_emscripten_bind_Language___destroy___0:Ld,___cxa_can_catch:lf,_free:we,_emscripten_bind_LanguageInfo_detectLanguage_5:Gd,_memmove:uf,_emscripten_bind_LanguageInfo_detectLanguage_2:Dd,_emscripten_bind_LanguageGuess_getLanguageCode_0:zd,runPostSets:nf,_emscripten_replace_memory:Ta,stackAlloc:$a,stackSave:ab,stackRestore:bb,establishStackSpace:cb,setThrew:db,setTempRet0:gb,getTempRet0:hb,dynCall_iiii:Ef,dynCall_viiiii:Ff,dynCall_vi:Gf,dynCall_ii:Hf,dynCall_v:If,dynCall_viiiiii:Jf,dynCall_viiii:Kf}}) // EMSCRIPTEN_END_ASM -(d.ea,d.fa,buffer),yc=d._emscripten_bind_LanguageInfo_getLanguageCode_0=R._emscripten_bind_LanguageInfo_getLanguageCode_0,pc=d._bitshift64Lshr=R._bitshift64Lshr,tb=d._bitshift64Shl=R._bitshift64Shl,zc=d._emscripten_bind_LanguageGuess_getLanguageCode_0=R._emscripten_bind_LanguageGuess_getLanguageCode_0;d.___cxa_is_pointer_type=R.___cxa_is_pointer_type; -var Ac=d._emscripten_bind_LanguageGuess_getPercent_0=R._emscripten_bind_LanguageGuess_getPercent_0,Bc=d._emscripten_bind_VoidPtr___destroy___0=R._emscripten_bind_VoidPtr___destroy___0,sb=d._memset=R._memset,rc=d._memcpy=R._memcpy,Cc=d._emscripten_bind_LanguageInfo_getIsReliable_0=R._emscripten_bind_LanguageInfo_getIsReliable_0,mb=d._i64Subtract=R._i64Subtract,Dc=d._emscripten_bind_LanguageInfo___destroy___0=R._emscripten_bind_LanguageInfo___destroy___0,oc=d._i64Add=R._i64Add,Ec=d._emscripten_bind_LanguageInfo_get_languages_1= -R._emscripten_bind_LanguageInfo_get_languages_1,Fc=d._emscripten_bind_Language_getLanguageCode_0=R._emscripten_bind_Language_getLanguageCode_0,Gc=d._emscripten_bind_LanguageGuess___destroy___0=R._emscripten_bind_LanguageGuess___destroy___0,Hc=d._emscripten_bind_Language___destroy___0=R._emscripten_bind_Language___destroy___0;d.___cxa_can_catch=R.___cxa_can_catch;var Ja=d._free=R._free;d.runPostSets=R.runPostSets; -var Ic=d._emscripten_bind_LanguageInfo_detectLanguage_5=R._emscripten_bind_LanguageInfo_detectLanguage_5,vc=d._memmove=R._memmove,Jc=d._emscripten_bind_LanguageInfo_detectLanguage_2=R._emscripten_bind_LanguageInfo_detectLanguage_2,J=d._malloc=R._malloc,Ua=d._emscripten_replace_memory=R._emscripten_replace_memory;d.dynCall_iiii=R.dynCall_iiii;d.dynCall_viiiii=R.dynCall_viiiii;d.dynCall_vi=R.dynCall_vi;d.dynCall_ii=R.dynCall_ii;d.dynCall_v=R.dynCall_v;d.dynCall_viiiiii=R.dynCall_viiiiii; -d.dynCall_viiii=R.dynCall_viiii;u.H=R.stackAlloc;u.Q=R.stackSave;u.I=R.stackRestore;u.Ba=R.establishStackSpace;u.ra=R.setTempRet0;u.la=R.getTempRet0; -if(P)if("function"===typeof d.locateFile?P=d.locateFile(P):d.memoryInitializerPrefixURL&&(P=d.memoryInitializerPrefixURL+P),ea||fa){var Kc=d.readBinary(P);K.set(Kc,u.T)}else{var Lc=function(){kc(function(){throw"could not load memory initializer "+P;})};ib();var lc=function(a){a.byteLength&&(a=new Uint8Array(a));K.set(a,u.T);jb()},Mc=d.memoryInitializerRequest;if(Mc){var Nc=function(){200!==Mc.status&&0!==Mc.status?(console.warn("a problem seems to have happened with Module.memoryInitializerRequest, status: "+ -Mc.status+", retrying "+P),Lc()):lc(Mc.response)};Mc.response?setTimeout(Nc,0):Mc.addEventListener("load",Nc)}else Lc()}function n(a){this.name="ExitStatus";this.message="Program terminated with exit("+a+")";this.status=a}n.prototype=Error();n.prototype.constructor=n;var Oc=null,hb=function Pc(){d.calledRun||Qc();d.calledRun||(hb=Pc)}; -d.callMain=d.xa=function(a){function b(){for(var a=0;3>a;a++)e.push(0)}assert(0==O,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(0==Za.length,"cannot call main when preRun functions remain to be called");a=a||[];Da||(Da=!0,Ya($a));var c=a.length+1,e=[Ba(fb(d.thisProgram),"i8",0)];b();for(var f=0;f=this.size?(assert(0>=1; -break;case 4:e>>=2;break;case 8:e>>=3}for(c=0;ca;a++)e.push(0)}a=a||[];za||(za=!0,H(Ta));var d=a.length+1,e=[xa(Za(c.thisProgram),"i8",0)];b();for(var f=0;f=this.size?(assert(0>=1; +break;case 4:e>>=2;break;case 8:e>>=3}for(d=0;d .toolbarbutton-icon, #personal-bookmarks[cui-areatype="toolbar"] > #bookmarks-toolbar-placeholder > .toolbarbutton-icon { width: 16px; diff --git a/devtools/client/locales/en-US/webconsole.properties b/devtools/client/locales/en-US/webconsole.properties index f58770ecab67..b16cdb0ae865 100644 --- a/devtools/client/locales/en-US/webconsole.properties +++ b/devtools/client/locales/en-US/webconsole.properties @@ -86,6 +86,10 @@ consoleCleared=Console was cleared. # count-messages with no label provided. noCounterLabel= +# LOCALIZATION NOTE (noGroupLabel): this string is used to display +# console.group messages with no label provided. +noGroupLabel= + # LOCALIZATION NOTE (Autocomplete.blank): this string is used when inputnode # string containing anchor doesn't matches to any property in the content. Autocomplete.blank= <- no result @@ -150,6 +154,10 @@ selfxss.okstring=allow pasting # console.error() and other messages we show the stacktrace. messageToggleDetails=Show/hide message details. +# LOCALIZATION NOTE (groupToggle): the text that is displayed when +# you hover the arrow for expanding/collapsing the messages of a group. +groupToggle=Show/hide group. + # LOCALIZATION NOTE (emptySlotLabel): the text is displayed when an Array # with empty slots is printed to the console. # This is a semi-colon list of plural forms. diff --git a/devtools/client/themes/webconsole.css b/devtools/client/themes/webconsole.css index b02818a5043d..2d5e39a0e7a9 100644 --- a/devtools/client/themes/webconsole.css +++ b/devtools/client/themes/webconsole.css @@ -709,6 +709,17 @@ a.learn-more-link.webconsole-learn-more-link { flex: 1 1 100%; } +.message.startGroup .message-body, +.message.startGroupCollapsed .message-body { + color: var(--theme-body-color); + font-weight: bold; +} + +.webconsole-output-wrapper .message > .icon { + margin: 3px 0 0 0; + padding: 0 0 0 6px; +} + .message.error > .icon::before { background-position: -12px -36px; } @@ -725,6 +736,22 @@ a.learn-more-link.webconsole-learn-more-link { margin-inline-end: 5px; } +.webconsole-output-wrapper .message .indent { + display: inline-block; + border-inline-end: solid 1px var(--theme-splitter-color); +} + +.message.startGroup .indent, +.message.startGroupCollapsed .indent { + border-inline-end-color: transparent; + margin-inline-end: 5px; +} + +.message.startGroup .icon, +.message.startGroupCollapsed .icon { + display: none; +} + /* console.table() */ .new-consoletable { width: 100%; diff --git a/devtools/client/webconsole/new-console-output/actions/messages.js b/devtools/client/webconsole/new-console-output/actions/messages.js index 4aec73d99d93..467e275034a0 100644 --- a/devtools/client/webconsole/new-console-output/actions/messages.js +++ b/devtools/client/webconsole/new-console-output/actions/messages.js @@ -97,3 +97,4 @@ module.exports = { messageClose, messageTableDataGet, }; + diff --git a/devtools/client/webconsole/new-console-output/components/collapse-button.js b/devtools/client/webconsole/new-console-output/components/collapse-button.js index eba093b1dcfd..ab72fcf4d317 100644 --- a/devtools/client/webconsole/new-console-output/components/collapse-button.js +++ b/devtools/client/webconsole/new-console-output/components/collapse-button.js @@ -21,10 +21,17 @@ const CollapseButton = createClass({ propTypes: { open: PropTypes.bool.isRequired, + title: PropTypes.string, + }, + + getDefaultProps: function () { + return { + title: l10n.getStr("messageToggleDetails") + }; }, render: function () { - const { open, onClick } = this.props; + const { open, onClick, title } = this.props; let classes = ["theme-twisty"]; @@ -35,7 +42,7 @@ const CollapseButton = createClass({ return dom.a({ className: classes.join(" "), onClick, - title: l10n.getStr("messageToggleDetails"), + title: title, }); } }); diff --git a/devtools/client/webconsole/new-console-output/components/console-output.js b/devtools/client/webconsole/new-console-output/components/console-output.js index f17621383746..1ba7f8dda475 100644 --- a/devtools/client/webconsole/new-console-output/components/console-output.js +++ b/devtools/client/webconsole/new-console-output/components/console-output.js @@ -12,7 +12,12 @@ const { const ReactDOM = require("devtools/client/shared/vendor/react-dom"); const { connect } = require("devtools/client/shared/vendor/react-redux"); -const { getAllMessages, getAllMessagesUiById, getAllMessagesTableDataById } = require("devtools/client/webconsole/new-console-output/selectors/messages"); +const { + getAllMessages, + getAllMessagesUiById, + getAllMessagesTableDataById, + getAllGroupsById, +} = require("devtools/client/webconsole/new-console-output/selectors/messages"); const { getScrollSetting } = require("devtools/client/webconsole/new-console-output/selectors/ui"); const MessageContainer = createFactory(require("devtools/client/webconsole/new-console-output/components/message-container").MessageContainer); @@ -62,9 +67,15 @@ const ConsoleOutput = createClass({ messagesUi, messagesTableData, serviceContainer, + groups, } = this.props; let messageNodes = messages.map((message) => { + const parentGroups = message.groupId ? ( + (groups.get(message.groupId) || []) + .concat([message.groupId]) + ) : []; + return ( MessageContainer({ dispatch, @@ -74,6 +85,7 @@ const ConsoleOutput = createClass({ open: messagesUi.includes(message.id), tableData: messagesTableData.get(message.id), autoscroll, + indent: parentGroups.length, }) ); }); @@ -100,12 +112,13 @@ function isScrolledToBottom(outputNode, scrollNode) { scrollNode.scrollHeight - lastNodeHeight / 2; } -function mapStateToProps(state) { +function mapStateToProps(state, props) { return { messages: getAllMessages(state), messagesUi: getAllMessagesUiById(state), messagesTableData: getAllMessagesTableDataById(state), autoscroll: getScrollSetting(state), + groups: getAllGroupsById(state), }; } diff --git a/devtools/client/webconsole/new-console-output/components/message-container.js b/devtools/client/webconsole/new-console-output/components/message-container.js index 5e5d7a66c3ae..115e9e29155d 100644 --- a/devtools/client/webconsole/new-console-output/components/message-container.js +++ b/devtools/client/webconsole/new-console-output/components/message-container.js @@ -35,11 +35,13 @@ const MessageContainer = createClass({ open: PropTypes.bool.isRequired, serviceContainer: PropTypes.object.isRequired, autoscroll: PropTypes.bool.isRequired, + indent: PropTypes.number.isRequired, }, getDefaultProps: function () { return { - open: false + open: false, + indent: 0, }; }, diff --git a/devtools/client/webconsole/new-console-output/components/message-indent.js b/devtools/client/webconsole/new-console-output/components/message-indent.js new file mode 100644 index 000000000000..354e135897e4 --- /dev/null +++ b/devtools/client/webconsole/new-console-output/components/message-indent.js @@ -0,0 +1,37 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +// React & Redux +const { + createClass, + DOM: dom, + PropTypes, +} = require("devtools/client/shared/vendor/react"); + +const INDENT_WIDTH = 12; +const MessageIndent = createClass({ + + displayName: "MessageIndent", + + propTypes: { + indent: PropTypes.number.isRequired, + }, + + render: function () { + const { indent } = this.props; + return dom.span({ + className: "indent", + style: {"width": indent * INDENT_WIDTH} + }); + } +}); + +module.exports.MessageIndent = MessageIndent; + +// Exported so we can test it with unit tests. +module.exports.INDENT_WIDTH = INDENT_WIDTH; diff --git a/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js b/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js index 02d358635a47..433213b22d9e 100644 --- a/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js +++ b/devtools/client/webconsole/new-console-output/components/message-types/console-api-call.js @@ -14,6 +14,7 @@ const { } = require("devtools/client/shared/vendor/react"); const GripMessageBody = createFactory(require("devtools/client/webconsole/new-console-output/components/grip-message-body")); const ConsoleTable = createFactory(require("devtools/client/webconsole/new-console-output/components/console-table")); +const {isGroupType, l10n} = require("devtools/client/webconsole/new-console-output/utils/messages"); const Message = createFactory(require("devtools/client/webconsole/new-console-output/components/message")); @@ -23,10 +24,12 @@ ConsoleApiCall.propTypes = { message: PropTypes.object.isRequired, open: PropTypes.bool, serviceContainer: PropTypes.object.isRequired, + indent: PropTypes.number.isRequired, }; ConsoleApiCall.defaultProps = { - open: false + open: false, + indent: 0, }; function ConsoleApiCall(props) { @@ -36,6 +39,7 @@ function ConsoleApiCall(props) { open, tableData, serviceContainer, + indent, } = props; const { id: messageId, @@ -44,7 +48,8 @@ function ConsoleApiCall(props) { repeat, stacktrace, frame, - parameters + parameters, + messageText, } = message; let messageBody; @@ -59,7 +64,7 @@ function ConsoleApiCall(props) { } else if (parameters) { messageBody = formatReps(parameters); } else { - messageBody = message.messageText; + messageBody = messageText; } let attachment = null; @@ -73,11 +78,19 @@ function ConsoleApiCall(props) { }); } + let collapseTitle = null; + if (isGroupType(type)) { + collapseTitle = l10n.getStr("groupToggle"); + } + + const collapsible = attachment !== null || isGroupType(type); const topLevelClasses = ["cm-s-mozilla"]; return Message({ messageId, open, + collapsible, + collapseTitle, source, type, level, @@ -89,6 +102,7 @@ function ConsoleApiCall(props) { attachment, serviceContainer, dispatch, + indent, }); } @@ -107,3 +121,4 @@ function formatReps(parameters) { } module.exports = ConsoleApiCall; + diff --git a/devtools/client/webconsole/new-console-output/components/message-types/console-command.js b/devtools/client/webconsole/new-console-output/components/message-types/console-command.js index 5b100882cd4d..d87229fa944b 100644 --- a/devtools/client/webconsole/new-console-output/components/message-types/console-command.js +++ b/devtools/client/webconsole/new-console-output/components/message-types/console-command.js @@ -18,18 +18,24 @@ ConsoleCommand.displayName = "ConsoleCommand"; ConsoleCommand.propTypes = { message: PropTypes.object.isRequired, autoscroll: PropTypes.bool.isRequired, + indent: PropTypes.number.isRequired, +}; + +ConsoleCommand.defaultProps = { + indent: 0, }; /** * Displays input from the console. */ function ConsoleCommand(props) { + const { autoscroll, indent, message } = props; const { source, type, level, messageText: messageBody, - } = props.message; + } = message; const { serviceContainer, @@ -41,8 +47,9 @@ function ConsoleCommand(props) { level, topLevelClasses: [], messageBody, - scrollToMessage: props.autoscroll, + scrollToMessage: autoscroll, serviceContainer, + indent: indent, }; return Message(childProps); } diff --git a/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js b/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js index 98051bc5df62..a8f28e71090c 100644 --- a/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js +++ b/devtools/client/webconsole/new-console-output/components/message-types/evaluation-result.js @@ -18,10 +18,15 @@ EvaluationResult.displayName = "EvaluationResult"; EvaluationResult.propTypes = { message: PropTypes.object.isRequired, + indent: PropTypes.number.isRequired, +}; + +EvaluationResult.defaultProps = { + indent: 0, }; function EvaluationResult(props) { - const { message, serviceContainer } = props; + const { message, serviceContainer, indent } = props; const { source, type, @@ -42,6 +47,7 @@ function EvaluationResult(props) { source, type, level, + indent, topLevelClasses, messageBody, messageId, diff --git a/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js b/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js index 12cfc41324cb..e3c81a4874cb 100644 --- a/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js +++ b/devtools/client/webconsole/new-console-output/components/message-types/network-event-message.js @@ -22,10 +22,15 @@ NetworkEventMessage.propTypes = { serviceContainer: PropTypes.shape({ openNetworkPanel: PropTypes.func.isRequired, }), + indent: PropTypes.number.isRequired, +}; + +NetworkEventMessage.defaultProps = { + indent: 0, }; function NetworkEventMessage(props) { - const { message, serviceContainer } = props; + const { message, serviceContainer, indent } = props; const { actor, source, type, level, request, isXHR } = message; const topLevelClasses = [ "cm-s-mozilla" ]; @@ -47,6 +52,7 @@ function NetworkEventMessage(props) { source, type, level, + indent, topLevelClasses, messageBody, serviceContainer, diff --git a/devtools/client/webconsole/new-console-output/components/message-types/page-error.js b/devtools/client/webconsole/new-console-output/components/message-types/page-error.js index 75516b6fbd89..fb64be57d1c6 100644 --- a/devtools/client/webconsole/new-console-output/components/message-types/page-error.js +++ b/devtools/client/webconsole/new-console-output/components/message-types/page-error.js @@ -18,10 +18,12 @@ PageError.displayName = "PageError"; PageError.propTypes = { message: PropTypes.object.isRequired, open: PropTypes.bool, + indent: PropTypes.number.isRequired, }; PageError.defaultProps = { - open: false + open: false, + indent: 0, }; function PageError(props) { @@ -29,6 +31,7 @@ function PageError(props) { message, open, serviceContainer, + indent, } = props; const { id: messageId, @@ -44,10 +47,12 @@ function PageError(props) { const childProps = { messageId, open, + collapsible: true, source, type, level, topLevelClasses: [], + indent, messageBody, repeat, frame, diff --git a/devtools/client/webconsole/new-console-output/components/message.js b/devtools/client/webconsole/new-console-output/components/message.js index 7f6e80c3a857..78e0dc28558b 100644 --- a/devtools/client/webconsole/new-console-output/components/message.js +++ b/devtools/client/webconsole/new-console-output/components/message.js @@ -15,6 +15,7 @@ const { } = require("devtools/client/shared/vendor/react"); const actions = require("devtools/client/webconsole/new-console-output/actions/index"); const CollapseButton = createFactory(require("devtools/client/webconsole/new-console-output/components/collapse-button")); +const MessageIndent = createFactory(require("devtools/client/webconsole/new-console-output/components/message-indent").MessageIndent); const MessageIcon = createFactory(require("devtools/client/webconsole/new-console-output/components/message-icon")); const MessageRepeat = createFactory(require("devtools/client/webconsole/new-console-output/components/message-repeat")); const FrameView = createFactory(require("devtools/client/shared/components/frame")); @@ -25,9 +26,12 @@ const Message = createClass({ propTypes: { open: PropTypes.bool, + collapsible: PropTypes.bool, + collapseTitle: PropTypes.string, source: PropTypes.string.isRequired, type: PropTypes.string.isRequired, level: PropTypes.string.isRequired, + indent: PropTypes.number.isRequired, topLevelClasses: PropTypes.array.isRequired, messageBody: PropTypes.any.isRequired, repeat: PropTypes.any, @@ -43,6 +47,12 @@ const Message = createClass({ }), }, + getDefaultProps: function () { + return { + indent: 0 + }; + }, + componentDidMount() { if (this.messageNode) { if (this.props.scrollToMessage) { @@ -60,9 +70,12 @@ const Message = createClass({ const { messageId, open, + collapsible, + collapseTitle, source, type, level, + indent, topLevelClasses, messageBody, frame, @@ -92,9 +105,10 @@ const Message = createClass({ // If there is an expandable part, make it collapsible. let collapse = null; - if (attachment) { + if (collapsible) { collapse = CollapseButton({ open, + title: collapseTitle, onClick: function () { if (open) { dispatch(actions.messageClose(messageId)); @@ -125,7 +139,7 @@ const Message = createClass({ } }, // @TODO add timestamp - // @TODO add indent if necessary + MessageIndent({indent}), icon, collapse, dom.span({ className: "message-body-wrapper" }, diff --git a/devtools/client/webconsole/new-console-output/components/moz.build b/devtools/client/webconsole/new-console-output/components/moz.build index ad162dc82549..8c00223147c7 100644 --- a/devtools/client/webconsole/new-console-output/components/moz.build +++ b/devtools/client/webconsole/new-console-output/components/moz.build @@ -16,6 +16,7 @@ DevToolsModules( 'grip-message-body.js', 'message-container.js', 'message-icon.js', + 'message-indent.js', 'message-repeat.js', 'message.js', 'variables-view-link.js' diff --git a/devtools/client/webconsole/new-console-output/reducers/messages.js b/devtools/client/webconsole/new-console-output/reducers/messages.js index 6826bd2a5a69..0693fed60892 100644 --- a/devtools/client/webconsole/new-console-output/reducers/messages.js +++ b/devtools/client/webconsole/new-console-output/reducers/messages.js @@ -7,26 +7,46 @@ const Immutable = require("devtools/client/shared/vendor/immutable"); const constants = require("devtools/client/webconsole/new-console-output/constants"); +const {isGroupType} = require("devtools/client/webconsole/new-console-output/utils/messages"); const MessageState = Immutable.Record({ + // List of all the messages added to the console. messagesById: Immutable.List(), + // List of the message ids which are opened. messagesUiById: Immutable.List(), + // Map of the form {messageId : tableData}, which represent the data passed + // as an argument in console.table calls. messagesTableDataById: Immutable.Map(), + // Map of the form {groupMessageId : groupArray}, + // where groupArray is the list of of all the parent groups' ids of the groupMessageId. + groupsById: Immutable.Map(), + // Message id of the current group (no corresponding console.groupEnd yet). + currentGroup: null, }); function messages(state = new MessageState(), action) { - const messagesById = state.messagesById; - const messagesUiById = state.messagesUiById; - const messagesTableDataById = state.messagesTableDataById; + const { + messagesById, + messagesUiById, + messagesTableDataById, + groupsById, + currentGroup + } = state; switch (action.type) { case constants.MESSAGE_ADD: let newMessage = action.message; if (newMessage.type === constants.MESSAGE_TYPE.NULL_MESSAGE) { + // When the message has a NULL type, we don't add it. return state; } + if (newMessage.type === constants.MESSAGE_TYPE.END_GROUP) { + // Compute the new current group. + return state.set("currentGroup", getNewCurrentGroup(currentGroup, groupsById)); + } + if (newMessage.allowRepeating && messagesById.size > 0) { let lastMessage = messagesById.last(); if (lastMessage.repeatId === newMessage.repeatId) { @@ -39,15 +59,36 @@ function messages(state = new MessageState(), action) { } return state.withMutations(function (record) { - record.set("messagesById", messagesById.push(newMessage)); + // Add the new message with a reference to the parent group. + record.set( + "messagesById", + messagesById.push(newMessage.set("groupId", currentGroup)) + ); + if (newMessage.type === "trace") { + // We want the stacktrace to be open by default. record.set("messagesUiById", messagesUiById.push(newMessage.id)); + } else if (isGroupType(newMessage.type)) { + record.set("currentGroup", newMessage.id); + record.set("groupsById", + groupsById.set( + newMessage.id, + getParentGroups(currentGroup, groupsById) + ) + ); + + if (newMessage.type === constants.MESSAGE_TYPE.START_GROUP) { + // We want the group to be open by default. + record.set("messagesUiById", messagesUiById.push(newMessage.id)); + } } }); case constants.MESSAGES_CLEAR: return state.withMutations(function (record) { record.set("messagesById", Immutable.List()); record.set("messagesUiById", Immutable.List()); + record.set("groupsById", Immutable.Map()); + record.set("currentGroup", null); }); case constants.MESSAGE_OPEN: return state.set("messagesUiById", messagesUiById.push(action.id)); @@ -62,4 +103,33 @@ function messages(state = new MessageState(), action) { return state; } +function getNewCurrentGroup(currentGoup, groupsById) { + let newCurrentGroup = null; + if (currentGoup) { + // Retrieve the parent groups of the current group. + let parents = groupsById.get(currentGoup); + if (Array.isArray(parents) && parents.length > 0) { + // If there's at least one parent, make the first one the new currentGroup. + newCurrentGroup = parents[0]; + } + } + return newCurrentGroup; +} + +function getParentGroups(currentGroup, groupsById) { + let groups = []; + if (currentGroup) { + // If there is a current group, we add it as a parent + groups = [currentGroup]; + + // As well as all its parents, if it has some. + let parentGroups = groupsById.get(currentGroup); + if (Array.isArray(parentGroups) && parentGroups.length > 0) { + groups = groups.concat(parentGroups); + } + } + + return groups; +} + exports.messages = messages; diff --git a/devtools/client/webconsole/new-console-output/selectors/messages.js b/devtools/client/webconsole/new-console-output/selectors/messages.js index 3b559c91f440..c4b1aee28289 100644 --- a/devtools/client/webconsole/new-console-output/selectors/messages.js +++ b/devtools/client/webconsole/new-console-output/selectors/messages.js @@ -14,22 +14,35 @@ const { } = require("devtools/client/webconsole/new-console-output/constants"); function getAllMessages(state) { - let messages = state.messages.messagesById; + let messages = getAllMessagesById(state); let logLimit = getLogLimit(state); let filters = getAllFilters(state); + let groups = getAllGroupsById(state); + let messagesUI = getAllMessagesUiById(state); + return prune( - search( - filterNetwork( - filterLevel(messages, filters), - filters - ), - filters.text - ), + messages.filter(message => { + return ( + isInOpenedGroup(message, groups, messagesUI) + && ( + isUnfilterable(message) + || ( + matchLevelFilters(message, filters) + && matchNetworkFilters(message, filters) + && matchSearchFilters(message, filters) + ) + ) + ); + }), logLimit ); } +function getAllMessagesById(state) { + return state.messages.messagesById; +} + function getAllMessagesUiById(state) { return state.messages.messagesUiById; } @@ -38,64 +51,82 @@ function getAllMessagesTableDataById(state) { return state.messages.messagesTableDataById; } -function filterLevel(messages, filters) { - return messages.filter((message) => { - return filters.get(message.level) === true - || [MESSAGE_TYPE.COMMAND, MESSAGE_TYPE.RESULT].includes(message.type); - }); +function getAllGroupsById(state) { + return state.messages.groupsById; } -function filterNetwork(messages, filters) { - return messages.filter((message) => { - return ( - message.source !== MESSAGE_SOURCE.NETWORK - || (filters.get("net") === true && message.isXHR === false) - || (filters.get("netxhr") === true && message.isXHR === true) - || [MESSAGE_TYPE.COMMAND, MESSAGE_TYPE.RESULT].includes(message.type) - ); - }); +function getCurrentGroup(state) { + return state.messages.currentGroup; } -function search(messages, text = "") { - if (text === "") { - return messages; - } +function isUnfilterable(message) { + return [ + MESSAGE_TYPE.COMMAND, + MESSAGE_TYPE.RESULT, + MESSAGE_TYPE.START_GROUP, + MESSAGE_TYPE.START_GROUP_COLLAPSED, + ].includes(message.type); +} - return messages.filter(function (message) { - // Evaluation Results and Console Commands are never filtered. - if ([ MESSAGE_TYPE.RESULT, MESSAGE_TYPE.COMMAND ].includes(message.type)) { - return true; - } - - return ( - // @TODO currently we return true for any object grip. We should find a way to - // search object grips. - message.parameters !== null && !Array.isArray(message.parameters) - // Look for a match in location. - || isTextInFrame(text, message.frame) - // Look for a match in stacktrace. - || ( - Array.isArray(message.stacktrace) && - message.stacktrace.some(frame => isTextInFrame(text, - // isTextInFrame expect the properties of the frame object to be in the same - // order they are rendered in the Frame component. - { - functionName: frame.functionName || - l10n.getStr("stacktrace.anonymousFunction"), - filename: frame.filename, - lineNumber: frame.lineNumber, - columnNumber: frame.columnNumber - })) - ) - // Look for a match in messageText. - || (message.messageText !== null - && message.messageText.toLocaleLowerCase().includes(text.toLocaleLowerCase())) - // Look for a match in parameters. Currently only checks value grips. - || (message.parameters !== null - && message.parameters.join("").toLocaleLowerCase() - .includes(text.toLocaleLowerCase())) +function isInOpenedGroup(message, groups, messagesUI) { + return !message.groupId + || ( + !isGroupClosed(message.groupId, messagesUI) + && !hasClosedParentGroup(groups.get(message.groupId), messagesUI) ); - }); +} + +function hasClosedParentGroup(group, messagesUI) { + return group.some(groupId => isGroupClosed(groupId, messagesUI)); +} + +function isGroupClosed(groupId, messagesUI) { + return messagesUI.includes(groupId) === false; +} + +function matchLevelFilters(message, filters) { + return filters.get(message.level) === true; +} + +function matchNetworkFilters(message, filters) { + return ( + message.source !== MESSAGE_SOURCE.NETWORK + || (filters.get("net") === true && message.isXHR === false) + || (filters.get("netxhr") === true && message.isXHR === true) + ); +} + +function matchSearchFilters(message, filters) { + let text = filters.text || ""; + return ( + text === "" + // @TODO currently we return true for any object grip. We should find a way to + // search object grips. + || (message.parameters !== null && !Array.isArray(message.parameters)) + // Look for a match in location. + || isTextInFrame(text, message.frame) + // Look for a match in stacktrace. + || ( + Array.isArray(message.stacktrace) && + message.stacktrace.some(frame => isTextInFrame(text, + // isTextInFrame expect the properties of the frame object to be in the same + // order they are rendered in the Frame component. + { + functionName: frame.functionName || + l10n.getStr("stacktrace.anonymousFunction"), + filename: frame.filename, + lineNumber: frame.lineNumber, + columnNumber: frame.columnNumber + })) + ) + // Look for a match in messageText. + || (message.messageText !== null + && message.messageText.toLocaleLowerCase().includes(text.toLocaleLowerCase())) + // Look for a match in parameters. Currently only checks value grips. + || (message.parameters !== null + && message.parameters.join("").toLocaleLowerCase() + .includes(text.toLocaleLowerCase())) + ); } function isTextInFrame(text, frame) { @@ -113,7 +144,18 @@ function isTextInFrame(text, frame) { function prune(messages, logLimit) { let messageCount = messages.count(); if (messageCount > logLimit) { - return messages.splice(0, messageCount - logLimit); + // If the second non-pruned message is in a group, + // we want to return the group as the first non-pruned message. + let firstIndex = messages.size - logLimit; + let groupId = messages.get(firstIndex + 1).groupId; + + if (groupId) { + return messages.splice(0, firstIndex + 1) + .unshift( + messages.findLast((message) => message.id === groupId) + ); + } + return messages.splice(0, firstIndex); } return messages; @@ -122,3 +164,5 @@ function prune(messages, logLimit) { exports.getAllMessages = getAllMessages; exports.getAllMessagesUiById = getAllMessagesUiById; exports.getAllMessagesTableDataById = getAllMessagesTableDataById; +exports.getAllGroupsById = getAllGroupsById; +exports.getCurrentGroup = getCurrentGroup; diff --git a/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js b/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js index 9592105fd2e3..96ea2a50d907 100644 --- a/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js +++ b/devtools/client/webconsole/new-console-output/test/components/console-api-call.test.js @@ -4,13 +4,21 @@ // Test utils. const expect = require("expect"); -const { render } = require("enzyme"); +const { render, mount } = require("enzyme"); +const sinon = require("sinon"); // React const { createFactory } = require("devtools/client/shared/vendor/react"); +const Provider = createFactory(require("react-redux").Provider); +const { setupStore } = require("devtools/client/webconsole/new-console-output/test/helpers"); // Components under test. const ConsoleApiCall = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/console-api-call")); +const { + MESSAGE_OPEN, + MESSAGE_CLOSE, +} = require("devtools/client/webconsole/new-console-output/constants"); +const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/message-indent"); // Test fakes. const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index"); @@ -45,6 +53,18 @@ describe("ConsoleAPICall component:", () => { expect(wrapper.find("span > span.message-flex-body > span.message-body.devtools-monospace + span.message-repeats").length).toBe(1); }); + + it("has the expected indent", () => { + const message = stubPreparedMessages.get("console.log('foobar', 'test')"); + + const indent = 10; + let wrapper = render(ConsoleApiCall({ message, serviceContainer, indent })); + expect(wrapper.find(".indent").prop("style").width) + .toBe(`${indent * INDENT_WIDTH}px`); + + wrapper = render(ConsoleApiCall({ message, serviceContainer})); + expect(wrapper.find(".indent").prop("style").width).toBe(`0`); + }); }); describe("console.count", () => { @@ -105,4 +125,69 @@ describe("ConsoleAPICall component:", () => { expect(frameLinks.eq(2).find(".frame-link-filename").text()).toBe(filepath); }); }); + + describe("console.group", () => { + it("renders", () => { + const message = stubPreparedMessages.get("console.group('bar')"); + const wrapper = render(ConsoleApiCall({ message, serviceContainer, open: true })); + + expect(wrapper.find(".message-body").text()).toBe(message.messageText); + expect(wrapper.find(".theme-twisty.open").length).toBe(1); + }); + + it("toggle the group when the collapse button is clicked", () => { + const store = setupStore([]); + store.dispatch = sinon.spy(); + const message = stubPreparedMessages.get("console.group('bar')"); + + let wrapper = mount(Provider({store}, + ConsoleApiCall({ + message, + open: true, + dispatch: store.dispatch, + serviceContainer, + }) + )); + wrapper.find(".theme-twisty.open").simulate("click"); + let call = store.dispatch.getCall(0); + expect(call.args[0]).toEqual({ + id: message.id, + type: MESSAGE_CLOSE + }); + + wrapper = mount(Provider({store}, + ConsoleApiCall({ + message, + open: false, + dispatch: store.dispatch, + serviceContainer, + }) + )); + wrapper.find(".theme-twisty").simulate("click"); + call = store.dispatch.getCall(1); + expect(call.args[0]).toEqual({ + id: message.id, + type: MESSAGE_OPEN + }); + }); + }); + + describe("console.groupEnd", () => { + it("does not show anything", () => { + const message = stubPreparedMessages.get("console.groupEnd('bar')"); + const wrapper = render(ConsoleApiCall({ message, serviceContainer })); + + expect(wrapper.find(".message-body").text()).toBe(""); + }); + }); + + describe("console.groupCollapsed", () => { + it("renders", () => { + const message = stubPreparedMessages.get("console.groupCollapsed('foo')"); + const wrapper = render(ConsoleApiCall({ message, serviceContainer, open: false})); + + expect(wrapper.find(".message-body").text()).toBe(message.messageText); + expect(wrapper.find(".theme-twisty:not(.open)").length).toBe(1); + }); + }); }); diff --git a/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js b/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js index 4aad21a89254..600b592ab613 100644 --- a/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js +++ b/devtools/client/webconsole/new-console-output/test/components/evaluation-result.test.js @@ -11,6 +11,7 @@ const { createFactory } = require("devtools/client/shared/vendor/react"); // Components under test. const EvaluationResult = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/evaluation-result")); +const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/message-indent"); // Test fakes. const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index"); @@ -34,4 +35,16 @@ describe("EvaluationResult component:", () => { expect(wrapper.find(".message.error").length).toBe(1); }); + + it("has the expected indent", () => { + const message = stubPreparedMessages.get("new Date(0)"); + + const indent = 10; + let wrapper = render(EvaluationResult({ message, indent})); + expect(wrapper.find(".indent").prop("style").width) + .toBe(`${indent * INDENT_WIDTH}px`); + + wrapper = render(EvaluationResult({ message})); + expect(wrapper.find(".indent").prop("style").width).toBe(`0`); + }); }); diff --git a/devtools/client/webconsole/new-console-output/test/components/network-event-message.test.js b/devtools/client/webconsole/new-console-output/test/components/network-event-message.test.js index 00053db9c249..8d0c5307e109 100644 --- a/devtools/client/webconsole/new-console-output/test/components/network-event-message.test.js +++ b/devtools/client/webconsole/new-console-output/test/components/network-event-message.test.js @@ -11,6 +11,7 @@ const { createFactory } = require("devtools/client/shared/vendor/react"); // Components under test. const NetworkEventMessage = createFactory(require("devtools/client/webconsole/new-console-output/components/message-types/network-event-message")); +const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/message-indent"); // Test fakes. const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index"); @@ -30,6 +31,18 @@ describe("NetworkEventMessage component:", () => { expect(wrapper.find(".message-body .url").text()).toBe(EXPECTED_URL); expect(wrapper.find("div.message.cm-s-mozilla span.message-body.devtools-monospace").length).toBe(1); }); + + it("has the expected indent", () => { + const message = stubPreparedMessages.get("GET request"); + + const indent = 10; + let wrapper = render(NetworkEventMessage({ message, serviceContainer, indent})); + expect(wrapper.find(".indent").prop("style").width) + .toBe(`${indent * INDENT_WIDTH}px`); + + wrapper = render(NetworkEventMessage({ message, serviceContainer })); + expect(wrapper.find(".indent").prop("style").width).toBe(`0`); + }); }); describe("XHR GET request", () => { diff --git a/devtools/client/webconsole/new-console-output/test/components/page-error.test.js b/devtools/client/webconsole/new-console-output/test/components/page-error.test.js index c4a6cbc4149d..a3e34cb50371 100644 --- a/devtools/client/webconsole/new-console-output/test/components/page-error.test.js +++ b/devtools/client/webconsole/new-console-output/test/components/page-error.test.js @@ -8,6 +8,7 @@ const { render } = require("enzyme"); // Components under test. const PageError = require("devtools/client/webconsole/new-console-output/components/message-types/page-error"); +const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/message-indent"); // Test fakes. const { stubPreparedMessages } = require("devtools/client/webconsole/new-console-output/test/fixtures/stubs/index"); @@ -40,4 +41,15 @@ describe("PageError component:", () => { const frameLinks = wrapper.find(`.stack-trace span.frame-link`); expect(frameLinks.length).toBe(3); }); + + it("has the expected indent", () => { + const message = stubPreparedMessages.get("ReferenceError: asdf is not defined"); + const indent = 10; + let wrapper = render(PageError({ message, serviceContainer, indent})); + expect(wrapper.find(".indent").prop("style").width) + .toBe(`${indent * INDENT_WIDTH}px`); + + wrapper = render(PageError({ message, serviceContainer})); + expect(wrapper.find(".indent").prop("style").width).toBe(`0`); + }); }); diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js b/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js index 18ad754988f3..709984aa7278 100644 --- a/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js +++ b/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/stub-snippets.js @@ -57,8 +57,29 @@ consoleApi.set("console.table(['a', 'b', 'c'])", { code: ` console.table(['a', 'b', 'c']); `}); -// Evaluation Result +consoleApi.set("console.group('bar')", { + keys: ["console.group('bar')", "console.groupEnd('bar')"], + code: ` +console.group("bar"); +console.groupEnd("bar"); +`}); + +consoleApi.set("console.groupCollapsed('foo')", { + keys: ["console.groupCollapsed('foo')", "console.groupEnd('foo')"], + code: ` +console.groupCollapsed("foo"); +console.groupEnd("foo"); +`}); + +consoleApi.set("console.group()", { + keys: ["console.group()", "console.groupEnd()"], + code: ` +console.group(); +console.groupEnd(); +`}); + +// Evaluation Result const evaluationResultCommands = [ "new Date(0)", "asdf()" diff --git a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js index 8485805e68dc..7d76303eb6e6 100644 --- a/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js +++ b/devtools/client/webconsole/new-console-output/test/fixtures/stubs/consoleApi.js @@ -25,13 +25,14 @@ stubPreparedMessages.set("console.log('foobar', 'test')", new ConsoleMessage({ "test" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foobar\",\"test\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27foobar%27%2C%20%27test%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"foobar\",\"test\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27foobar%27%2C%20%27test%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27foobar%27%2C%20%27test%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log(undefined)", new ConsoleMessage({ @@ -47,13 +48,14 @@ stubPreparedMessages.set("console.log(undefined)", new ConsoleMessage({ } ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"undefined\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(undefined)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"undefined\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(undefined)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(undefined)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.warn('danger, will robinson!')", new ConsoleMessage({ @@ -67,13 +69,14 @@ stubPreparedMessages.set("console.warn('danger, will robinson!')", new ConsoleMe "danger, will robinson!" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"warn\",\"level\":\"warn\",\"messageText\":null,\"parameters\":[\"danger, will robinson!\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.warn(%27danger%2C%20will%20robinson!%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"warn\",\"level\":\"warn\",\"messageText\":null,\"parameters\":[\"danger, will robinson!\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.warn(%27danger%2C%20will%20robinson!%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.warn(%27danger%2C%20will%20robinson!%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log(NaN)", new ConsoleMessage({ @@ -89,13 +92,14 @@ stubPreparedMessages.set("console.log(NaN)", new ConsoleMessage({ } ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"NaN\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(NaN)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"NaN\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(NaN)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(NaN)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log(null)", new ConsoleMessage({ @@ -111,13 +115,14 @@ stubPreparedMessages.set("console.log(null)", new ConsoleMessage({ } ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"null\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(null)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"null\"}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(null)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(null)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log('鼬')", new ConsoleMessage({ @@ -131,13 +136,14 @@ stubPreparedMessages.set("console.log('鼬')", new ConsoleMessage({ "鼬" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"鼬\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%E9%BC%AC%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"鼬\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%E9%BC%AC%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%E9%BC%AC%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.clear()", new ConsoleMessage({ @@ -151,13 +157,14 @@ stubPreparedMessages.set("console.clear()", new ConsoleMessage({ "Console was cleared." ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"clear\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.clear()\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"clear\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"Console was cleared.\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.clear()\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.clear()", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.count('bar')", new ConsoleMessage({ @@ -169,13 +176,14 @@ stubPreparedMessages.set("console.count('bar')", new ConsoleMessage({ "messageText": "bar: 1", "parameters": null, "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"debug\",\"messageText\":\"bar: 1\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.count(%27bar%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"debug\",\"messageText\":\"bar: 1\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.count(%27bar%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.count(%27bar%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.assert(false, {message: 'foobar'})", new ConsoleMessage({ @@ -210,7 +218,7 @@ stubPreparedMessages.set("console.assert(false, {message: 'foobar'})", new Conso } ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"assert\",\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn8.child1/obj31\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}}],\"repeatId\":null,\"stacktrace\":[{\"columnNumber\":27,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.assert(false%2C%20%7Bmessage%3A%20%27foobar%27%7D)\",\"functionName\":\"triggerPacket\",\"language\":2,\"lineNumber\":1}],\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.assert(false%2C%20%7Bmessage%3A%20%27foobar%27%7D)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"assert\",\"level\":\"error\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn8.child1/obj31\",\"class\":\"Object\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":1,\"preview\":{\"kind\":\"Object\",\"ownProperties\":{\"message\":{\"configurable\":true,\"enumerable\":true,\"writable\":true,\"value\":\"foobar\"}},\"ownPropertiesLength\":1,\"safeGetterValues\":{}}}],\"repeatId\":null,\"stacktrace\":[{\"columnNumber\":27,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.assert(false%2C%20%7Bmessage%3A%20%27foobar%27%7D)\",\"functionName\":\"triggerPacket\",\"language\":2,\"lineNumber\":1}],\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.assert(false%2C%20%7Bmessage%3A%20%27foobar%27%7D)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": [ { "columnNumber": 27, @@ -224,7 +232,8 @@ stubPreparedMessages.set("console.assert(false, {message: 'foobar'})", new Conso "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.assert(false%2C%20%7Bmessage%3A%20%27foobar%27%7D)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log('hello \nfrom \rthe \"string world!')", new ConsoleMessage({ @@ -238,13 +247,14 @@ stubPreparedMessages.set("console.log('hello \nfrom \rthe \"string world!')", ne "hello \nfrom \rthe \"string world!" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"hello \\nfrom \\rthe \\\"string world!\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27hello%20%5Cnfrom%20%5Crthe%20%5C%22string%20world!%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"hello \\nfrom \\rthe \\\"string world!\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27hello%20%5Cnfrom%20%5Crthe%20%5C%22string%20world!%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27hello%20%5Cnfrom%20%5Crthe%20%5C%22string%20world!%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.log('úṇĩçödê țĕșť')", new ConsoleMessage({ @@ -258,13 +268,14 @@ stubPreparedMessages.set("console.log('úṇĩçödê țĕșť')", new ConsoleMe "úṇĩçödê țĕșť" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"úṇĩçödê țĕșť\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%C3%BA%E1%B9%87%C4%A9%C3%A7%C3%B6d%C3%AA%20%C8%9B%C4%95%C8%99%C5%A5%27)\",\"line\":1,\"column\":27}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"úṇĩçödê țĕșť\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%C3%BA%E1%B9%87%C4%A9%C3%A7%C3%B6d%C3%AA%20%C8%9B%C4%95%C8%99%C5%A5%27)\",\"line\":1,\"column\":27},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.log(%27%C3%BA%E1%B9%87%C4%A9%C3%A7%C3%B6d%C3%AA%20%C8%9B%C4%95%C8%99%C5%A5%27)", "line": 1, "column": 27 - } + }, + "groupId": null })); stubPreparedMessages.set("console.trace()", new ConsoleMessage({ @@ -276,7 +287,7 @@ stubPreparedMessages.set("console.trace()", new ConsoleMessage({ "messageText": null, "parameters": [], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"trace\",\"level\":\"log\",\"messageText\":null,\"parameters\":[],\"repeatId\":null,\"stacktrace\":[{\"columnNumber\":3,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"testStacktraceFiltering\",\"language\":2,\"lineNumber\":3},{\"columnNumber\":3,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"foo\",\"language\":2,\"lineNumber\":6},{\"columnNumber\":1,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"triggerPacket\",\"language\":2,\"lineNumber\":9}],\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"line\":3,\"column\":3}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"trace\",\"level\":\"log\",\"messageText\":null,\"parameters\":[],\"repeatId\":null,\"stacktrace\":[{\"columnNumber\":3,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"testStacktraceFiltering\",\"language\":2,\"lineNumber\":3},{\"columnNumber\":3,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"foo\",\"language\":2,\"lineNumber\":6},{\"columnNumber\":1,\"filename\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"functionName\":\"triggerPacket\",\"language\":2,\"lineNumber\":9}],\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()\",\"line\":3,\"column\":3},\"groupId\":null}", "stacktrace": [ { "columnNumber": 3, @@ -304,7 +315,8 @@ stubPreparedMessages.set("console.trace()", new ConsoleMessage({ "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.trace()", "line": 3, "column": 3 - } + }, + "groupId": null })); stubPreparedMessages.set("console.time('bar')", new ConsoleMessage({ @@ -316,13 +328,14 @@ stubPreparedMessages.set("console.time('bar')", new ConsoleMessage({ "messageText": null, "parameters": null, "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"nullMessage\",\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)\",\"line\":2,\"column\":1}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"nullMessage\",\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)\",\"line\":2,\"column\":1},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)", "line": 2, "column": 1 - } + }, + "groupId": null })); stubPreparedMessages.set("console.timeEnd('bar')", new ConsoleMessage({ @@ -331,16 +344,17 @@ stubPreparedMessages.set("console.timeEnd('bar')", new ConsoleMessage({ "source": "console-api", "type": "timeEnd", "level": "log", - "messageText": "bar: 1.81ms", + "messageText": "bar: 1.77ms", "parameters": null, "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"timeEnd\",\"level\":\"log\",\"messageText\":\"bar: 1.81ms\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)\",\"line\":3,\"column\":1}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"timeEnd\",\"level\":\"log\",\"messageText\":\"bar: 1.77ms\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)\",\"line\":3,\"column\":1},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.time(%27bar%27)", "line": 3, "column": 1 - } + }, + "groupId": null })); stubPreparedMessages.set("console.table('bar')", new ConsoleMessage({ @@ -354,13 +368,14 @@ stubPreparedMessages.set("console.table('bar')", new ConsoleMessage({ "bar" ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%27bar%27)\",\"line\":2,\"column\":1}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"log\",\"level\":\"log\",\"messageText\":null,\"parameters\":[\"bar\"],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%27bar%27)\",\"line\":2,\"column\":1},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%27bar%27)", "line": 2, "column": 1 - } + }, + "groupId": null })); stubPreparedMessages.set("console.table(['a', 'b', 'c'])", new ConsoleMessage({ @@ -391,13 +406,128 @@ stubPreparedMessages.set("console.table(['a', 'b', 'c'])", new ConsoleMessage({ } ], "repeat": 1, - "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"table\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn14.child1/obj31\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%5B%27a%27%2C%20%27b%27%2C%20%27c%27%5D)\",\"line\":2,\"column\":1}}", + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"table\",\"level\":\"log\",\"messageText\":null,\"parameters\":[{\"type\":\"object\",\"actor\":\"server1.conn14.child1/obj31\",\"class\":\"Array\",\"extensible\":true,\"frozen\":false,\"sealed\":false,\"ownPropertyLength\":4,\"preview\":{\"kind\":\"ArrayLike\",\"length\":3,\"items\":[\"a\",\"b\",\"c\"]}}],\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%5B%27a%27%2C%20%27b%27%2C%20%27c%27%5D)\",\"line\":2,\"column\":1},\"groupId\":null}", "stacktrace": null, "frame": { "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.table(%5B%27a%27%2C%20%27b%27%2C%20%27c%27%5D)", "line": 2, "column": 1 - } + }, + "groupId": null +})); + +stubPreparedMessages.set("console.group('bar')", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "startGroup", + "level": "log", + "messageText": "bar", + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"startGroup\",\"level\":\"log\",\"messageText\":\"bar\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)\",\"line\":2,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)", + "line": 2, + "column": 1 + }, + "groupId": null +})); + +stubPreparedMessages.set("console.groupEnd('bar')", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "endGroup", + "level": "log", + "messageText": null, + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"endGroup\",\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)\",\"line\":3,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)", + "line": 3, + "column": 1 + }, + "groupId": null +})); + +stubPreparedMessages.set("console.groupCollapsed('foo')", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "startGroupCollapsed", + "level": "log", + "messageText": "foo", + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"startGroupCollapsed\",\"level\":\"log\",\"messageText\":\"foo\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)\",\"line\":2,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)", + "line": 2, + "column": 1 + }, + "groupId": null +})); + +stubPreparedMessages.set("console.groupEnd('foo')", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "endGroup", + "level": "log", + "messageText": null, + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"endGroup\",\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)\",\"line\":3,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)", + "line": 3, + "column": 1 + }, + "groupId": null +})); + +stubPreparedMessages.set("console.group()", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "startGroup", + "level": "log", + "messageText": "", + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"startGroup\",\"level\":\"log\",\"messageText\":\"\",\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()\",\"line\":2,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()", + "line": 2, + "column": 1 + }, + "groupId": null +})); + +stubPreparedMessages.set("console.groupEnd()", new ConsoleMessage({ + "id": "1", + "allowRepeating": true, + "source": "console-api", + "type": "endGroup", + "level": "log", + "messageText": null, + "parameters": null, + "repeat": 1, + "repeatId": "{\"id\":null,\"allowRepeating\":true,\"source\":\"console-api\",\"type\":\"endGroup\",\"level\":\"log\",\"messageText\":null,\"parameters\":null,\"repeatId\":null,\"stacktrace\":null,\"frame\":{\"source\":\"http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()\",\"line\":3,\"column\":1},\"groupId\":null}", + "stacktrace": null, + "frame": { + "source": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()", + "line": 3, + "column": 1 + }, + "groupId": null })); @@ -427,7 +557,7 @@ stubPackets.set("console.log('foobar', 'test')", { }, "private": false, "styles": [], - "timeStamp": 1474757913492, + "timeStamp": 1475510513097, "timer": null, "workerType": "none", "category": "webdev" @@ -461,7 +591,7 @@ stubPackets.set("console.log(undefined)", { }, "private": false, "styles": [], - "timeStamp": 1474757916196, + "timeStamp": 1475510515740, "timer": null, "workerType": "none", "category": "webdev" @@ -493,7 +623,7 @@ stubPackets.set("console.warn('danger, will robinson!')", { }, "private": false, "styles": [], - "timeStamp": 1474757918499, + "timeStamp": 1475510518140, "timer": null, "workerType": "none", "category": "webdev" @@ -527,7 +657,7 @@ stubPackets.set("console.log(NaN)", { }, "private": false, "styles": [], - "timeStamp": 1474757920577, + "timeStamp": 1475510520239, "timer": null, "workerType": "none", "category": "webdev" @@ -561,7 +691,7 @@ stubPackets.set("console.log(null)", { }, "private": false, "styles": [], - "timeStamp": 1474757922439, + "timeStamp": 1475510522141, "timer": null, "workerType": "none", "category": "webdev" @@ -593,7 +723,7 @@ stubPackets.set("console.log('鼬')", { }, "private": false, "styles": [], - "timeStamp": 1474757924400, + "timeStamp": 1475510524415, "timer": null, "workerType": "none", "category": "webdev" @@ -622,7 +752,7 @@ stubPackets.set("console.clear()", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757926626, + "timeStamp": 1475510526448, "timer": null, "workerType": "none", "styles": [], @@ -657,7 +787,7 @@ stubPackets.set("console.count('bar')", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757929281, + "timeStamp": 1475510528672, "timer": null, "workerType": "none", "styles": [], @@ -711,7 +841,7 @@ stubPackets.set("console.assert(false, {message: 'foobar'})", { }, "private": false, "styles": [], - "timeStamp": 1474757931800, + "timeStamp": 1475510531196, "timer": null, "stacktrace": [ { @@ -752,7 +882,7 @@ stubPackets.set("console.log('hello \nfrom \rthe \"string world!')", { }, "private": false, "styles": [], - "timeStamp": 1474757936217, + "timeStamp": 1475510533644, "timer": null, "workerType": "none", "category": "webdev" @@ -784,7 +914,7 @@ stubPackets.set("console.log('úṇĩçödê țĕșť')", { }, "private": false, "styles": [], - "timeStamp": 1474757938480, + "timeStamp": 1475510535688, "timer": null, "workerType": "none", "category": "webdev" @@ -813,7 +943,7 @@ stubPackets.set("console.trace()", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757940569, + "timeStamp": 1475510537832, "timer": null, "stacktrace": [ { @@ -868,10 +998,10 @@ stubPackets.set("console.time('bar')", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757942740, + "timeStamp": 1475510540136, "timer": { "name": "bar", - "started": 1220.705 + "started": 1512.2350000000001 }, "workerType": "none", "styles": [], @@ -903,9 +1033,9 @@ stubPackets.set("console.timeEnd('bar')", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757942742, + "timeStamp": 1475510540138, "timer": { - "duration": 1.8100000000001728, + "duration": 1.7749999999998636, "name": "bar" }, "workerType": "none", @@ -938,7 +1068,7 @@ stubPackets.set("console.table('bar')", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757944789, + "timeStamp": 1475510542241, "timer": null, "workerType": "none", "styles": [], @@ -987,7 +1117,195 @@ stubPackets.set("console.table(['a', 'b', 'c'])", { "userContextId": 0 }, "private": false, - "timeStamp": 1474757946731, + "timeStamp": 1475510544147, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.group('bar')", { + "from": "server1.conn15.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [ + "bar" + ], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)", + "functionName": "triggerPacket", + "groupName": "bar", + "level": "group", + "lineNumber": 2, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510546599, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.groupEnd('bar')", { + "from": "server1.conn15.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [ + "bar" + ], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group(%27bar%27)", + "functionName": "triggerPacket", + "groupName": "bar", + "level": "groupEnd", + "lineNumber": 3, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510546601, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.groupCollapsed('foo')", { + "from": "server1.conn16.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [ + "foo" + ], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)", + "functionName": "triggerPacket", + "groupName": "foo", + "level": "groupCollapsed", + "lineNumber": 2, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510548649, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.groupEnd('foo')", { + "from": "server1.conn16.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [ + "foo" + ], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.groupCollapsed(%27foo%27)", + "functionName": "triggerPacket", + "groupName": "foo", + "level": "groupEnd", + "lineNumber": 3, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510548650, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.group()", { + "from": "server1.conn17.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()", + "functionName": "triggerPacket", + "groupName": "", + "level": "group", + "lineNumber": 2, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510550811, + "timer": null, + "workerType": "none", + "styles": [], + "category": "webdev" + } +}); + +stubPackets.set("console.groupEnd()", { + "from": "server1.conn17.child1/consoleActor2", + "type": "consoleAPICall", + "message": { + "arguments": [], + "columnNumber": 1, + "counter": null, + "filename": "http://example.com/browser/devtools/client/webconsole/new-console-output/test/fixtures/stub-generators/test-tempfile.js?key=console.group()", + "functionName": "triggerPacket", + "groupName": "", + "level": "groupEnd", + "lineNumber": 3, + "originAttributes": { + "addonId": "", + "appId": 0, + "firstPartyDomain": "", + "inIsolatedMozBrowser": false, + "privateBrowsingId": 0, + "signedPkg": "", + "userContextId": 0 + }, + "private": false, + "timeStamp": 1475510550813, "timer": null, "workerType": "none", "styles": [], diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini index 1f755f5bcf72..45a9b9ecedb0 100644 --- a/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser.ini @@ -3,11 +3,13 @@ tags = devtools subsuite = devtools support-files = head.js - !/devtools/client/framework/test/shared-head.js - test-console-table.html test-console.html test-console-filters.html + test-console-group.html + test-console-table.html + !/devtools/client/framework/test/shared-head.js +[browser_webconsole_console_group.js] [browser_webconsole_console_table.js] [browser_webconsole_filters.js] [browser_webconsole_init.js] @@ -15,4 +17,3 @@ support-files = [browser_webconsole_keyboard_accessibility.js] [browser_webconsole_observer_notifications.js] [browser_webconsole_vview_close_on_esc_key.js] - diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js new file mode 100644 index 000000000000..49af126ebec7 --- /dev/null +++ b/devtools/client/webconsole/new-console-output/test/mochitest/browser_webconsole_console_group.js @@ -0,0 +1,70 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// Check console.group, console.groupCollapsed and console.groupEnd calls +// behave as expected. + +const TEST_URI = "http://example.com/browser/devtools/client/webconsole/new-console-output/test/mochitest/test-console-group.html"; +const { INDENT_WIDTH } = require("devtools/client/webconsole/new-console-output/components/message-indent"); + +add_task(function* () { + let toolbox = yield openNewTabAndToolbox(TEST_URI, "webconsole"); + let hud = toolbox.getCurrentPanel().hud; + + info("Test a group at root level"); + let node = yield waitFor(() => findMessage(hud, "group-1")); + testClass(node, "startGroup"); + testIndent(node, 0); + + info("Test a message in a 1 level deep group"); + node = yield waitFor(() => findMessage(hud, "log-1")); + testClass(node, "log"); + testIndent(node, 1); + + info("Test a group in a 1 level deep group"); + node = yield waitFor(() => findMessage(hud, "group-2")); + testClass(node, "startGroup"); + testIndent(node, 1); + + info("Test a message in a 2 level deep group"); + node = yield waitFor(() => findMessage(hud, "log-2")); + testClass(node, "log"); + testIndent(node, 2); + + info("Test a message in a 1 level deep group, after closing a 2 level deep group"); + node = yield waitFor(() => findMessage(hud, "log-3")); + testClass(node, "log"); + testIndent(node, 1); + + info("Test a message at root level, after closing all the groups"); + node = yield waitFor(() => findMessage(hud, "log-4")); + testClass(node, "log"); + testIndent(node, 0); + + info("Test a collapsed group at root level"); + node = yield waitFor(() => findMessage(hud, "group-3")); + testClass(node, "startGroupCollapsed"); + testIndent(node, 0); + + info("Test a message at root level, after closing a collapsed group"); + node = yield waitFor(() => findMessage(hud, "log-6")); + testClass(node, "log"); + testIndent(node, 0); + + let nodes = hud.ui.experimentalOutputNode.querySelectorAll(".message"); + is(nodes.length, 8, "expected number of messages are displayed"); +}); + +function testClass(node, className) { + ok(node.classList.contains(className, "message has the expected class")); +} + +function testIndent(node, indent) { + indent = `${indent * INDENT_WIDTH}px`; + is(node.querySelector(".indent").style.width, indent, + "message has the expected level of indentation"); +} diff --git a/devtools/client/webconsole/new-console-output/test/mochitest/test-console-group.html b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-group.html new file mode 100644 index 000000000000..688c7d059f09 --- /dev/null +++ b/devtools/client/webconsole/new-console-output/test/mochitest/test-console-group.html @@ -0,0 +1,26 @@ + + + + + Webconsole console.group test page + + +

console.group() & console.groupCollapsed() test page

+ + + diff --git a/devtools/client/webconsole/new-console-output/test/store/filters.test.js b/devtools/client/webconsole/new-console-output/test/store/filters.test.js index d2ce21e22e7b..3c38a255a28b 100644 --- a/devtools/client/webconsole/new-console-output/test/store/filters.test.js +++ b/devtools/client/webconsole/new-console-output/test/store/filters.test.js @@ -19,8 +19,8 @@ describe("Filtering", () => { let store; let numMessages; // Number of messages in prepareBaseStore which are not filtered out, i.e. Evaluation - // Results and console commands . - const numUnfilterableMessages = 2; + // Results, console commands and console.groups . + const numUnfilterableMessages = 3; beforeEach(() => { store = prepareBaseStore(); @@ -204,7 +204,8 @@ function prepareBaseStore() { // Evaluation Result - never filtered "new Date(0)", // PageError - "ReferenceError: asdf is not defined" + "ReferenceError: asdf is not defined", + "console.group('bar')" ]); // Console Command - never filtered diff --git a/devtools/client/webconsole/new-console-output/test/store/messages.test.js b/devtools/client/webconsole/new-console-output/test/store/messages.test.js index ad98f478d0b2..f40e325315ce 100644 --- a/devtools/client/webconsole/new-console-output/test/store/messages.test.js +++ b/devtools/client/webconsole/new-console-output/test/store/messages.test.js @@ -5,6 +5,8 @@ const { getAllMessages, getAllMessagesUiById, + getAllGroupsById, + getCurrentGroup, } = require("devtools/client/webconsole/new-console-output/selectors/messages"); const { setupActions, @@ -131,6 +133,75 @@ describe("Message reducer:", () => { const tableMessage = messages.last(); expect(tableMessage.level).toEqual(MESSAGE_TYPE.LOG); }); + + it("adds console.group messages to the store", () => { + const { dispatch, getState } = setupStore([]); + + const message = stubPackets.get("console.group('bar')"); + dispatch(actions.messageAdd(message)); + + const messages = getAllMessages(getState()); + expect(messages.size).toBe(1); + }); + + it("sets groupId property as expected", () => { + const { dispatch, getState } = setupStore([]); + + dispatch(actions.messageAdd( + stubPackets.get("console.group('bar')"))); + + const packet = stubPackets.get("console.log('foobar', 'test')"); + dispatch(actions.messageAdd(packet)); + + const messages = getAllMessages(getState()); + expect(messages.size).toBe(2); + expect(messages.last().groupId).toBe(messages.first().id); + }); + + it("does not display console.groupEnd messages to the store", () => { + const { dispatch, getState } = setupStore([]); + + const message = stubPackets.get("console.groupEnd('bar')"); + dispatch(actions.messageAdd(message)); + + const messages = getAllMessages(getState()); + expect(messages.size).toBe(0); + }); + + it("filters out message added after a console.groupCollapsed message", () => { + const { dispatch, getState } = setupStore([]); + + const message = stubPackets.get("console.groupCollapsed('foo')"); + dispatch(actions.messageAdd(message)); + + dispatch(actions.messageAdd( + stubPackets.get("console.log('foobar', 'test')"))); + + const messages = getAllMessages(getState()); + expect(messages.size).toBe(1); + }); + + it("shows the group of the first displayed message when messages are pruned", () => { + const { dispatch, getState } = setupStore([]); + + const logLimit = 1000; + + const groupMessage = stubPreparedMessages.get("console.group('bar')"); + dispatch(actions.messageAdd( + stubPackets.get("console.group('bar')"))); + + const packet = stubPackets.get("console.log(undefined)"); + for (let i = 1; i <= logLimit + 1; i++) { + packet.message.arguments = [`message num ${i}`]; + dispatch(actions.messageAdd(packet)); + } + + const messages = getAllMessages(getState()); + expect(messages.count()).toBe(logLimit); + expect(messages.first().messageText).toBe(groupMessage.messageText); + expect(messages.get(1).parameters[0]).toBe(`message num 3`); + expect(messages.last().parameters[0]).toBe(`message num ${logLimit + 1}`); + }); }); describe("messagesUiById", () => { @@ -160,5 +231,112 @@ describe("Message reducer:", () => { const messagesUi = getAllMessagesUiById(getState()); expect(messagesUi.size).toBe(0); }); + + it("opens console.group messages when they are added", () => { + const { dispatch, getState } = setupStore([]); + + const message = stubPackets.get("console.group('bar')"); + dispatch(actions.messageAdd(message)); + + const messages = getAllMessages(getState()); + const messagesUi = getAllMessagesUiById(getState()); + expect(messagesUi.size).toBe(1); + expect(messagesUi.first()).toBe(messages.first().id); + }); + + it("does not open console.groupCollapsed messages when they are added", () => { + const { dispatch, getState } = setupStore([]); + + const message = stubPackets.get("console.groupCollapsed('foo')"); + dispatch(actions.messageAdd(message)); + + const messagesUi = getAllMessagesUiById(getState()); + expect(messagesUi.size).toBe(0); + }); + }); + + describe("currentGroup", () => { + it("sets the currentGroup when console.group message is added", () => { + const { dispatch, getState } = setupStore([]); + + const packet = stubPackets.get("console.group('bar')"); + dispatch(actions.messageAdd(packet)); + + const messages = getAllMessages(getState()); + const currentGroup = getCurrentGroup(getState()); + expect(currentGroup).toBe(messages.first().id); + }); + + it("sets currentGroup to expected value when console.groupEnd is added", () => { + const { dispatch, getState } = setupStore([ + "console.group('bar')", + "console.groupCollapsed('foo')" + ]); + + let messages = getAllMessages(getState()); + let currentGroup = getCurrentGroup(getState()); + expect(currentGroup).toBe(messages.last().id); + + const endFooPacket = stubPackets.get("console.groupEnd('foo')"); + dispatch(actions.messageAdd(endFooPacket)); + messages = getAllMessages(getState()); + currentGroup = getCurrentGroup(getState()); + expect(currentGroup).toBe(messages.first().id); + + const endBarPacket = stubPackets.get("console.groupEnd('foo')"); + dispatch(actions.messageAdd(endBarPacket)); + messages = getAllMessages(getState()); + currentGroup = getCurrentGroup(getState()); + expect(currentGroup).toBe(null); + }); + + it("resets the currentGroup to null in response to MESSAGES_CLEAR action", () => { + const { dispatch, getState } = setupStore([ + "console.group('bar')" + ]); + + dispatch(actions.messagesClear()); + + const currentGroup = getCurrentGroup(getState()); + expect(currentGroup).toBe(null); + }); + }); + + describe("groupsById", () => { + it("adds the group with expected array when console.group message is added", () => { + const { dispatch, getState } = setupStore([]); + + const barPacket = stubPackets.get("console.group('bar')"); + dispatch(actions.messageAdd(barPacket)); + + let messages = getAllMessages(getState()); + let groupsById = getAllGroupsById(getState()); + expect(groupsById.size).toBe(1); + expect(groupsById.has(messages.first().id)).toBe(true); + expect(groupsById.get(messages.first().id)).toEqual([]); + + const fooPacket = stubPackets.get("console.groupCollapsed('foo')"); + dispatch(actions.messageAdd(fooPacket)); + messages = getAllMessages(getState()); + groupsById = getAllGroupsById(getState()); + expect(groupsById.size).toBe(2); + expect(groupsById.has(messages.last().id)).toBe(true); + expect(groupsById.get(messages.last().id)).toEqual([messages.first().id]); + }); + + it("resets groupsById in response to MESSAGES_CLEAR action", () => { + const { dispatch, getState } = setupStore([ + "console.group('bar')", + "console.groupCollapsed('foo')", + ]); + + let groupsById = getAllGroupsById(getState()); + expect(groupsById.size).toBe(2); + + dispatch(actions.messagesClear()); + + groupsById = getAllGroupsById(getState()); + expect(groupsById.size).toBe(0); + }); }); }); diff --git a/devtools/client/webconsole/new-console-output/types.js b/devtools/client/webconsole/new-console-output/types.js index 2b21aaf61868..ddf64e3c8b39 100644 --- a/devtools/client/webconsole/new-console-output/types.js +++ b/devtools/client/webconsole/new-console-output/types.js @@ -20,6 +20,7 @@ exports.ConsoleCommand = Immutable.Record({ source: MESSAGE_SOURCE.JAVASCRIPT, type: MESSAGE_TYPE.COMMAND, level: MESSAGE_LEVEL.LOG, + groupId: null, }); exports.ConsoleMessage = Immutable.Record({ @@ -34,6 +35,7 @@ exports.ConsoleMessage = Immutable.Record({ repeatId: null, stacktrace: null, frame: null, + groupId: null, }); exports.NetworkEventMessage = Immutable.Record({ @@ -45,4 +47,5 @@ exports.NetworkEventMessage = Immutable.Record({ response: null, source: MESSAGE_SOURCE.NETWORK, type: MESSAGE_TYPE.LOG, + groupId: null, }); diff --git a/devtools/client/webconsole/new-console-output/utils/messages.js b/devtools/client/webconsole/new-console-output/utils/messages.js index 93280a9c0035..8c06627ab89f 100644 --- a/devtools/client/webconsole/new-console-output/utils/messages.js +++ b/devtools/client/webconsole/new-console-output/utils/messages.js @@ -94,6 +94,20 @@ function transformPacket(packet) { type = "log"; } break; + case "group": + type = MESSAGE_TYPE.START_GROUP; + parameters = null; + messageText = message.groupName || l10n.getStr("noGroupLabel"); + break; + case "groupCollapsed": + type = MESSAGE_TYPE.START_GROUP_COLLAPSED; + parameters = null; + messageText = message.groupName || l10n.getStr("noGroupLabel"); + break; + case "groupEnd": + type = MESSAGE_TYPE.END_GROUP; + parameters = null; + break; } const frame = message.filename ? { @@ -244,8 +258,16 @@ function getLevelFromType(type) { return levelMap[type] || MESSAGE_TYPE.LOG; } +function isGroupType(type) { + return [ + MESSAGE_TYPE.START_GROUP, + MESSAGE_TYPE.START_GROUP_COLLAPSED + ].includes(type); +} + exports.prepareMessage = prepareMessage; // Export for use in testing. exports.getRepeatId = getRepeatId; exports.l10n = l10n; +exports.isGroupType = isGroupType; diff --git a/devtools/client/webconsole/test/browser_webconsole_bug_599725_response_headers.js b/devtools/client/webconsole/test/browser_webconsole_bug_599725_response_headers.js index a87446a8ad73..4849793cb518 100644 --- a/devtools/client/webconsole/test/browser_webconsole_bug_599725_response_headers.js +++ b/devtools/client/webconsole/test/browser_webconsole_bug_599725_response_headers.js @@ -9,8 +9,7 @@ const INIT_URI = "data:text/plain;charset=utf8,hello world"; const TEST_URI = "http://example.com/browser/devtools/client/webconsole/" + "test/test-bug-599725-response-headers.sjs"; -var loads = 0; -function performTest(request, console) { +function performTest(request, hud) { let deferred = promise.defer(); let headers = null; @@ -24,7 +23,7 @@ function performTest(request, console) { return null; } - console.webConsoleClient.getResponseHeaders(request.actor, + hud.ui.proxy.webConsoleClient.getResponseHeaders(request.actor, function (response) { headers = response.headers; ok(headers, "we have the response headers for reload"); @@ -38,30 +37,23 @@ function performTest(request, console) { executeSoon(deferred.resolve); }); - HUDService.lastFinishedRequest.callback = null; - return deferred.promise; } -function waitForRequest() { - let deferred = promise.defer(); - HUDService.lastFinishedRequest.callback = (req, console) => { - loads++; - ok(req, "page load was logged"); - if (loads != 2) { - return; - } - performTest(req, console).then(deferred.resolve); - }; - return deferred.promise; -} +let waitForRequest = Task.async(function*(hud) { + let request = yield waitForFinishedRequest(req=> { + return req.response.status === "304"; + }); + + yield performTest(request, hud); +}); add_task(function* () { let { browser } = yield loadTab(INIT_URI); - yield openConsole(); + let hud = yield openConsole(); - let gotLastRequest = waitForRequest(); + let gotLastRequest = waitForRequest(hud); let loaded = loadBrowser(browser); BrowserTestUtils.loadURI(browser, TEST_URI); diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp index f9ce415233c7..5ad7820ce9d6 100644 --- a/docshell/base/nsDocShell.cpp +++ b/docshell/base/nsDocShell.cpp @@ -9782,18 +9782,6 @@ nsDocShell::InternalLoad(nsIURI* aURI, isJavaScript = false; } - RefPtr scriptGlobal = mScriptGlobal; - - // First, notify any nsIContentPolicy listeners about the document load. - // Only abort the load if a content policy listener explicitly vetos it! - // Use nsPIDOMWindow since we _want_ to cross the chrome boundary if needed - nsCOMPtr requestingElement = - scriptGlobal->AsOuter()->GetFrameElementInternal(); - - - int16_t shouldLoad = nsIContentPolicy::ACCEPT; - uint32_t contentType; - bool isNewDocShell = false; bool isTargetTopLevelDocShell = false; nsCOMPtr targetDocShell; if (aWindowTarget && *aWindowTarget) { @@ -9804,14 +9792,15 @@ nsDocShell::InternalLoad(nsIURI* aURI, NS_ENSURE_SUCCESS(rv, rv); targetDocShell = do_QueryInterface(targetItem); - // If the targetDocShell doesn't exist, then this is a new docShell - // and we should consider this a TYPE_DOCUMENT load - isNewDocShell = !targetDocShell; - - // If the targetDocShell and the rootDocShell are the same, then the - // targetDocShell is the top level document and hence we should - // consider this TYPE_DOCUMENT if (targetDocShell) { + // If the targetDocShell and the rootDocShell are the same, then the + // targetDocShell is the top level document and hence we should + // consider this TYPE_DOCUMENT + // + // For example: + // 1. target="_top" + // 2. target="_parent", where this docshell is in the 2nd level of + // docshell tree. nsCOMPtr sameTypeRoot; targetDocShell->GetSameTypeRootTreeItem(getter_AddRefs(sameTypeRoot)); NS_ASSERTION(sameTypeRoot, @@ -9819,13 +9808,26 @@ nsDocShell::InternalLoad(nsIURI* aURI, nsCOMPtr rootShell = do_QueryInterface(sameTypeRoot); NS_ASSERTION(rootShell, "No root docshell from document shell root tree item."); - - if (targetDocShell == rootShell) { - isTargetTopLevelDocShell = true; - } + isTargetTopLevelDocShell = targetDocShell == rootShell; + } else { + // If the targetDocShell doesn't exist, then this is a new docShell + // and we should consider this a TYPE_DOCUMENT load + // + // For example, when target="_blank" + isTargetTopLevelDocShell = true; } } - if (IsFrame() && !isNewDocShell && !isTargetTopLevelDocShell) { + + // The contentType will be INTERNAL_(I)FRAME if: + // 1. This docshell is for iframe. + // 2. AND aWindowTarget is not a new window, nor a top-level window. + // + // This variable will be used when we call NS_CheckContentLoadPolicy, and + // later when we call DoURILoad. + uint32_t contentType; + if (IsFrame() && !isTargetTopLevelDocShell) { + nsCOMPtr requestingElement = + mScriptGlobal->AsOuter()->GetFrameElementInternal(); NS_ASSERTION(requestingElement, "A frame but no DOM element!?"); contentType = requestingElement->IsHTMLElement(nsGkAtoms::iframe) ? nsIContentPolicy::TYPE_INTERNAL_IFRAME : nsIContentPolicy::TYPE_INTERNAL_FRAME; @@ -9833,52 +9835,85 @@ nsDocShell::InternalLoad(nsIURI* aURI, contentType = nsIContentPolicy::TYPE_DOCUMENT; } - nsISupports* context = requestingElement; - if (!context) { - context = ToSupports(scriptGlobal); - } + // If there's no targetDocShell, that means we are about to create a new window, + // perform a content policy check before creating the window. + if (!targetDocShell) { + nsCOMPtr requestingElement; + nsISupports* requestingContext = nullptr; - // XXXbz would be nice to know the loading principal here... but we don't - nsCOMPtr loadingPrincipal = aTriggeringPrincipal; - if (!loadingPrincipal && aReferrer) { - rv = - CreatePrincipalFromReferrer(aReferrer, getter_AddRefs(loadingPrincipal)); - NS_ENSURE_SUCCESS(rv, rv); - } + if (contentType == nsIContentPolicy::TYPE_DOCUMENT) { + if (XRE_IsContentProcess()) { + // In e10s the child process doesn't have access to the element that + // contains the browsing context (because that element is in the chrome + // process). So we just pass mScriptGlobal. + requestingContext = ToSupports(mScriptGlobal); + } else { + // This is for loading non-e10s tabs and toplevel windows of various + // sorts. + // For the toplevel window cases, requestingElement will be null. + requestingElement = mScriptGlobal->AsOuter()->GetFrameElementInternal(); + requestingContext = requestingElement; + } + } else { + requestingElement = mScriptGlobal->AsOuter()->GetFrameElementInternal(); + requestingContext = requestingElement; - rv = NS_CheckContentLoadPolicy(contentType, - aURI, - loadingPrincipal, - context, - EmptyCString(), // mime guess - nullptr, // extra - &shouldLoad); +#ifdef DEBUG + // Get the docshell type for requestingElement. + nsCOMPtr requestingDoc = requestingElement->OwnerDoc(); + nsCOMPtr elementDocShell = requestingDoc->GetDocShell(); - if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) { - if (NS_SUCCEEDED(rv) && shouldLoad == nsIContentPolicy::REJECT_TYPE) { - return NS_ERROR_CONTENT_BLOCKED_SHOW_ALT; + // requestingElement docshell type = current docshell type. + MOZ_ASSERT(mItemType == elementDocShell->ItemType(), + "subframes should have the same docshell type as their parent"); +#endif } - return NS_ERROR_CONTENT_BLOCKED; - } + // XXXbz would be nice to know the loading principal here... but we don't + nsCOMPtr requestingPrincipal = aTriggeringPrincipal; + if (!requestingPrincipal && aReferrer) { + rv = + CreatePrincipalFromReferrer(aReferrer, getter_AddRefs(requestingPrincipal)); + NS_ENSURE_SUCCESS(rv, rv); + } - // If HSTS priming was set by nsMixedContentBlocker::ShouldLoad, and we - // would block due to mixed content, go ahead and block here. If we try to - // proceed with priming, we will error out later on. - nsCOMPtr docShell = NS_CP_GetDocShellFromContext(context); - NS_ENSURE_TRUE(docShell, NS_OK); - if (docShell) { - nsIDocument* document = docShell->GetDocument(); - NS_ENSURE_TRUE(document, NS_OK); + int16_t shouldLoad = nsIContentPolicy::ACCEPT; + rv = NS_CheckContentLoadPolicy(contentType, + aURI, + requestingPrincipal, + requestingContext, + EmptyCString(), // mime guess + nullptr, // extra + &shouldLoad); + + if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) { + if (NS_SUCCEEDED(rv) && shouldLoad == nsIContentPolicy::REJECT_TYPE) { + return NS_ERROR_CONTENT_BLOCKED_SHOW_ALT; + } - HSTSPrimingState state = document->GetHSTSPrimingStateForLocation(aURI); - if (state == HSTSPrimingState::eHSTS_PRIMING_BLOCK) { - // HSTS Priming currently disabled for InternalLoad, so we need to clear - // the location that was added by nsMixedContentBlocker::ShouldLoad - // Bug 1269815 will address images loaded via InternalLoad - document->ClearHSTSPrimingLocation(aURI); return NS_ERROR_CONTENT_BLOCKED; } + + // If HSTS priming was set by nsMixedContentBlocker::ShouldLoad, and we + // would block due to mixed content, go ahead and block here. If we try to + // proceed with priming, we will error out later on. + nsCOMPtr docShell = NS_CP_GetDocShellFromContext(requestingContext); + // When loading toplevel windows, requestingContext can be null. We don't + // really care about HSTS in that situation, though; loads in toplevel + // windows should all be browser UI. + if (docShell) { + nsIDocument* document = docShell->GetDocument(); + NS_ENSURE_TRUE(document, NS_OK); + + HSTSPrimingState state = document->GetHSTSPrimingStateForLocation(aURI); + if (state == HSTSPrimingState::eHSTS_PRIMING_BLOCK) { + // HSTS Priming currently disabled for InternalLoad, so we need to clear + // the location that was added by nsMixedContentBlocker::ShouldLoad + // Bug 1269815 will address images loaded via InternalLoad + document->ClearHSTSPrimingLocation(aURI); + return NS_ERROR_CONTENT_BLOCKED; + } + } } nsCOMPtr principalToInherit = aPrincipalToInherit; @@ -10364,6 +10399,7 @@ nsDocShell::InternalLoad(nsIURI* aURI, // applies to aURI. CopyFavicon(currentURI, aURI, doc->NodePrincipal(), UsePrivateBrowsing()); + RefPtr scriptGlobal = mScriptGlobal; RefPtr win = scriptGlobal ? scriptGlobal->GetCurrentInnerWindowInternal() : nullptr; diff --git a/dom/apps/Webapps.jsm b/dom/apps/Webapps.jsm index 0ab4e96cca7c..70c2518d1e2a 100644 --- a/dom/apps/Webapps.jsm +++ b/dom/apps/Webapps.jsm @@ -663,7 +663,7 @@ this.DOMApplicationRegistry = { if (id in data || this.webapps[id].removable) continue; // Remove the permissions, cookies and private data for this app. - // Both permission and cookie managers observe the "clear-origin-data" + // Both permission and cookie managers observe the "clear-origin-attributes-data" // event. let localId = this.webapps[id].localId; this._clearPrivateData(localId, false); @@ -4692,7 +4692,7 @@ this.DOMApplicationRegistry = { if (browserOnly) { attributes.inIsolatedMozBrowser = true; } - this._notifyCategoryAndObservers(null, "clear-origin-data", JSON.stringify(attributes)); + this._notifyCategoryAndObservers(null, "clear-origin-attributes-data", JSON.stringify(attributes)); } }; diff --git a/dom/apps/tests/test_bug_1168300.html b/dom/apps/tests/test_bug_1168300.html index 02ffe846310b..53b3c6f513ef 100644 --- a/dom/apps/tests/test_bug_1168300.html +++ b/dom/apps/tests/test_bug_1168300.html @@ -52,7 +52,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1168300 yield undefined; let app = request.result; - let _topic = "clear-origin-data"; + let _topic = "clear-origin-attributes-data"; let observer = new Observer(_topic); observer.onobserve = function(subject, topic, data, count) { ok(topic == _topic, "unknown topic " + topic); @@ -76,7 +76,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1168300 continueTest(); }; - // we now wait for "clear-origin-data" notifications and onuninstall + // we now wait for "clear-origin-attributes-data" notifications and onuninstall // callback. yield undefined; yield undefined; diff --git a/dom/base/CustomElementsRegistry.cpp b/dom/base/CustomElementsRegistry.cpp index b4d97e78e2a4..8cd14fef0151 100644 --- a/dom/base/CustomElementsRegistry.cpp +++ b/dom/base/CustomElementsRegistry.cpp @@ -103,6 +103,7 @@ NS_IMPL_CYCLE_COLLECTION_CLASS(CustomElementsRegistry) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(CustomElementsRegistry) tmp->mCustomDefinitions.Clear(); + NS_IMPL_CYCLE_COLLECTION_UNLINK(mWhenDefinedPromiseMap) NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END @@ -135,6 +136,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(CustomElementsRegistry) cb.NoteXPCOMChild(callbacks->mDetachedCallback.Value()); } } + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWhenDefinedPromiseMap) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END @@ -788,7 +790,12 @@ CustomElementsRegistry::Define(const nsAString& aName, * 3. Delete the entry with key name from this CustomElementsRegistry's * when-defined promise map. */ - // TODO: Bug 1275839 - Implement CustomElementsRegistry whenDefined function + RefPtr promise; + mWhenDefinedPromiseMap.Remove(nameAtom, getter_AddRefs(promise)); + if (promise) { + promise->MaybeResolveWithUndefined(); + } + } void @@ -808,11 +815,33 @@ CustomElementsRegistry::Get(JSContext* aCx, const nsAString& aName, } already_AddRefed -CustomElementsRegistry::WhenDefined(const nsAString& name, ErrorResult& aRv) +CustomElementsRegistry::WhenDefined(const nsAString& aName, ErrorResult& aRv) { - // TODO: This function will be implemented in bug 1275839 - aRv.Throw(NS_ERROR_NOT_IMPLEMENTED); - return nullptr; + nsCOMPtr global = do_QueryInterface(mWindow); + RefPtr promise = Promise::Create(global, aRv); + + if (aRv.Failed()) { + return nullptr; + } + + nsCOMPtr nameAtom(NS_Atomize(aName)); + if (!nsContentUtils::IsCustomElementName(nameAtom)) { + promise->MaybeReject(NS_ERROR_DOM_SYNTAX_ERR); + return promise.forget(); + } + + if (mCustomDefinitions.Get(nameAtom)) { + promise->MaybeResolve(JS::UndefinedHandleValue); + return promise.forget(); + } + + if (mWhenDefinedPromiseMap.Contains(nameAtom)) { + mWhenDefinedPromiseMap.Get(nameAtom, getter_AddRefs(promise)); + } else { + mWhenDefinedPromiseMap.Put(nameAtom, promise); + } + + return promise.forget(); } CustomElementDefinition::CustomElementDefinition(nsIAtom* aType, diff --git a/dom/base/CustomElementsRegistry.h b/dom/base/CustomElementsRegistry.h index 5bfb344d9666..3c7a792af163 100644 --- a/dom/base/CustomElementsRegistry.h +++ b/dom/base/CustomElementsRegistry.h @@ -197,6 +197,9 @@ private: // registerElement was called. DefinitionMap mCustomDefinitions; + typedef nsRefPtrHashtable + WhenDefinedPromiseMap; + WhenDefinedPromiseMap mWhenDefinedPromiseMap; // The "upgrade candidates map" from the web components spec. Maps from a // namespace id and local name to a list of elements to upgrade if that // element is registered as a custom element. @@ -245,7 +248,7 @@ public: void Get(JSContext* cx, const nsAString& name, JS::MutableHandle aRetVal); - already_AddRefed WhenDefined(const nsAString& name, ErrorResult& aRv); + already_AddRefed WhenDefined(const nsAString& aName, ErrorResult& aRv); }; } // namespace dom diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index 1ccc05d606e2..4be903be5e20 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -2340,7 +2340,7 @@ nsDOMWindowUtils::GetSupportsHardwareH264Decoding(JS::MutableHandle a LayerManager *mgr = widget->GetLayerManager(); NS_ENSURE_STATE(mgr); RefPtr promise = - MP4Decoder::IsVideoAccelerated(mgr->GetCompositorBackendType(), parentObject); + MP4Decoder::IsVideoAccelerated(mgr->AsShadowForwarder(), parentObject); NS_ENSURE_STATE(promise); aPromise.setObject(*promise->PromiseObj()); #else diff --git a/dom/base/nsFrameLoader.cpp b/dom/base/nsFrameLoader.cpp index 625720533a26..1f88af430901 100644 --- a/dom/base/nsFrameLoader.cpp +++ b/dom/base/nsFrameLoader.cpp @@ -2111,10 +2111,7 @@ nsFrameLoader::MaybeCreateDocShell() PrincipalOriginAttributes poa = BasePrincipal::Cast(doc->NodePrincipal())->OriginAttributesRef(); // Assert on the firstPartyDomain from top-level docshell should be empty - if (mIsTopLevelContent) { - MOZ_ASSERT(attrs.mFirstPartyDomain.IsEmpty(), - "top-level docshell shouldn't have firstPartyDomain attribute."); - } + MOZ_ASSERT_IF(mIsTopLevelContent, attrs.mFirstPartyDomain.IsEmpty()); // So far we want to make sure InheritFromDocToChildDocShell doesn't override // any other origin attribute than firstPartyDomain. diff --git a/dom/base/nsGkAtomList.h b/dom/base/nsGkAtomList.h index 9b46a95a9b9c..040fcc2b57db 100644 --- a/dom/base/nsGkAtomList.h +++ b/dom/base/nsGkAtomList.h @@ -830,6 +830,7 @@ GK_ATOM(onmessage, "onmessage") GK_ATOM(onmousedown, "onmousedown") GK_ATOM(onmouseenter, "onmouseenter") GK_ATOM(onmouseleave, "onmouseleave") +GK_ATOM(onmouselongtap, "onmouselongtap") GK_ATOM(onmousemove, "onmousemove") GK_ATOM(onmouseout, "onmouseout") GK_ATOM(onmouseover, "onmouseover") diff --git a/dom/base/test/mochitest.ini b/dom/base/test/mochitest.ini index 90a172fa0a81..4004ff39e912 100644 --- a/dom/base/test/mochitest.ini +++ b/dom/base/test/mochitest.ini @@ -630,6 +630,7 @@ skip-if = buildapp == 'b2g' [test_bug1274806.html] [test_bug1281963.html] [test_bug1295852.html] +[test_bug1307730.html] [test_caretPositionFromPoint.html] [test_change_policy.html] skip-if = buildapp == 'b2g' #no ssl support diff --git a/dom/base/test/test_bug1307730.html b/dom/base/test/test_bug1307730.html new file mode 100644 index 000000000000..54ba8ac99910 --- /dev/null +++ b/dom/base/test/test_bug1307730.html @@ -0,0 +1,44 @@ + + + + + Test for Bug 1307730 + + + + +
Mozilla Bug 1307730 +

+ +
+
+
+ + diff --git a/dom/canvas/test/reftest/filters/reftest.list b/dom/canvas/test/reftest/filters/reftest.list index 1d67023c19eb..9830307159da 100644 --- a/dom/canvas/test/reftest/filters/reftest.list +++ b/dom/canvas/test/reftest/filters/reftest.list @@ -19,7 +19,7 @@ fuzzy-if(azureSkia,1,1500) == global-alpha.html global-alpha-ref.html == units-ex.html ref.html == units-off-screen.html ref.html fuzzy(1,700) == fillText-with-filter-opacity-1.html fillText-with-filter-opacity-1-ref.html -fuzzy(1,300) == fillText-with-filter-opacity-2.html fillText-with-filter-opacity-2-ref.html +fuzzy(1,302) == fillText-with-filter-opacity-2.html fillText-with-filter-opacity-2-ref.html fuzzy(1,400) == strokeText-with-filter-grayscale-1.html strokeText-with-filter-grayscale-1-ref.html fuzzy(1,400) == strokeText-with-filter-grayscale-2.html strokeText-with-filter-grayscale-2-ref.html != fillText-with-shadow-1.html fillText-without-shadow-1-ref.html diff --git a/dom/events/EventNameList.h b/dom/events/EventNameList.h index 3126c4ffff26..2fd6d2608847 100644 --- a/dom/events/EventNameList.h +++ b/dom/events/EventNameList.h @@ -172,6 +172,10 @@ EVENT(contextmenu, eContextMenu, EventNameType_HTMLXUL, eMouseEventClass) +NON_IDL_EVENT(mouselongtap, + eMouseLongTap, + EventNameType_HTMLXUL, + eMouseEventClass) // Not supported yet // EVENT(cuechange) EVENT(dblclick, diff --git a/dom/events/test/pointerevents/mochitest.ini b/dom/events/test/pointerevents/mochitest.ini index 2cbb8a66b423..7b4e858a65bf 100644 --- a/dom/events/test/pointerevents/mochitest.ini +++ b/dom/events/test/pointerevents/mochitest.ini @@ -124,8 +124,6 @@ support-files = support-files = pointerevent_suppress_compat_events_on_drag_mouse.html disabled = should be investigated [test_touch_action.html] - # Windows touch injection doesn't work in automation, but this test can be run locally on a windows touch device. - skip-if = (toolkit == 'windows') support-files = ../../../../gfx/layers/apz/test/mochitest/apz_test_utils.js ../../../../gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js diff --git a/dom/interfaces/apps/mozIApplicationClearPrivateDataParams.idl b/dom/interfaces/apps/mozIApplicationClearPrivateDataParams.idl index f48a2cbc8872..c08deac103b1 100644 --- a/dom/interfaces/apps/mozIApplicationClearPrivateDataParams.idl +++ b/dom/interfaces/apps/mozIApplicationClearPrivateDataParams.idl @@ -16,5 +16,5 @@ interface mozIApplicationClearPrivateDataParams : nsISupports %{C++ #define TOPIC_WEB_APP_CLEAR_DATA "webapps-clear-data" -#define TOPIC_CLEAR_ORIGIN_DATA "clear-origin-data" +#define TOPIC_CLEAR_ORIGIN_DATA "clear-origin-attributes-data" %} diff --git a/dom/locales/en-US/chrome/dom/dom.properties b/dom/locales/en-US/chrome/dom/dom.properties index dd85fb76cb45..89ea3c0c8bae 100644 --- a/dom/locales/en-US/chrome/dom/dom.properties +++ b/dom/locales/en-US/chrome/dom/dom.properties @@ -250,47 +250,47 @@ RewriteYouTubeEmbedPathParams=Rewriting old-style YouTube Flash embed (%S) to if # LOCALIZATION NOTE: This error is reported when the "Encryption" header for an # incoming push message is missing or invalid. Do not translate "ServiceWorker", # "Encryption", and "salt". %1$S is the ServiceWorker scope URL. -PushMessageBadEncryptionHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Encryption’ header must include a unique ‘salt‘ parameter for each message. +PushMessageBadEncryptionHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Encryption’ header must include a unique ‘salt‘ parameter for each message. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-3.1 for more information. # LOCALIZATION NOTE: This error is reported when the "Crypto-Key" header for an # incoming push message is missing or invalid. Do not translate "ServiceWorker", # "Crypto-Key", and "dh". %1$S is the ServiceWorker scope URL. -PushMessageBadCryptoKeyHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Crypto-Key‘ header must include a ‘dh‘ parameter containing the app server’s public key. +PushMessageBadCryptoKeyHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Crypto-Key‘ header must include a ‘dh‘ parameter containing the app server’s public key. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-4 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt because the deprecated # "Encryption-Key" header for an incoming push message is missing or invalid. # Do not translate "ServiceWorker", "Encryption-Key", "dh", "Crypto-Key", and # "Content-Encoding: aesgcm". %1$S is the ServiceWorker scope URL. -PushMessageBadEncryptionKeyHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Encryption-Key’ header must include a ‘dh‘ parameter. This header is deprecated and will soon be removed. Please use ‘Crypto-Key‘ with ‘Content-Encoding: aesgcm‘ instead. +PushMessageBadEncryptionKeyHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Encryption-Key’ header must include a ‘dh‘ parameter. This header is deprecated and will soon be removed. Please use ‘Crypto-Key‘ with ‘Content-Encoding: aesgcm‘ instead. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-4 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt # because the "Content-Encoding" header is missing or contains an # unsupported encoding. Do not translate "ServiceWorker", "Content-Encoding", # "aesgcm", and "aesgcm128". %1$S is the ServiceWorker scope URL. -PushMessageBadEncodingHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Content-Encoding‘ header must be ‘aesgcm‘. ‘aesgcm128‘ is allowed, but deprecated and will soon be removed. +PushMessageBadEncodingHeader=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘Content-Encoding‘ header must be ‘aesgcm‘. ‘aesgcm128‘ is allowed, but deprecated and will soon be removed. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-2 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt # because the "dh" parameter is not valid base64url. Do not translate # "ServiceWorker", "dh", "Crypto-Key", and "base64url". %1$S is the # ServiceWorker scope URL. -PushMessageBadSenderKey=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘dh‘ parameter in the ‘Crypto-Key‘ header must be the app server’s Diffie-Hellman public key, base64url-encoded (RFC 7515, Appendix C) and in “uncompressed” or “raw” form (65 bytes before encoding). +PushMessageBadSenderKey=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘dh‘ parameter in the ‘Crypto-Key‘ header must be the app server’s Diffie-Hellman public key, base64url-encoded (https://tools.ietf.org/html/rfc7515#appendix-C) and in “uncompressed” or “raw” form (65 bytes before encoding). See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-4 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt # because the "salt" parameter is not valid base64url. Do not translate # "ServiceWorker", "salt", "Encryption", and "base64url". %1$S is the # ServiceWorker scope URL. -PushMessageBadSalt=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘salt‘ parameter in the ‘Encryption‘ header must be base64url-encoded (RFC 7515, Appendix C), and be at least 16 bytes before encoding. +PushMessageBadSalt=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘salt‘ parameter in the ‘Encryption‘ header must be base64url-encoded (https://tools.ietf.org/html/rfc7515#appendix-C), and be at least 16 bytes before encoding. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-3.1 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt # because the "rs" parameter is not a number, or is less than the pad size. # Do not translate "ServiceWorker", "rs", or "Encryption". %1$S is the # ServiceWorker scope URL. %2$S is the minimum value (1 for aesgcm128, 2 for # aesgcm). -PushMessageBadRecordSize=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘rs‘ parameter of the ‘Encryption‘ header must be between %2$S and 2^36-31, or omitted entirely. +PushMessageBadRecordSize=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. The ‘rs‘ parameter of the ‘Encryption‘ header must be between %2$S and 2^36-31, or omitted entirely. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-3.1 for more information. # LOCALIZATION NOTE: This error is reported when a push message fails to decrypt # because an encrypted record is shorter than the pad size, the pad is larger # than the record, or any of the padding bytes are non-zero. Do not translate # "ServiceWorker". %1$S is the ServiceWorker scope URL. %2$S is the pad size # (1 for aesgcm128, 2 for aesgcm). -PushMessageBadPaddingError=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. Each record in the encrypted message must be padded with a %2$S byte big-endian unsigned integer, followed by that number of zero-valued bytes. +PushMessageBadPaddingError=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. A record in the encrypted message was not padded correctly. See https://tools.ietf.org/html/draft-ietf-httpbis-encryption-encoding-02#section-2 for more information. # LOCALIZATION NOTE: This error is reported when push message decryption fails # and no specific error info is available. Do not translate "ServiceWorker". # %1$S is the ServiceWorker scope URL. -PushMessageBadCryptoError=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. For help with encryption, please see https://developer.mozilla.org/en-US/docs/Web/API/Push_API/Using_the_Push_API#Encryption +PushMessageBadCryptoError=The ServiceWorker for scope ‘%1$S’ failed to decrypt a push message. For help with encryption, please see https://developer.mozilla.org/docs/Web/API/Push_API/Using_the_Push_API#Encryption # LOCALIZATION NOTE: %1$S is the type of a DOM event. 'passive' is a literal parameter from the DOM spec. PreventDefaultFromPassiveListenerWarning=Ignoring ‘preventDefault()’ call on event of type ‘%1$S’ from a listener registered as ‘passive’. FileLastModifiedDateWarning=File.lastModifiedDate is deprecated. Use File.lastModified instead. diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index 62b671c76fac..d48983992473 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -19,6 +19,7 @@ #include "mozilla/SharedThreadPool.h" #include "VideoUtils.h" #include "VideoFrameContainer.h" +#include "mozilla/layers/ShadowLayers.h" #include @@ -56,8 +57,7 @@ TrackTypeToStr(TrackInfo::TrackType aTrack) MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder, MediaDataDemuxer* aDemuxer, - VideoFrameContainer* aVideoFrameContainer, - layers::LayersBackend aLayersBackend) + VideoFrameContainer* aVideoFrameContainer) : MediaDecoderReader(aDecoder) , mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-max-decode-error", 3)) @@ -67,7 +67,6 @@ MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder, , mDemuxerInitDone(false) , mLastReportedNumDecodedFrames(0) , mPreviousDecodedKeyframeTime_us(sNoPreviousDecodedKeyframe) - , mLayersBackendType(aLayersBackend) , mInitDone(false) , mTrackDemuxersMayBlock(false) , mDemuxOnly(false) @@ -160,7 +159,7 @@ MediaFormatReader::InitLayersBackendType() nsContentUtils::LayerManagerForDocument(element->OwnerDoc()); NS_ENSURE_TRUE_VOID(layerManager); - mLayersBackendType = layerManager->GetCompositorBackendType(); + mKnowsCompositor = layerManager->AsShadowForwarder(); } nsresult @@ -421,7 +420,7 @@ MediaFormatReader::EnsureDecoderCreated(TrackType aTrack) mVideo.mInfo ? *mVideo.mInfo->GetAsVideoInfo() : mInfo.mVideo, decoder.mTaskQueue, decoder.mCallback.get(), - mLayersBackendType, + mKnowsCompositor, GetImageContainer(), mCrashHelper, decoder.mIsBlankDecode, diff --git a/dom/media/MediaFormatReader.h b/dom/media/MediaFormatReader.h index cfa113155730..e42b8bc11528 100644 --- a/dom/media/MediaFormatReader.h +++ b/dom/media/MediaFormatReader.h @@ -28,8 +28,7 @@ class MediaFormatReader final : public MediaDecoderReader public: MediaFormatReader(AbstractMediaDecoder* aDecoder, MediaDataDemuxer* aDemuxer, - VideoFrameContainer* aVideoFrameContainer = nullptr, - layers::LayersBackend aLayersBackend = layers::LayersBackend::LAYERS_NONE); + VideoFrameContainer* aVideoFrameContainer = nullptr); virtual ~MediaFormatReader(); @@ -522,7 +521,7 @@ private: // Default mLastDecodedKeyframeTime_us value, must be bigger than anything. static const int64_t sNoPreviousDecodedKeyframe = INT64_MAX; - layers::LayersBackend mLayersBackendType; + RefPtr mKnowsCompositor; // Metadata objects // True if we've read the streams' metadata. diff --git a/dom/media/fmp4/MP4Decoder.cpp b/dom/media/fmp4/MP4Decoder.cpp index d609d5cc3a1d..4e54f96e6329 100644 --- a/dom/media/fmp4/MP4Decoder.cpp +++ b/dom/media/fmp4/MP4Decoder.cpp @@ -215,7 +215,7 @@ static const uint8_t sTestH264ExtraData[] = { }; static already_AddRefed -CreateTestH264Decoder(layers::LayersBackend aBackend, +CreateTestH264Decoder(layers::KnowsCompositor* aKnowsCompositor, VideoInfo& aConfig, TaskQueue* aTaskQueue) { @@ -229,13 +229,13 @@ CreateTestH264Decoder(layers::LayersBackend aBackend, MOZ_ARRAY_LENGTH(sTestH264ExtraData)); RefPtr platform = new PDMFactory(); - RefPtr decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aBackend })); + RefPtr decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aKnowsCompositor })); return decoder.forget(); } /* static */ already_AddRefed -MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent) +MP4Decoder::IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent) { MOZ_ASSERT(NS_IsMainThread()); @@ -250,7 +250,7 @@ MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* RefPtr taskQueue = new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER)); VideoInfo config; - RefPtr decoder(CreateTestH264Decoder(aBackend, config, taskQueue)); + RefPtr decoder(CreateTestH264Decoder(aKnowsCompositor, config, taskQueue)); if (!decoder) { taskQueue->BeginShutdown(); taskQueue->AwaitShutdownAndIdle(); diff --git a/dom/media/fmp4/MP4Decoder.h b/dom/media/fmp4/MP4Decoder.h index e421bf566855..7ce3a41c6719 100644 --- a/dom/media/fmp4/MP4Decoder.h +++ b/dom/media/fmp4/MP4Decoder.h @@ -9,6 +9,7 @@ #include "MediaDecoder.h" #include "MediaFormatReader.h" #include "mozilla/dom/Promise.h" +#include "mozilla/layers/KnowsCompositor.h" namespace mozilla { @@ -47,7 +48,7 @@ public: static bool IsEnabled(); static already_AddRefed - IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent); + IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent); void GetMozDebugReaderData(nsAString& aString) override; diff --git a/dom/media/ipc/PVideoDecoder.ipdl b/dom/media/ipc/PVideoDecoder.ipdl index d4b35e2c757e..cc2b803b2fe8 100644 --- a/dom/media/ipc/PVideoDecoder.ipdl +++ b/dom/media/ipc/PVideoDecoder.ipdl @@ -9,6 +9,7 @@ include protocol PVideoDecoderManager; include LayersSurfaces; using VideoInfo from "MediaInfo.h"; using mozilla::layers::LayersBackend from "mozilla/layers/LayersTypes.h"; +using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h"; namespace mozilla { namespace dom { @@ -46,7 +47,7 @@ async protocol PVideoDecoder { manager PVideoDecoderManager; parent: - async Init(VideoInfo info, LayersBackend backend); + async Init(VideoInfo info, TextureFactoryIdentifier identifier); async Input(MediaRawDataIPDL data); diff --git a/dom/media/ipc/RemoteVideoDecoder.cpp b/dom/media/ipc/RemoteVideoDecoder.cpp index 7f9e76d918be..7317a1800707 100644 --- a/dom/media/ipc/RemoteVideoDecoder.cpp +++ b/dom/media/ipc/RemoteVideoDecoder.cpp @@ -147,15 +147,19 @@ RemoteDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const already_AddRefed RemoteDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams) { + if (!aParams.mKnowsCompositor) { + return nullptr; + } + MediaDataDecoderCallback* callback = aParams.mCallback; MOZ_ASSERT(callback->OnReaderTaskQueue()); RefPtr object = new RemoteVideoDecoder(callback); VideoInfo info = aParams.VideoConfig(); - layers::LayersBackend backend = aParams.mLayersBackend; - VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([object, callback, info, backend]() { - object->mActor->InitIPDL(callback, info, backend); + RefPtr knowsCompositor = aParams.mKnowsCompositor; + VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([=]() { + object->mActor->InitIPDL(callback, info, knowsCompositor); }), NS_DISPATCH_NORMAL); return object.forget(); diff --git a/dom/media/ipc/VideoDecoderChild.cpp b/dom/media/ipc/VideoDecoderChild.cpp index 90e138af12b7..f8a90650c514 100644 --- a/dom/media/ipc/VideoDecoderChild.cpp +++ b/dom/media/ipc/VideoDecoderChild.cpp @@ -21,7 +21,6 @@ using namespace gfx; VideoDecoderChild::VideoDecoderChild() : mThread(VideoDecoderManagerChild::GetManagerThread()) - , mLayersBackend(layers::LayersBackend::LAYERS_NONE) , mCanSend(true) , mInitialized(false) , mIsHardwareAccelerated(false) @@ -116,13 +115,13 @@ VideoDecoderChild::ActorDestroy(ActorDestroyReason aWhy) void VideoDecoderChild::InitIPDL(MediaDataDecoderCallback* aCallback, const VideoInfo& aVideoInfo, - layers::LayersBackend aLayersBackend) + layers::KnowsCompositor* aKnowsCompositor) { VideoDecoderManagerChild::GetSingleton()->SendPVideoDecoderConstructor(this); mIPDLSelfRef = this; mCallback = aCallback; mVideoInfo = aVideoInfo; - mLayersBackend = aLayersBackend; + mKnowsCompositor = aKnowsCompositor; } void @@ -145,7 +144,7 @@ RefPtr VideoDecoderChild::Init() { AssertOnManagerThread(); - if (!mCanSend || !SendInit(mVideoInfo, mLayersBackend)) { + if (!mCanSend || !SendInit(mVideoInfo, mKnowsCompositor->GetTextureFactoryIdentifier())) { return MediaDataDecoder::InitPromise::CreateAndReject( NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__); } diff --git a/dom/media/ipc/VideoDecoderChild.h b/dom/media/ipc/VideoDecoderChild.h index eaa5edd325e0..ee04802d538c 100644 --- a/dom/media/ipc/VideoDecoderChild.h +++ b/dom/media/ipc/VideoDecoderChild.h @@ -45,7 +45,7 @@ public: MOZ_IS_CLASS_INIT void InitIPDL(MediaDataDecoderCallback* aCallback, const VideoInfo& aVideoInfo, - layers::LayersBackend aLayersBackend); + layers::KnowsCompositor* aKnowsCompositor); void DestroyIPDL(); // Called from IPDL when our actor has been destroyed @@ -64,7 +64,7 @@ private: MozPromiseHolder mInitPromise; VideoInfo mVideoInfo; - layers::LayersBackend mLayersBackend; + RefPtr mKnowsCompositor; nsCString mHardwareAcceleratedReason; bool mCanSend; bool mInitialized; diff --git a/dom/media/ipc/VideoDecoderManagerParent.cpp b/dom/media/ipc/VideoDecoderManagerParent.cpp index 4646e57890d6..c0546bcb2363 100644 --- a/dom/media/ipc/VideoDecoderManagerParent.cpp +++ b/dom/media/ipc/VideoDecoderManagerParent.cpp @@ -15,6 +15,7 @@ #include "nsThreadUtils.h" #include "ImageContainer.h" #include "mozilla/layers/VideoBridgeChild.h" +#include "mozilla/SharedThreadPool.h" #if XP_WIN #include @@ -36,7 +37,6 @@ VideoDecoderManagerParent::StoreImage(TextureClient* aTexture) } StaticRefPtr sVideoDecoderManagerThread; -StaticRefPtr sVideoDecoderTaskThread; StaticRefPtr sManagerTaskQueue; class ManagerThreadShutdownObserver : public nsIObserver @@ -90,22 +90,6 @@ VideoDecoderManagerParent::StartupThreads() sManagerTaskQueue = new TaskQueue(managerThread.forget()); - RefPtr taskThread; - rv = NS_NewNamedThread("VideoTaskQueue", getter_AddRefs(taskThread)); - if (NS_FAILED(rv)) { - sVideoDecoderManagerThread->Shutdown(); - sVideoDecoderManagerThread = nullptr; - return; - } - sVideoDecoderTaskThread = taskThread; - -#ifdef XP_WIN - sVideoDecoderTaskThread->Dispatch(NS_NewRunnableFunction([]() { - HRESULT hr = CoInitializeEx(0, COINIT_MULTITHREADED); - MOZ_ASSERT(hr == S_OK); - }), NS_DISPATCH_NORMAL); -#endif - ManagerThreadShutdownObserver* obs = new ManagerThreadShutdownObserver(); observerService->AddObserver(obs, NS_XPCOM_SHUTDOWN_OBSERVER_ID, false); } @@ -115,8 +99,6 @@ VideoDecoderManagerParent::ShutdownThreads() { sManagerTaskQueue->BeginShutdown(); sManagerTaskQueue->AwaitShutdownAndIdle(); - sVideoDecoderTaskThread->Shutdown(); - sVideoDecoderTaskThread = nullptr; sVideoDecoderManagerThread->Dispatch(NS_NewRunnableFunction([]() { layers::VideoBridgeChild::Shutdown(); @@ -163,8 +145,7 @@ VideoDecoderManagerParent::~VideoDecoderManagerParent() PVideoDecoderParent* VideoDecoderManagerParent::AllocPVideoDecoderParent() { - RefPtr target = sVideoDecoderTaskThread;; - return new VideoDecoderParent(this, sManagerTaskQueue, new TaskQueue(target.forget())); + return new VideoDecoderParent(this, sManagerTaskQueue, new TaskQueue(SharedThreadPool::Get(NS_LITERAL_CSTRING("VideoDecoderParent"), 4))); } bool diff --git a/dom/media/ipc/VideoDecoderParent.cpp b/dom/media/ipc/VideoDecoderParent.cpp index 333f016fd34f..14f7d1f36f4f 100644 --- a/dom/media/ipc/VideoDecoderParent.cpp +++ b/dom/media/ipc/VideoDecoderParent.cpp @@ -9,6 +9,7 @@ #include "base/thread.h" #include "mozilla/layers/TextureClient.h" #include "mozilla/layers/VideoBridgeChild.h" +#include "mozilla/layers/ImageClient.h" #include "MediaInfo.h" #include "VideoDecoderManagerParent.h" #ifdef XP_WIN @@ -23,12 +24,30 @@ using namespace ipc; using namespace layers; using namespace gfx; +class KnowsCompositorVideo : public layers::KnowsCompositor +{ +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override) + + layers::TextureForwarder* GetTextureForwarder() override + { + return VideoBridgeChild::GetSingleton(); + } + layers::LayersIPCActor* GetLayersIPCActor() override + { + return VideoBridgeChild::GetSingleton(); + } +private: + virtual ~KnowsCompositorVideo() {} +}; + VideoDecoderParent::VideoDecoderParent(VideoDecoderManagerParent* aParent, TaskQueue* aManagerTaskQueue, TaskQueue* aDecodeTaskQueue) : mParent(aParent) , mManagerTaskQueue(aManagerTaskQueue) , mDecodeTaskQueue(aDecodeTaskQueue) + , mKnowsCompositor(new KnowsCompositorVideo) , mDestroyed(false) { MOZ_COUNT_CTOR(VideoDecoderParent); @@ -53,12 +72,14 @@ VideoDecoderParent::Destroy() } bool -VideoDecoderParent::RecvInit(const VideoInfo& aInfo, const layers::LayersBackend& aBackend) +VideoDecoderParent::RecvInit(const VideoInfo& aInfo, const layers::TextureFactoryIdentifier& aIdentifier) { + mKnowsCompositor->IdentifyTextureHost(aIdentifier); + CreateDecoderParams params(aInfo); params.mTaskQueue = mDecodeTaskQueue; params.mCallback = this; - params.mLayersBackend = aBackend; + params.mKnowsCompositor = mKnowsCompositor; params.mImageContainer = new layers::ImageContainer(); #ifdef XP_WIN @@ -163,8 +184,9 @@ VideoDecoderParent::Output(MediaData* aData) { MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn()); RefPtr self = this; + RefPtr knowsCompositor = mKnowsCompositor; RefPtr data = aData; - mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, data]() { + mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, knowsCompositor, data]() { if (self->mDestroyed) { return; } @@ -174,10 +196,14 @@ VideoDecoderParent::Output(MediaData* aData) MOZ_ASSERT(video->mImage, "Decoded video must output a layer::Image to be used with VideoDecoderParent"); - RefPtr texture = video->mImage->GetTextureClient(VideoBridgeChild::GetSingleton()); + RefPtr texture = video->mImage->GetTextureClient(knowsCompositor); + + if (!texture) { + texture = ImageClient::CreateTextureClientForImage(video->mImage, knowsCompositor); + } if (texture && !texture->IsAddedToCompositableClient()) { - texture->InitIPDLActor(VideoBridgeChild::GetSingleton()); + texture->InitIPDLActor(knowsCompositor); texture->SetAddedToCompositableClient(); } diff --git a/dom/media/ipc/VideoDecoderParent.h b/dom/media/ipc/VideoDecoderParent.h index 762542449fe8..ea99d0a100d4 100644 --- a/dom/media/ipc/VideoDecoderParent.h +++ b/dom/media/ipc/VideoDecoderParent.h @@ -8,6 +8,7 @@ #include "mozilla/RefPtr.h" #include "mozilla/dom/PVideoDecoderParent.h" +#include "mozilla/layers/TextureForwarder.h" #include "VideoDecoderManagerParent.h" #include "MediaData.h" #include "ImageContainer.h" @@ -15,6 +16,8 @@ namespace mozilla { namespace dom { +class KnowsCompositorVideo; + class VideoDecoderParent final : public PVideoDecoderParent, public MediaDataDecoderCallback { @@ -30,7 +33,7 @@ public: void Destroy(); // PVideoDecoderParent - bool RecvInit(const VideoInfo& aVideoInfo, const layers::LayersBackend& aBackend) override; + bool RecvInit(const VideoInfo& aVideoInfo, const layers::TextureFactoryIdentifier& aIdentifier) override; bool RecvInput(const MediaRawDataIPDL& aData) override; bool RecvFlush() override; bool RecvDrain() override; @@ -54,6 +57,7 @@ private: RefPtr mManagerTaskQueue; RefPtr mDecodeTaskQueue; RefPtr mDecoder; + RefPtr mKnowsCompositor; // Can only be accessed from the manager thread bool mDestroyed; diff --git a/dom/media/platforms/PlatformDecoderModule.h b/dom/media/platforms/PlatformDecoderModule.h index a3f48b62c883..b1b5aefa9d7f 100644 --- a/dom/media/platforms/PlatformDecoderModule.h +++ b/dom/media/platforms/PlatformDecoderModule.h @@ -10,6 +10,7 @@ #include "MediaDecoderReader.h" #include "mozilla/MozPromise.h" #include "mozilla/layers/LayersTypes.h" +#include "mozilla/layers/KnowsCompositor.h" #include "nsTArray.h" #include "mozilla/RefPtr.h" #include "GMPService.h" @@ -58,13 +59,21 @@ struct MOZ_STACK_CLASS CreateDecoderParams final { return *mConfig.GetAsAudioInfo(); } + layers::LayersBackend GetLayersBackend() const + { + if (mKnowsCompositor) { + return mKnowsCompositor->GetCompositorBackendType(); + } + return layers::LayersBackend::LAYERS_NONE; + } + const TrackInfo& mConfig; TaskQueue* mTaskQueue = nullptr; MediaDataDecoderCallback* mCallback = nullptr; DecoderDoctorDiagnostics* mDiagnostics = nullptr; layers::ImageContainer* mImageContainer = nullptr; MediaResult* mError = nullptr; - layers::LayersBackend mLayersBackend = layers::LayersBackend::LAYERS_NONE; + RefPtr mKnowsCompositor; RefPtr mCrashHelper; bool mUseBlankDecoder = false; @@ -74,9 +83,9 @@ private: void Set(DecoderDoctorDiagnostics* aDiagnostics) { mDiagnostics = aDiagnostics; } void Set(layers::ImageContainer* aImageContainer) { mImageContainer = aImageContainer; } void Set(MediaResult* aError) { mError = aError; } - void Set(layers::LayersBackend aLayersBackend) { mLayersBackend = aLayersBackend; } void Set(GMPCrashHelper* aCrashHelper) { mCrashHelper = aCrashHelper; } void Set(bool aUseBlankDecoder) { mUseBlankDecoder = aUseBlankDecoder; } + void Set(layers::KnowsCompositor* aKnowsCompositor) { mKnowsCompositor = aKnowsCompositor; } template void Set(T1&& a1, T2&& a2, Ts&&... args) { diff --git a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp index acc4cc9fb975..69260b501b5f 100644 --- a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp +++ b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp @@ -115,7 +115,7 @@ GMPVideoDecoderParams::GMPVideoDecoderParams(const CreateDecoderParams& aParams) , mCallback(nullptr) , mAdapter(nullptr) , mImageContainer(aParams.mImageContainer) - , mLayersBackend(aParams.mLayersBackend) + , mLayersBackend(aParams.GetLayersBackend()) , mCrashHelper(aParams.mCrashHelper) {} diff --git a/dom/media/platforms/wmf/DXVA2Manager.cpp b/dom/media/platforms/wmf/DXVA2Manager.cpp index 2c4bb57863f2..7148be3dcc5c 100644 --- a/dom/media/platforms/wmf/DXVA2Manager.cpp +++ b/dom/media/platforms/wmf/DXVA2Manager.cpp @@ -13,7 +13,7 @@ #include "mozilla/gfx/DeviceManagerDx.h" #include "mozilla/layers/D3D11ShareHandleImage.h" #include "mozilla/layers/ImageBridgeChild.h" -#include "mozilla/layers/VideoBridgeChild.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/Telemetry.h" #include "MediaTelemetryConstants.h" #include "mfapi.h" @@ -91,7 +91,8 @@ public: D3D9DXVA2Manager(); virtual ~D3D9DXVA2Manager(); - HRESULT Init(nsACString& aFailureReason); + HRESULT Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason); IUnknown* GetDXVADeviceManager() override; @@ -262,7 +263,8 @@ D3D9DXVA2Manager::GetDXVADeviceManager() } HRESULT -D3D9DXVA2Manager::Init(nsACString& aFailureReason) +D3D9DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { MOZ_ASSERT(NS_IsMainThread()); @@ -430,10 +432,12 @@ D3D9DXVA2Manager::Init(nsACString& aFailureReason) mSyncSurface = syncSurf; if (layers::ImageBridgeChild::GetSingleton()) { + // There's no proper KnowsCompositor for ImageBridge currently (and it + // implements the interface), so just use that if it's available. mTextureClientAllocator = new D3D9RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(), mDevice); } else { - mTextureClientAllocator = new D3D9RecycleAllocator(layers::VideoBridgeChild::GetSingleton(), + mTextureClientAllocator = new D3D9RecycleAllocator(aKnowsCompositor, mDevice); } mTextureClientAllocator->SetMaxPoolSize(5); @@ -491,7 +495,8 @@ static uint32_t sDXVAVideosCount = 0; /* static */ DXVA2Manager* -DXVA2Manager::CreateD3D9DXVA(nsACString& aFailureReason) +DXVA2Manager::CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { MOZ_ASSERT(NS_IsMainThread()); HRESULT hr; @@ -510,7 +515,7 @@ DXVA2Manager::CreateD3D9DXVA(nsACString& aFailureReason) } nsAutoPtr d3d9Manager(new D3D9DXVA2Manager()); - hr = d3d9Manager->Init(aFailureReason); + hr = d3d9Manager->Init(aKnowsCompositor, aFailureReason); if (SUCCEEDED(hr)) { return d3d9Manager.forget(); } @@ -525,7 +530,8 @@ public: D3D11DXVA2Manager(); virtual ~D3D11DXVA2Manager(); - HRESULT Init(nsACString& aFailureReason); + HRESULT Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason); IUnknown* GetDXVADeviceManager() override; @@ -633,7 +639,8 @@ D3D11DXVA2Manager::GetDXVADeviceManager() } HRESULT -D3D11DXVA2Manager::Init(nsACString& aFailureReason) +D3D11DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { HRESULT hr; @@ -764,10 +771,12 @@ D3D11DXVA2Manager::Init(nsACString& aFailureReason) NS_ENSURE_TRUE(SUCCEEDED(hr), hr); if (layers::ImageBridgeChild::GetSingleton()) { + // There's no proper KnowsCompositor for ImageBridge currently (and it + // implements the interface), so just use that if it's available. mTextureClientAllocator = new D3D11RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(), mDevice); } else { - mTextureClientAllocator = new D3D11RecycleAllocator(layers::VideoBridgeChild::GetSingleton(), + mTextureClientAllocator = new D3D11RecycleAllocator(aKnowsCompositor, mDevice); } mTextureClientAllocator->SetMaxPoolSize(5); @@ -910,7 +919,8 @@ D3D11DXVA2Manager::ConfigureForSize(uint32_t aWidth, uint32_t aHeight) /* static */ DXVA2Manager* -DXVA2Manager::CreateD3D11DXVA(nsACString& aFailureReason) +DXVA2Manager::CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { // DXVA processing takes up a lot of GPU resources, so limit the number of // videos we use DXVA with at any one time. @@ -926,7 +936,7 @@ DXVA2Manager::CreateD3D11DXVA(nsACString& aFailureReason) } nsAutoPtr manager(new D3D11DXVA2Manager()); - HRESULT hr = manager->Init(aFailureReason); + HRESULT hr = manager->Init(aKnowsCompositor, aFailureReason); NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr); return manager.forget(); diff --git a/dom/media/platforms/wmf/DXVA2Manager.h b/dom/media/platforms/wmf/DXVA2Manager.h index 75a17444a258..0bdc02dd40e4 100644 --- a/dom/media/platforms/wmf/DXVA2Manager.h +++ b/dom/media/platforms/wmf/DXVA2Manager.h @@ -16,6 +16,7 @@ namespace mozilla { namespace layers { class Image; class ImageContainer; +class KnowsCompositor; } class DXVA2Manager { @@ -23,8 +24,8 @@ public: // Creates and initializes a DXVA2Manager. We can use DXVA2 via either // D3D9Ex or D3D11. - static DXVA2Manager* CreateD3D9DXVA(nsACString& aFailureReason); - static DXVA2Manager* CreateD3D11DXVA(nsACString& aFailureReason); + static DXVA2Manager* CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason); + static DXVA2Manager* CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason); // Returns a pointer to the D3D device manager responsible for managing the // device we're using for hardware accelerated video decoding. If we're using diff --git a/dom/media/platforms/wmf/WMFDecoderModule.cpp b/dom/media/platforms/wmf/WMFDecoderModule.cpp index 7cf787f4cf3a..040b63614dee 100644 --- a/dom/media/platforms/wmf/WMFDecoderModule.cpp +++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp @@ -85,7 +85,7 @@ WMFDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams) { nsAutoPtr manager( new WMFVideoMFTManager(aParams.VideoConfig(), - aParams.mLayersBackend, + aParams.mKnowsCompositor, aParams.mImageContainer, sDXVAEnabled)); diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp index 81592eb16295..7339b09903b9 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp @@ -76,18 +76,27 @@ const CLSID CLSID_WebmMfVp9Dec = }; namespace mozilla { + +LayersBackend +GetCompositorBackendType(layers::KnowsCompositor* aKnowsCompositor) +{ + if (aKnowsCompositor) { + return aKnowsCompositor->GetCompositorBackendType(); + } + return LayersBackend::LAYERS_NONE; +} WMFVideoMFTManager::WMFVideoMFTManager( const VideoInfo& aConfig, - mozilla::layers::LayersBackend aLayersBackend, - mozilla::layers::ImageContainer* aImageContainer, + layers::KnowsCompositor* aKnowsCompositor, + layers::ImageContainer* aImageContainer, bool aDXVAEnabled) : mVideoInfo(aConfig) , mVideoStride(0) , mImageSize(aConfig.mImage) , mImageContainer(aImageContainer) , mDXVAEnabled(aDXVAEnabled) - , mLayersBackend(aLayersBackend) + , mKnowsCompositor(aKnowsCompositor) , mNullOutputCount(0) , mGotValidOutputAfterNullOutput(false) , mGotExcessiveNullOutput(false) @@ -303,8 +312,11 @@ FindD3D9BlacklistedDLL() { class CreateDXVAManagerEvent : public Runnable { public: - CreateDXVAManagerEvent(LayersBackend aBackend, nsCString& aFailureReason) + CreateDXVAManagerEvent(LayersBackend aBackend, + layers::KnowsCompositor* aKnowsCompositor, + nsCString& aFailureReason) : mBackend(aBackend) + , mKnowsCompositor(aKnowsCompositor) , mFailureReason(aFailureReason) {} @@ -321,7 +333,7 @@ public: failureReason->AppendPrintf("D3D11 blacklisted with DLL %s", blacklistedDLL.get()); } else { - mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(*failureReason); + mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(mKnowsCompositor, *failureReason); if (mDXVA2Manager) { return NS_OK; } @@ -337,14 +349,15 @@ public: mFailureReason.AppendPrintf("D3D9 blacklisted with DLL %s", blacklistedDLL.get()); } else { - mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(*failureReason); + mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(mKnowsCompositor, *failureReason); // Make sure we include the messages from both attempts (if applicable). mFailureReason.Append(secondFailureReason); } return NS_OK; } nsAutoPtr mDXVA2Manager; - LayersBackend mBackend; + layers::LayersBackend mBackend; + KnowsCompositor* mKnowsCompositor; nsACString& mFailureReason; }; @@ -359,8 +372,9 @@ WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) return false; } MOZ_ASSERT(!mDXVA2Manager); - if (mLayersBackend != LayersBackend::LAYERS_D3D9 && - mLayersBackend != LayersBackend::LAYERS_D3D11) { + LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); + if (backend != LayersBackend::LAYERS_D3D9 && + backend != LayersBackend::LAYERS_D3D11) { mDXVAFailureReason.AssignLiteral("Unsupported layers backend"); return false; } @@ -368,7 +382,8 @@ WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) // The DXVA manager must be created on the main thread. RefPtr event = new CreateDXVAManagerEvent(aForceD3D9 ? LayersBackend::LAYERS_D3D9 - : mLayersBackend, + : backend, + mKnowsCompositor, mDXVAFailureReason); if (NS_IsMainThread()) { @@ -751,8 +766,9 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample, NS_ENSURE_TRUE(duration.IsValid(), E_FAIL); nsIntRect pictureRegion = mVideoInfo.ScaledImageRect(videoWidth, videoHeight); - if (mLayersBackend != LayersBackend::LAYERS_D3D9 && - mLayersBackend != LayersBackend::LAYERS_D3D11) { + LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); + if (backend != LayersBackend::LAYERS_D3D9 && + backend != LayersBackend::LAYERS_D3D11) { RefPtr v = VideoData::CreateAndCopyData(mVideoInfo, mImageContainer, diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h index 8e8455e58f73..b8dfa63365d6 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.h +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h @@ -21,8 +21,8 @@ class DXVA2Manager; class WMFVideoMFTManager : public MFTManager { public: WMFVideoMFTManager(const VideoInfo& aConfig, - mozilla::layers::LayersBackend aLayersBackend, - mozilla::layers::ImageContainer* aImageContainer, + layers::KnowsCompositor* aKnowsCompositor, + layers::ImageContainer* aImageContainer, bool aDXVAEnabled); ~WMFVideoMFTManager(); @@ -88,6 +88,7 @@ private: nsIntSize mImageSize; RefPtr mImageContainer; + RefPtr mKnowsCompositor; nsAutoPtr mDXVA2Manager; RefPtr mLastInput; @@ -97,7 +98,6 @@ private: int64_t mSamplesCount = 0; bool mDXVAEnabled; - const layers::LayersBackend mLayersBackend; bool mUseHwAccel; nsCString mDXVAFailureReason; diff --git a/dom/media/platforms/wrappers/H264Converter.cpp b/dom/media/platforms/wrappers/H264Converter.cpp index dac2566138e1..71ecb286a476 100644 --- a/dom/media/platforms/wrappers/H264Converter.cpp +++ b/dom/media/platforms/wrappers/H264Converter.cpp @@ -19,7 +19,7 @@ H264Converter::H264Converter(PlatformDecoderModule* aPDM, const CreateDecoderParams& aParams) : mPDM(aPDM) , mCurrentConfig(aParams.VideoConfig()) - , mLayersBackend(aParams.mLayersBackend) + , mKnowsCompositor(aParams.mKnowsCompositor) , mImageContainer(aParams.mImageContainer) , mTaskQueue(aParams.mTaskQueue) , mCallback(aParams.mCallback) @@ -194,7 +194,7 @@ H264Converter::CreateDecoder(DecoderDoctorDiagnostics* aDiagnostics) mCallback, aDiagnostics, mImageContainer, - mLayersBackend, + mKnowsCompositor, mGMPCrashHelper }); diff --git a/dom/media/platforms/wrappers/H264Converter.h b/dom/media/platforms/wrappers/H264Converter.h index bda2fb0480de..6905b1c746e3 100644 --- a/dom/media/platforms/wrappers/H264Converter.h +++ b/dom/media/platforms/wrappers/H264Converter.h @@ -56,7 +56,7 @@ private: RefPtr mPDM; VideoInfo mCurrentConfig; - layers::LayersBackend mLayersBackend; + RefPtr mKnowsCompositor; RefPtr mImageContainer; const RefPtr mTaskQueue; nsTArray> mMediaRawSamples; diff --git a/dom/media/webrtc/MediaEngineCameraVideoSource.cpp b/dom/media/webrtc/MediaEngineCameraVideoSource.cpp index c266d61e2080..95e555a3a6a8 100644 --- a/dom/media/webrtc/MediaEngineCameraVideoSource.cpp +++ b/dom/media/webrtc/MediaEngineCameraVideoSource.cpp @@ -49,7 +49,7 @@ MediaEngineCameraVideoSource::GetCapability(size_t aIndex, webrtc::CaptureCapability& aOut) const { MOZ_ASSERT(aIndex < mHardcodedCapabilities.Length()); - aOut = mHardcodedCapabilities[aIndex]; + aOut = mHardcodedCapabilities.SafeElementAt(aIndex, webrtc::CaptureCapability()); } uint32_t diff --git a/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp b/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp index 666600a0ccb5..ef2128fbcc3c 100644 --- a/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp +++ b/dom/media/webrtc/MediaEngineRemoteVideoSource.cpp @@ -420,53 +420,19 @@ MediaEngineRemoteVideoSource::DeliverFrame(unsigned char* buffer, size_t MediaEngineRemoteVideoSource::NumCapabilities() const { + mHardcodedCapabilities.Clear(); int num = mozilla::camera::GetChildAndCall( &mozilla::camera::CamerasChild::NumberOfCapabilities, mCapEngine, GetUUID().get()); - if (num > 0) { - return num; - } - - switch(mMediaSource) { - case dom::MediaSourceEnum::Camera: -#ifdef XP_MACOSX - // Mac doesn't support capabilities. - // - // Hardcode generic desktop capabilities modeled on OSX camera. - // Note: Values are empirically picked to be OSX friendly, as on OSX, values - // other than these cause the source to not produce. - - if (mHardcodedCapabilities.IsEmpty()) { - for (int i = 0; i < 9; i++) { - webrtc::CaptureCapability c; - c.width = 1920 - i*128; - c.height = 1080 - i*72; - c.maxFPS = 30; - mHardcodedCapabilities.AppendElement(c); - } - for (int i = 0; i < 16; i++) { - webrtc::CaptureCapability c; - c.width = 640 - i*40; - c.height = 480 - i*30; - c.maxFPS = 30; - mHardcodedCapabilities.AppendElement(c); - } - } - break; -#endif - default: - webrtc::CaptureCapability c; + if (num < 1) { // The default for devices that don't return discrete capabilities: treat // them as supporting all capabilities orthogonally. E.g. screensharing. - c.width = 0; // 0 = accept any value - c.height = 0; - c.maxFPS = 0; - mHardcodedCapabilities.AppendElement(c); - break; + // CaptureCapability defaults key values to 0, which means accept any value. + mHardcodedCapabilities.AppendElement(webrtc::CaptureCapability()); + num = mHardcodedCapabilities.Length(); // 1 } - - return mHardcodedCapabilities.Length(); + return num; } bool diff --git a/dom/push/PushCrypto.jsm b/dom/push/PushCrypto.jsm index fd1a6dd85773..5a669875c168 100644 --- a/dom/push/PushCrypto.jsm +++ b/dom/push/PushCrypto.jsm @@ -434,20 +434,19 @@ this.PushCrypto = { throw new CryptoError('Unsupported pad size', BAD_CRYPTO); } if (decoded.length < padSize) { - throw new CryptoError('Decoded array is too short!', BAD_PADDING, - padSize); + throw new CryptoError('Decoded array is too short!', BAD_PADDING); } var pad = decoded[0]; if (padSize == 2) { pad = (pad << 8) | decoded[1]; } if (pad > decoded.length) { - throw new CryptoError('Padding is wrong!', BAD_PADDING, padSize); + throw new CryptoError('Padding is wrong!', BAD_PADDING); } // All padded bytes must be zero except the first one. for (var i = padSize; i <= pad; i++) { if (decoded[i] !== 0) { - throw new CryptoError('Padding is wrong!', BAD_PADDING, padSize); + throw new CryptoError('Padding is wrong!', BAD_PADDING); } } return decoded.slice(pad + padSize); diff --git a/dom/push/PushService.jsm b/dom/push/PushService.jsm index 33ef3d83ad24..9485dc01f509 100644 --- a/dom/push/PushService.jsm +++ b/dom/push/PushService.jsm @@ -340,7 +340,7 @@ this.PushService = { }) break; - case "clear-origin-data": + case "clear-origin-attributes-data": this._clearOriginData(aData).catch(error => { console.error("clearOriginData: Error clearing origin data:", error); }); @@ -517,7 +517,7 @@ this.PushService = { return; } - Services.obs.addObserver(this, "clear-origin-data", false); + Services.obs.addObserver(this, "clear-origin-attributes-data", false); // The offline-status-changed event is used to know // when to (dis)connect. It may not fire if the underlying OS changes @@ -611,7 +611,7 @@ this.PushService = { prefs.ignore("connection.enabled", this); Services.obs.removeObserver(this, "network:offline-status-changed"); - Services.obs.removeObserver(this, "clear-origin-data"); + Services.obs.removeObserver(this, "clear-origin-attributes-data"); Services.obs.removeObserver(this, "idle-daily"); Services.obs.removeObserver(this, "perm-changed"); }, diff --git a/dom/quota/QuotaManagerService.cpp b/dom/quota/QuotaManagerService.cpp index df061a2e2ae7..5b1fd80ea97d 100644 --- a/dom/quota/QuotaManagerService.cpp +++ b/dom/quota/QuotaManagerService.cpp @@ -656,7 +656,7 @@ QuotaManagerService::Observe(nsISupports* aSubject, return NS_OK; } - if (!strcmp(aTopic, "clear-origin-data")) { + if (!strcmp(aTopic, "clear-origin-attributes-data")) { RefPtr request = new Request(); ClearOriginsParams requestParams; diff --git a/dom/security/test/general/test_contentpolicytype_targeted_link_iframe.html b/dom/security/test/general/test_contentpolicytype_targeted_link_iframe.html index 4eece8aa06bc..7b1ab72dc49d 100644 --- a/dom/security/test/general/test_contentpolicytype_targeted_link_iframe.html +++ b/dom/security/test/general/test_contentpolicytype_targeted_link_iframe.html @@ -14,7 +14,7 @@ /* Description of the test: * Let's load a link into a targeted iframe and make sure the content policy - * type used for content policy checks is of TYPE_SUBDOCUMENT both times. + * type used for content policy checks is of TYPE_SUBDOCUMENT. */ const Cc = SpecialPowers.Cc; @@ -26,10 +26,6 @@ const EXPECTED_URL = const TEST_FRAME_URL = "file_contentpolicytype_targeted_link_iframe.sjs?testframe"; -// we should get two content policy chcks with the same content policy type -const EXPECTED_RESULTS = 2; -var testCounter = 0; - // ----- START Content Policy implementation for the test var categoryManager = Cc["@mozilla.org/categorymanager;1"].getService(Ci.nsICategoryManager); @@ -63,12 +59,8 @@ var policy = { if (contentLocation.asciiSpec === EXPECTED_URL) { is(contentType, EXPECTED_CONTENT_TYPE, "content policy type should TYPESUBDOCUMENT"); - testCounter++; - - if (testCounter === EXPECTED_RESULTS) { - categoryManager.deleteCategoryEntry("content-policy", POLICYNAME, false); - SimpleTest.finish(); - } + categoryManager.deleteCategoryEntry("content-policy", POLICYNAME, false); + SimpleTest.finish(); } return Ci.nsIContentPolicy.ACCEPT; }, diff --git a/dom/storage/DOMStorageObserver.cpp b/dom/storage/DOMStorageObserver.cpp index 4d903fb452e8..ccd968bd59c0 100644 --- a/dom/storage/DOMStorageObserver.cpp +++ b/dom/storage/DOMStorageObserver.cpp @@ -62,7 +62,7 @@ DOMStorageObserver::Init() obs->AddObserver(sSelf, "perm-changed", true); obs->AddObserver(sSelf, "browser:purge-domain-data", true); obs->AddObserver(sSelf, "last-pb-context-exited", true); - obs->AddObserver(sSelf, "clear-origin-data", true); + obs->AddObserver(sSelf, "clear-origin-attributes-data", true); // Shutdown obs->AddObserver(sSelf, "profile-after-change", true); @@ -266,7 +266,7 @@ DOMStorageObserver::Observe(nsISupports* aSubject, } // Clear data of the origins whose prefixes will match the suffix. - if (!strcmp(aTopic, "clear-origin-data")) { + if (!strcmp(aTopic, "clear-origin-attributes-data")) { OriginAttributesPattern pattern; if (!pattern.Init(nsDependentString(aData))) { NS_ERROR("Cannot parse origin attributes pattern"); diff --git a/dom/tests/mochitest/webcomponents/mochitest.ini b/dom/tests/mochitest/webcomponents/mochitest.ini index c1309aae4405..496f7ea4d03e 100644 --- a/dom/tests/mochitest/webcomponents/mochitest.ini +++ b/dom/tests/mochitest/webcomponents/mochitest.ini @@ -15,6 +15,7 @@ support-files = [test_custom_element_in_shadow.html] [test_custom_element_register_invalid_callbacks.html] [test_custom_element_get.html] +[test_custom_element_when_defined.html] [test_nested_content_element.html] [test_dest_insertion_points.html] [test_dest_insertion_points_shadow.html] diff --git a/dom/tests/mochitest/webcomponents/test_custom_element_when_defined.html b/dom/tests/mochitest/webcomponents/test_custom_element_when_defined.html new file mode 100644 index 000000000000..a71530ae0702 --- /dev/null +++ b/dom/tests/mochitest/webcomponents/test_custom_element_when_defined.html @@ -0,0 +1,140 @@ + + + + + Test custom elements whenDefined function. + + + + +Bug 1275839 + + + + diff --git a/dom/workers/ServiceWorkerManager.cpp b/dom/workers/ServiceWorkerManager.cpp index b811c12cd0f3..8554597cd452 100644 --- a/dom/workers/ServiceWorkerManager.cpp +++ b/dom/workers/ServiceWorkerManager.cpp @@ -94,7 +94,7 @@ BEGIN_WORKERS_NAMESPACE #define PURGE_DOMAIN_DATA "browser:purge-domain-data" #define PURGE_SESSION_HISTORY "browser:purge-session-history" -#define CLEAR_ORIGIN_DATA "clear-origin-data" +#define CLEAR_ORIGIN_DATA "clear-origin-attributes-data" static_assert(nsIHttpChannelInternal::CORS_MODE_SAME_ORIGIN == static_cast(RequestMode::Same_origin), "RequestMode enumeration value should match Necko CORS mode value."); diff --git a/extensions/cookie/nsPermissionManager.cpp b/extensions/cookie/nsPermissionManager.cpp index 3d02bf30daa0..0e97690b992b 100644 --- a/extensions/cookie/nsPermissionManager.cpp +++ b/extensions/cookie/nsPermissionManager.cpp @@ -204,7 +204,7 @@ public: NS_IMETHOD Observe(nsISupports* aSubject, const char* aTopic, const char16_t* aData) override { - MOZ_ASSERT(!nsCRT::strcmp(aTopic, "clear-origin-data")); + MOZ_ASSERT(!nsCRT::strcmp(aTopic, "clear-origin-attributes-data")); nsCOMPtr permManager = do_GetService("@mozilla.org/permissionmanager;1"); return permManager->RemovePermissionsWithAttributes(nsDependentString(aData)); @@ -725,7 +725,7 @@ nsPermissionManager::ClearOriginDataObserverInit() { nsCOMPtr observerService = mozilla::services::GetObserverService(); - observerService->AddObserver(new ClearOriginDataObserver(), "clear-origin-data", /* ownsWeak= */ false); + observerService->AddObserver(new ClearOriginDataObserver(), "clear-origin-attributes-data", /* ownsWeak= */ false); } //////////////////////////////////////////////////////////////////////////////// diff --git a/extensions/cookie/nsPermissionManager.h b/extensions/cookie/nsPermissionManager.h index 0f0df216cf70..c0a545598db4 100644 --- a/extensions/cookie/nsPermissionManager.h +++ b/extensions/cookie/nsPermissionManager.h @@ -197,7 +197,7 @@ public: const bool aIgnoreSessionPermissions = false); /** - * Initialize the "clear-origin-data" observing. + * Initialize the "clear-origin-attributes-data" observing. * Will create a nsPermissionManager instance if needed. * That way, we can prevent have nsPermissionManager created at startup just * to be able to clear data when an application is uninstalled. diff --git a/extensions/cookie/test/unit/test_permmanager_cleardata.js b/extensions/cookie/test/unit/test_permmanager_cleardata.js index a0c0f5334acc..faa2579f528f 100644 --- a/extensions/cookie/test/unit/test_permmanager_cleardata.js +++ b/extensions/cookie/test/unit/test_permmanager_cleardata.js @@ -9,14 +9,14 @@ function createPrincipal(aOrigin, aOriginAttributes) return Services.scriptSecurityManager.createCodebasePrincipal(NetUtil.newURI(aOrigin), aOriginAttributes); } -// Return the data required by 'clear-origin-data' notification. +// Return the data required by 'clear-origin-attributes-data' notification. function getData(aPattern) { return JSON.stringify(aPattern); } // Use aEntries to create principals, add permissions to them and check that they have them. -// Then, it is notifying 'clear-origin-data' with the given aData and check if the permissions +// Then, it is notifying 'clear-origin-attributes-data' with the given aData and check if the permissions // of principals[i] matches the permission in aResults[i]. function test(aEntries, aData, aResults) { @@ -32,7 +32,7 @@ function test(aEntries, aData, aResults) do_check_eq(pm.testPermissionFromPrincipal(principal, "test/clear-origin"), pm.ALLOW_ACTION); } - Services.obs.notifyObservers(null, 'clear-origin-data', aData); + Services.obs.notifyObservers(null, 'clear-origin-attributes-data', aData); var length = aEntries.length; for (let i=0; iUpdateStringsVector(message.str()); + } + return true; +} + void GPUChild::ActorDestroy(ActorDestroyReason aWhy) { diff --git a/gfx/ipc/GPUChild.h b/gfx/ipc/GPUChild.h index 93f4d0af2a15..69539267d861 100644 --- a/gfx/ipc/GPUChild.h +++ b/gfx/ipc/GPUChild.h @@ -35,6 +35,7 @@ public: bool RecvInitComplete(const GPUDeviceData& aData) override; bool RecvReportCheckerboard(const uint32_t& aSeverity, const nsCString& aLog) override; void ActorDestroy(ActorDestroyReason aWhy) override; + bool RecvGraphicsError(const nsCString& aError) override; static void Destroy(UniquePtr&& aChild); diff --git a/gfx/ipc/GPUParent.cpp b/gfx/ipc/GPUParent.cpp index fc356e484de0..92e046fd3028 100644 --- a/gfx/ipc/GPUParent.cpp +++ b/gfx/ipc/GPUParent.cpp @@ -75,6 +75,8 @@ GPUParent::Init(base::ProcessId aParentPid, gfxConfig::Init(); gfxVars::Initialize(); gfxPlatform::InitNullMetadata(); + // Ensure our Factory is initialised, mainly for gfx logging to work. + gfxPlatform::InitMoz2DLogging(); #if defined(XP_WIN) DeviceManagerDx::Init(); DeviceManagerD3D9::Init(); diff --git a/gfx/ipc/PGPU.ipdl b/gfx/ipc/PGPU.ipdl index a673bce375fa..5cf140556f2d 100644 --- a/gfx/ipc/PGPU.ipdl +++ b/gfx/ipc/PGPU.ipdl @@ -75,6 +75,9 @@ child: // Sent when APZ detects checkerboarding and apz checkerboard reporting is enabled. async ReportCheckerboard(uint32_t severity, nsCString log); + + // Graphics errors, analogous to PContent::GraphicsError + async GraphicsError(nsCString aError); }; } // namespace gfx diff --git a/gfx/layers/IMFYCbCrImage.cpp b/gfx/layers/IMFYCbCrImage.cpp index 8b8b155b344c..6750e394abcd 100644 --- a/gfx/layers/IMFYCbCrImage.cpp +++ b/gfx/layers/IMFYCbCrImage.cpp @@ -37,6 +37,9 @@ struct AutoLockTexture AutoLockTexture(ID3D11Texture2D* aTexture) { aTexture->QueryInterface((IDXGIKeyedMutex**)getter_AddRefs(mMutex)); + if (!mMutex) { + return; + } HRESULT hr = mMutex->AcquireSync(0, 10000); if (hr == WAIT_TIMEOUT) { MOZ_CRASH("GFX: IMFYCbCrImage timeout"); @@ -49,6 +52,9 @@ struct AutoLockTexture ~AutoLockTexture() { + if (!mMutex) { + return; + } HRESULT hr = mMutex->ReleaseSync(0); if (FAILED(hr)) { NS_WARNING("Failed to unlock the texture"); @@ -227,6 +233,10 @@ IMFYCbCrImage::GetTextureClient(KnowsCompositor* aForwarder) RefPtr device = gfx::DeviceManagerDx::Get()->GetContentDevice(); + if (!device) { + device = + gfx::DeviceManagerDx::Get()->GetCompositorDevice(); + } LayersBackend backend = aForwarder->GetCompositorBackendType(); if (!device || backend != LayersBackend::LAYERS_D3D11) { @@ -245,7 +255,11 @@ IMFYCbCrImage::GetTextureClient(KnowsCompositor* aForwarder) CD3D11_TEXTURE2D_DESC newDesc(DXGI_FORMAT_R8_UNORM, mData.mYSize.width, mData.mYSize.height, 1, 1); - newDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; + if (device == gfx::DeviceManagerDx::Get()->GetCompositorDevice()) { + newDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED; + } else { + newDesc.MiscFlags = D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX; + } RefPtr textureY; D3D11_SUBRESOURCE_DATA yData = { mData.mYChannel, (UINT)mData.mYStride, 0 }; diff --git a/gfx/layers/apz/test/mochitest/helper_long_tap.html b/gfx/layers/apz/test/mochitest/helper_long_tap.html index 638b048e794c..604d03d64461 100644 --- a/gfx/layers/apz/test/mochitest/helper_long_tap.html +++ b/gfx/layers/apz/test/mochitest/helper_long_tap.html @@ -17,22 +17,50 @@ function longPressLink() { var eventsFired = 0; function recordEvent(e) { - switch (eventsFired) { - case 0: is(e.type, 'touchstart', 'Got a touchstart'); break; - case 1: is(e.type, 'contextmenu', 'Got a contextmenu'); e.preventDefault(); break; - case 2: is(e.type, 'touchcancel', 'Got a touchcancel'); break; - default: ok(false, 'Got an unexpected event of type ' + e.type); break; - } - eventsFired++; + if (getPlatform() == "windows") { + // On Windows we get a mouselongtap event once the long-tap has been detected + // by APZ, and that's what we use as the trigger to lift the finger. That then + // triggers the contextmenu. This matches the platform convention. + switch (eventsFired) { + case 0: is(e.type, 'touchstart', 'Got a touchstart'); break; + case 1: + is(e.type, 'mouselongtap', 'Got a mouselongtap'); + synthesizeNativeTouch(document.getElementById('b'), 5, 5, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE); + break; + case 2: is(e.type, 'touchend', 'Got a touchend'); break; + case 3: is(e.type, 'contextmenu', 'Got a contextmenu'); e.preventDefault(); break; + default: ok(false, 'Got an unexpected event of type ' + e.type); break; + } + eventsFired++; - if (eventsFired == 3) { - synthesizeNativeTouch(document.getElementById('b'), 5, 5, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE, function() { - dump("Finished synthesizing touch-end, doing an APZ flush to see if any more unexpected events come through...\n"); + if (eventsFired == 4) { + dump("Finished waiting for events, doing an APZ flush to see if any more unexpected events come through...\n"); flushApzRepaints(function() { dump("Done APZ flush, ending test...\n"); - subtestDone(); // closing the window should dismiss the context menu dialog + subtestDone(); }); - }); + } + } else { + // On non-Windows platforms we get a contextmenu event once the long-tap has + // been detected. Since we prevent-default that, we don't get a mouselongtap + // event at all, and instead get a touchcancel. + switch (eventsFired) { + case 0: is(e.type, 'touchstart', 'Got a touchstart'); break; + case 1: is(e.type, 'contextmenu', 'Got a contextmenu'); e.preventDefault(); break; + case 2: is(e.type, 'touchcancel', 'Got a touchcancel'); break; + default: ok(false, 'Got an unexpected event of type ' + e.type); break; + } + eventsFired++; + + if (eventsFired == 3) { + synthesizeNativeTouch(document.getElementById('b'), 5, 5, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE, function() { + dump("Finished synthesizing touch-end, doing an APZ flush to see if any more unexpected events come through...\n"); + flushApzRepaints(function() { + dump("Done APZ flush, ending test...\n"); + subtestDone(); + }); + }); + } } } @@ -40,6 +68,7 @@ window.addEventListener('touchstart', recordEvent, { passive: true, capture: tru window.addEventListener('touchend', recordEvent, { passive: true, capture: true }); window.addEventListener('touchcancel', recordEvent, true); window.addEventListener('contextmenu', recordEvent, true); +SpecialPowers.addChromeEventListener('mouselongtap', recordEvent, true); waitUntilApzStable() .then(longPressLink); diff --git a/gfx/layers/apz/test/mochitest/helper_tap_passive.html b/gfx/layers/apz/test/mochitest/helper_tap_passive.html index ee99c37f6771..dc3d85ed2c1c 100644 --- a/gfx/layers/apz/test/mochitest/helper_tap_passive.html +++ b/gfx/layers/apz/test/mochitest/helper_tap_passive.html @@ -30,10 +30,14 @@ function recordEvent(e) { // it needs to wait until both the touchstart and touchmove event are handled // by the main thread. In this case there is no touchmove at all, so APZ would // end up waiting indefinitely and time out the test. The fact that we get this - // contextmenu event at all means that APZ decided not to wait for the content - // response, which is the desired behaviour, since the touchstart listener was - // registered as a passive listener. - is(e.type, 'contextmenu', 'Got a contextmenu'); + // contextmenu event (mouselongtap on Windows) at all means that APZ decided + // not to wait for the content response, which is the desired behaviour, since + // the touchstart listener was registered as a passive listener. + if (getPlatform() == "windows") { + is(e.type, 'mouselongtap', 'Got a mouselongtap'); + } else { + is(e.type, 'contextmenu', 'Got a contextmenu'); + } e.preventDefault(); synthesizeNativeTouch(document.getElementById('b'), 5, 5, SpecialPowers.DOMWindowUtils.TOUCH_REMOVE, function() { @@ -43,7 +47,11 @@ function recordEvent(e) { } window.addEventListener('touchstart', recordEvent, { passive: true, capture: true }); -window.addEventListener('contextmenu', recordEvent, true); +if (getPlatform() == "windows") { + SpecialPowers.addChromeEventListener('mouselongtap', recordEvent, true); +} else { + window.addEventListener('contextmenu', recordEvent, true); +} waitUntilApzStable() .then(longPressLink); diff --git a/gfx/layers/apz/test/mochitest/mochitest.ini b/gfx/layers/apz/test/mochitest/mochitest.ini index 0d2cf0f210e1..f08b1f9d5b52 100644 --- a/gfx/layers/apz/test/mochitest/mochitest.ini +++ b/gfx/layers/apz/test/mochitest/mochitest.ini @@ -1,69 +1,65 @@ [DEFAULT] -support-files = - apz_test_utils.js - apz_test_native_event_utils.js - helper_bug982141.html - helper_bug1151663.html - helper_bug1285070.html - helper_iframe1.html - helper_iframe2.html - helper_subframe_style.css - helper_basic_pan.html - helper_div_pan.html - helper_iframe_pan.html - helper_scrollto_tap.html - helper_tap.html - helper_long_tap.html - helper_scroll_on_position_fixed.html - helper_tap_passive.html - helper_click.html - helper_drag_click.html - helper_bug1271432.html - helper_touch_action.html - helper_touch_action_regions.html - helper_scroll_inactive_perspective.html - helper_scroll_inactive_zindex.html - helper_bug1280013.html - helper_tall.html - helper_drag_scroll.html - helper_touch_action_complex.html - helper_tap_fullzoom.html - helper_bug1162771.html - helper_bug1299195.html -tags = apz + support-files = + apz_test_utils.js + apz_test_native_event_utils.js + helper_bug982141.html + helper_bug1151663.html + helper_bug1285070.html + helper_iframe1.html + helper_iframe2.html + helper_subframe_style.css + helper_basic_pan.html + helper_div_pan.html + helper_iframe_pan.html + helper_scrollto_tap.html + helper_tap.html + helper_long_tap.html + helper_scroll_on_position_fixed.html + helper_tap_passive.html + helper_click.html + helper_drag_click.html + helper_bug1271432.html + helper_touch_action.html + helper_touch_action_regions.html + helper_scroll_inactive_perspective.html + helper_scroll_inactive_zindex.html + helper_bug1280013.html + helper_tall.html + helper_drag_scroll.html + helper_touch_action_complex.html + helper_tap_fullzoom.html + helper_bug1162771.html + helper_bug1299195.html + tags = apz [test_bug982141.html] [test_bug1151663.html] [test_bug1277814.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_wheel_scroll.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_wheel_transactions.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_bug1151667.html] -skip-if = (os == 'android') || (os == 'b2g') # wheel events not supported on mobile + skip-if = (os == 'android') || (os == 'b2g') # wheel events not supported on mobile [test_layerization.html] -skip-if = (os == 'android') || (os == 'b2g') # uses wheel events which are not supported on mobile + skip-if = (os == 'android') || (os == 'b2g') # uses wheel events which are not supported on mobile [test_scroll_inactive_flattened_frame.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_scroll_inactive_bug1190112.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_scroll_subframe_scrollbar.html] -skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet + skip-if = (os == 'android') || (os == 'b2g') || (buildapp == 'mulet') # wheel events not supported on mobile; see bug 1164274 for mulet [test_frame_reconstruction.html] [test_interrupted_reflow.html] [test_group_touchevents.html] -# Windows touch injection doesn't work in automation, but this test can be run locally on a windows touch device. -skip-if = (toolkit == 'windows') [test_group_wheelevents.html] -skip-if = (toolkit == 'android') # wheel events not supported on mobile + skip-if = (toolkit == 'android') # wheel events not supported on mobile [test_group_mouseevents.html] -skip-if = (toolkit == 'android') # mouse events not supported on mobile + skip-if = (toolkit == 'android') # mouse events not supported on mobile [test_touch_listeners_impacting_wheel.html] -skip-if = (toolkit == 'android') || (toolkit == 'cocoa') # wheel events not supported on mobile, and synthesized wheel smooth-scrolling not supported on OS X + skip-if = (toolkit == 'android') || (toolkit == 'cocoa') # wheel events not supported on mobile, and synthesized wheel smooth-scrolling not supported on OS X [test_bug1253683.html] -skip-if = (os == 'android') || (os == 'b2g') # uses wheel events which are not supported on mobile + skip-if = (os == 'android') || (os == 'b2g') # uses wheel events which are not supported on mobile [test_group_zoom.html] -skip-if = (toolkit != 'android') # only android supports zoom + skip-if = (toolkit != 'android') # only android supports zoom [test_group_pointerevents.html] -# Windows touch injection doesn't work in automation, but this test can be run locally on a windows touch device. -skip-if = (toolkit == 'windows') diff --git a/gfx/layers/apz/util/APZCCallbackHelper.cpp b/gfx/layers/apz/util/APZCCallbackHelper.cpp index 5c755dca7043..3f33a59e430f 100644 --- a/gfx/layers/apz/util/APZCCallbackHelper.cpp +++ b/gfx/layers/apz/util/APZCCallbackHelper.cpp @@ -490,6 +490,9 @@ APZCCallbackHelper::DispatchSynthesizedMouseEvent(EventMessage aMsg, event.mTime = aTime; event.button = WidgetMouseEvent::eLeftButton; event.inputSource = nsIDOMMouseEvent::MOZ_SOURCE_TOUCH; + if (aMsg == eMouseLongTap) { + event.mFlags.mOnlyChromeDispatch = true; + } event.mIgnoreRootScrollFrame = true; if (aMsg != eMouseMove) { event.mClickCount = aClickCount; diff --git a/gfx/layers/client/ImageClient.cpp b/gfx/layers/client/ImageClient.cpp index b9b588fa4b25..73b8c7aca477 100644 --- a/gfx/layers/client/ImageClient.cpp +++ b/gfx/layers/client/ImageClient.cpp @@ -111,6 +111,82 @@ ImageClientSingle::FlushAllImages(AsyncTransactionWaiter* aAsyncTransactionWaite mBuffers.Clear(); } +/* static */ already_AddRefed +ImageClient::CreateTextureClientForImage(Image* aImage, KnowsCompositor* aForwarder) +{ + RefPtr texture; + if (aImage->GetFormat() == ImageFormat::PLANAR_YCBCR) { + PlanarYCbCrImage* ycbcr = static_cast(aImage); + const PlanarYCbCrData* data = ycbcr->GetData(); + if (!data) { + return nullptr; + } + texture = TextureClient::CreateForYCbCr(aForwarder, + data->mYSize, data->mCbCrSize, data->mStereoMode, + TextureFlags::DEFAULT); + if (!texture) { + return nullptr; + } + + TextureClientAutoLock autoLock(texture, OpenMode::OPEN_WRITE_ONLY); + if (!autoLock.Succeeded()) { + return nullptr; + } + + bool status = UpdateYCbCrTextureClient(texture, *data); + MOZ_ASSERT(status); + if (!status) { + return nullptr; + } + } else if (aImage->GetFormat() == ImageFormat::SURFACE_TEXTURE || + aImage->GetFormat() == ImageFormat::EGLIMAGE) { + gfx::IntSize size = aImage->GetSize(); + + if (aImage->GetFormat() == ImageFormat::EGLIMAGE) { + EGLImageImage* typedImage = aImage->AsEGLImageImage(); + texture = EGLImageTextureData::CreateTextureClient( + typedImage, size, aForwarder->GetTextureForwarder(), TextureFlags::DEFAULT); +#ifdef MOZ_WIDGET_ANDROID + } else if (aImage->GetFormat() == ImageFormat::SURFACE_TEXTURE) { + SurfaceTextureImage* typedImage = aImage->AsSurfaceTextureImage(); + texture = AndroidSurfaceTextureData::CreateTextureClient( + typedImage->GetSurfaceTexture(), size, typedImage->GetOriginPos(), + aForwarder->GetTextureForwarder(), TextureFlags::DEFAULT); +#endif + } else { + MOZ_ASSERT(false, "Bad ImageFormat."); + } + } else { + RefPtr surface = aImage->GetAsSourceSurface(); + MOZ_ASSERT(surface); + texture = TextureClient::CreateForDrawing(aForwarder, surface->GetFormat(), aImage->GetSize(), + BackendSelector::Content, TextureFlags::DEFAULT); + if (!texture) { + return nullptr; + } + + MOZ_ASSERT(texture->CanExposeDrawTarget()); + + if (!texture->Lock(OpenMode::OPEN_WRITE_ONLY)) { + return nullptr; + } + + { + // We must not keep a reference to the DrawTarget after it has been unlocked. + DrawTarget* dt = texture->BorrowDrawTarget(); + if (!dt) { + gfxWarning() << "ImageClientSingle::UpdateImage failed in BorrowDrawTarget"; + return nullptr; + } + MOZ_ASSERT(surface.get()); + dt->CopySurface(surface, IntRect(IntPoint(), surface->GetSize()), IntPoint()); + } + + texture->Unlock(); + } + return texture.forget(); +} + bool ImageClientSingle::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlags) { @@ -188,77 +264,7 @@ ImageClientSingle::UpdateImage(ImageContainer* aContainer, uint32_t aContentFlag // Slow path, we should not be hitting it very often and if we do it means // we are using an Image class that is not backed by textureClient and we // should fix it. - if (image->GetFormat() == ImageFormat::PLANAR_YCBCR) { - PlanarYCbCrImage* ycbcr = static_cast(image); - const PlanarYCbCrData* data = ycbcr->GetData(); - if (!data) { - return false; - } - texture = TextureClient::CreateForYCbCr(GetForwarder(), - data->mYSize, data->mCbCrSize, data->mStereoMode, - TextureFlags::DEFAULT | mTextureFlags - ); - if (!texture) { - return false; - } - - TextureClientAutoLock autoLock(texture, OpenMode::OPEN_WRITE_ONLY); - if (!autoLock.Succeeded()) { - return false; - } - - bool status = UpdateYCbCrTextureClient(texture, *data); - MOZ_ASSERT(status); - if (!status) { - return false; - } - } else if (image->GetFormat() == ImageFormat::SURFACE_TEXTURE || - image->GetFormat() == ImageFormat::EGLIMAGE) { - gfx::IntSize size = image->GetSize(); - - if (image->GetFormat() == ImageFormat::EGLIMAGE) { - EGLImageImage* typedImage = image->AsEGLImageImage(); - texture = EGLImageTextureData::CreateTextureClient( - typedImage, size, GetForwarder()->GetTextureForwarder(), mTextureFlags); -#ifdef MOZ_WIDGET_ANDROID - } else if (image->GetFormat() == ImageFormat::SURFACE_TEXTURE) { - SurfaceTextureImage* typedImage = image->AsSurfaceTextureImage(); - texture = AndroidSurfaceTextureData::CreateTextureClient( - typedImage->GetSurfaceTexture(), size, typedImage->GetOriginPos(), - GetForwarder()->GetTextureForwarder(), mTextureFlags - ); -#endif - } else { - MOZ_ASSERT(false, "Bad ImageFormat."); - } - } else { - RefPtr surface = image->GetAsSourceSurface(); - MOZ_ASSERT(surface); - texture = CreateTextureClientForDrawing(surface->GetFormat(), image->GetSize(), - BackendSelector::Content, mTextureFlags); - if (!texture) { - return false; - } - - MOZ_ASSERT(texture->CanExposeDrawTarget()); - - if (!texture->Lock(OpenMode::OPEN_WRITE_ONLY)) { - return false; - } - - { - // We must not keep a reference to the DrawTarget after it has been unlocked. - DrawTarget* dt = texture->BorrowDrawTarget(); - if (!dt) { - gfxWarning() << "ImageClientSingle::UpdateImage failed in BorrowDrawTarget"; - return false; - } - MOZ_ASSERT(surface.get()); - dt->CopySurface(surface, IntRect(IntPoint(), surface->GetSize()), IntPoint()); - } - - texture->Unlock(); - } + texture = CreateTextureClientForImage(image, GetForwarder()); } if (!texture || !AddTextureClient(texture)) { return false; diff --git a/gfx/layers/client/ImageClient.h b/gfx/layers/client/ImageClient.h index e51a6da2d12c..9c8f2ecb1205 100644 --- a/gfx/layers/client/ImageClient.h +++ b/gfx/layers/client/ImageClient.h @@ -73,6 +73,8 @@ public: virtual ImageClientSingle* AsImageClientSingle() { return nullptr; } + static already_AddRefed CreateTextureClientForImage(Image* aImage, KnowsCompositor* aForwarder); + protected: ImageClient(CompositableForwarder* aFwd, TextureFlags aFlags, CompositableType aType); diff --git a/gfx/layers/ipc/KnowsCompositor.h b/gfx/layers/ipc/KnowsCompositor.h new file mode 100755 index 000000000000..3cd8a227ced0 --- /dev/null +++ b/gfx/layers/ipc/KnowsCompositor.h @@ -0,0 +1,85 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_LAYERS_KNOWSCOMPOSITOR +#define MOZILLA_LAYERS_KNOWSCOMPOSITOR + +#include "mozilla/layers/LayersTypes.h" // for LayersBackend +#include "mozilla/layers/CompositorTypes.h" + +namespace mozilla { +namespace layers { + +class SyncObject; +class TextureForwarder; +class LayersIPCActor; + +/** + * An abstract interface for classes that are tied to a specific Compositor across + * IPDL and uses TextureFactoryIdentifier to describe this Compositor. + */ +class KnowsCompositor { +public: + NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; + NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; + + KnowsCompositor(); + ~KnowsCompositor(); + + void IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier); + + SyncObject* GetSyncObject() { return mSyncObject; } + + int32_t GetMaxTextureSize() const + { + return mTextureFactoryIdentifier.mMaxTextureSize; + } + + /** + * Returns the type of backend that is used off the main thread. + * We only don't allow changing the backend type at runtime so this value can + * be queried once and will not change until Gecko is restarted. + */ + LayersBackend GetCompositorBackendType() const + { + return mTextureFactoryIdentifier.mParentBackend; + } + + bool SupportsTextureBlitting() const + { + return mTextureFactoryIdentifier.mSupportsTextureBlitting; + } + + bool SupportsPartialUploads() const + { + return mTextureFactoryIdentifier.mSupportsPartialUploads; + } + + const TextureFactoryIdentifier& GetTextureFactoryIdentifier() const + { + return mTextureFactoryIdentifier; + } + + int32_t GetSerial() { return mSerial; } + + /** + * Helpers for finding other related interface. These are infallible. + */ + virtual TextureForwarder* GetTextureForwarder() = 0; + virtual LayersIPCActor* GetLayersIPCActor() = 0; + +protected: + TextureFactoryIdentifier mTextureFactoryIdentifier; + RefPtr mSyncObject; + + const int32_t mSerial; + static mozilla::Atomic sSerialCounter; +}; + +} // namespace layers +} // namespace mozilla + +#endif diff --git a/gfx/layers/ipc/ShadowLayers.cpp b/gfx/layers/ipc/ShadowLayers.cpp index 1bdd8de77a1f..9d6cd519c019 100644 --- a/gfx/layers/ipc/ShadowLayers.cpp +++ b/gfx/layers/ipc/ShadowLayers.cpp @@ -174,6 +174,13 @@ KnowsCompositor::IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier mSyncObject = SyncObject::CreateSyncObject(aIdentifier.mSyncHandle); } +KnowsCompositor::KnowsCompositor() + : mSerial(++sSerialCounter) +{} + +KnowsCompositor::~KnowsCompositor() +{} + ShadowLayerForwarder::ShadowLayerForwarder(ClientLayerManager* aClientLayerManager) : mClientLayerManager(aClientLayerManager) , mMessageLoop(MessageLoop::current()) diff --git a/gfx/layers/ipc/TextureForwarder.h b/gfx/layers/ipc/TextureForwarder.h index 582887e45c41..eb42dbafe4fa 100644 --- a/gfx/layers/ipc/TextureForwarder.h +++ b/gfx/layers/ipc/TextureForwarder.h @@ -9,9 +9,9 @@ #include // for int32_t, uint64_t #include "gfxTypes.h" -#include "mozilla/layers/ISurfaceAllocator.h" // for ISurfaceAllocator #include "mozilla/layers/LayersTypes.h" // for LayersBackend #include "mozilla/layers/TextureClient.h" // for TextureClient +#include "mozilla/layers/KnowsCompositor.h" namespace mozilla { namespace layers { @@ -31,8 +31,7 @@ public: * Has their own MessageLoop for message dispatch, and can allocate * shmem. */ -class LayersIPCChannel : public LayersIPCActor - , public ShmemAllocator { +class LayersIPCChannel : public LayersIPCActor { public: NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; @@ -48,6 +47,15 @@ public: virtual FixedSizeSmallShmemSectionAllocator* GetTileLockAllocator() { return nullptr; } virtual void CancelWaitForRecycle(uint64_t aTextureId) = 0; + + virtual bool AllocShmem(size_t aSize, + mozilla::ipc::SharedMemory::SharedMemoryType aShmType, + mozilla::ipc::Shmem* aShmem) = 0; + virtual bool AllocUnsafeShmem(size_t aSize, + mozilla::ipc::SharedMemory::SharedMemoryType aShmType, + mozilla::ipc::Shmem* aShmem) = 0; + virtual void DeallocShmem(mozilla::ipc::Shmem& aShmem) = 0; + protected: virtual ~LayersIPCChannel() {} }; @@ -69,69 +77,6 @@ public: uint64_t aSerial) = 0; }; -/** - * An abstract interface for classes that are tied to a specific Compositor across - * IPDL and uses TextureFactoryIdentifier to describe this Compositor. - */ -class KnowsCompositor { -public: - NS_IMETHOD_(MozExternalRefCountType) AddRef(void) = 0; - NS_IMETHOD_(MozExternalRefCountType) Release(void) = 0; - - KnowsCompositor() - : mSerial(++sSerialCounter) - {} - - void IdentifyTextureHost(const TextureFactoryIdentifier& aIdentifier); - - SyncObject* GetSyncObject() { return mSyncObject; } - - int32_t GetMaxTextureSize() const - { - return mTextureFactoryIdentifier.mMaxTextureSize; - } - - /** - * Returns the type of backend that is used off the main thread. - * We only don't allow changing the backend type at runtime so this value can - * be queried once and will not change until Gecko is restarted. - */ - LayersBackend GetCompositorBackendType() const - { - return mTextureFactoryIdentifier.mParentBackend; - } - - bool SupportsTextureBlitting() const - { - return mTextureFactoryIdentifier.mSupportsTextureBlitting; - } - - bool SupportsPartialUploads() const - { - return mTextureFactoryIdentifier.mSupportsPartialUploads; - } - - const TextureFactoryIdentifier& GetTextureFactoryIdentifier() const - { - return mTextureFactoryIdentifier; - } - - int32_t GetSerial() { return mSerial; } - - /** - * Helpers for finding other related interface. These are infallible. - */ - virtual TextureForwarder* GetTextureForwarder() = 0; - virtual LayersIPCActor* GetLayersIPCActor() = 0; - -protected: - TextureFactoryIdentifier mTextureFactoryIdentifier; - RefPtr mSyncObject; - - const int32_t mSerial; - static mozilla::Atomic sSerialCounter; -}; - } // namespace layers } // namespace mozilla diff --git a/gfx/layers/ipc/VideoBridgeChild.cpp b/gfx/layers/ipc/VideoBridgeChild.cpp index 6b0ac83ad0e8..40d1e930c760 100644 --- a/gfx/layers/ipc/VideoBridgeChild.cpp +++ b/gfx/layers/ipc/VideoBridgeChild.cpp @@ -23,6 +23,7 @@ VideoBridgeChild::Startup() sVideoBridgeChildSingleton->Open(parent->GetIPCChannel(), loop, ipc::ChildSide); + parent->SetOtherProcessId(base::GetCurrentProcId()); } /* static */ void diff --git a/gfx/layers/ipc/VideoBridgeChild.h b/gfx/layers/ipc/VideoBridgeChild.h index 2aaaa8db5c57..cec1ea872fbd 100644 --- a/gfx/layers/ipc/VideoBridgeChild.h +++ b/gfx/layers/ipc/VideoBridgeChild.h @@ -15,14 +15,10 @@ namespace layers { class VideoBridgeChild final : public PVideoBridgeChild , public TextureForwarder - , public KnowsCompositor { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoBridgeChild, override); - TextureForwarder* GetTextureForwarder() override { return this; } - LayersIPCActor* GetLayersIPCActor() override { return this; } - static void Startup(); static void Shutdown(); diff --git a/gfx/layers/moz.build b/gfx/layers/moz.build index 72c533dd115a..091f59b29494 100644 --- a/gfx/layers/moz.build +++ b/gfx/layers/moz.build @@ -176,6 +176,7 @@ EXPORTS.mozilla.layers += [ 'ipc/ImageContainerChild.h', 'ipc/ImageContainerParent.h', 'ipc/ISurfaceAllocator.h', + 'ipc/KnowsCompositor.h', 'ipc/LayerAnimationUtils.h', 'ipc/LayerTransactionChild.h', 'ipc/LayerTransactionParent.h', diff --git a/gfx/thebes/gfxPlatform.cpp b/gfx/thebes/gfxPlatform.cpp index 20cd0a50ae1a..64663748ae3e 100644 --- a/gfx/thebes/gfxPlatform.cpp +++ b/gfx/thebes/gfxPlatform.cpp @@ -14,6 +14,7 @@ #include "mozilla/ClearOnShutdown.h" #include "mozilla/Telemetry.h" #include "mozilla/TimeStamp.h" +#include "mozilla/Unused.h" #include "mozilla/Logging.h" #include "mozilla/Services.h" @@ -279,14 +280,25 @@ CrashStatsLogForwarder::UpdateStringsVector(const std::string& aString) void CrashStatsLogForwarder::UpdateCrashReport() { std::stringstream message; - if (XRE_IsParentProcess()) { - for(LoggingRecord::iterator it = mBuffer.begin(); it != mBuffer.end(); ++it) { - message << "|[" << Get<0>(*it) << "]" << Get<1>(*it) << " (t=" << Get<2>(*it) << ") "; - } - } else { - for(LoggingRecord::iterator it = mBuffer.begin(); it != mBuffer.end(); ++it) { - message << "|[C" << Get<0>(*it) << "]" << Get<1>(*it) << " (t=" << Get<2>(*it) << ") "; - } + std::string logAnnotation; + + switch (XRE_GetProcessType()) { + case GeckoProcessType_Default: + logAnnotation = "|["; + break; + case GeckoProcessType_Content: + logAnnotation = "|[C"; + break; + case GeckoProcessType_GPU: + logAnnotation = "|[G"; + break; + default: + logAnnotation = "|[X"; + break; + } + + for (LoggingRecord::iterator it = mBuffer.begin(); it != mBuffer.end(); ++it) { + message << logAnnotation << Get<0>(*it) << "]" << Get<1>(*it) << " (t=" << Get<2>(*it) << ") "; } #ifdef MOZ_CRASHREPORTER @@ -310,9 +322,16 @@ class LogForwarderEvent : public Runnable explicit LogForwarderEvent(const nsCString& aMessage) : mMessage(aMessage) {} NS_IMETHOD Run() override { - MOZ_ASSERT(NS_IsMainThread() && XRE_IsContentProcess()); - dom::ContentChild* cc = dom::ContentChild::GetSingleton(); - cc->SendGraphicsError(mMessage); + MOZ_ASSERT(NS_IsMainThread() && (XRE_IsContentProcess() || XRE_IsGPUProcess())); + + if (XRE_IsContentProcess()) { + dom::ContentChild* cc = dom::ContentChild::GetSingleton(); + Unused << cc->SendGraphicsError(mMessage); + } else if (XRE_IsGPUProcess()) { + GPUParent* gp = GPUParent::GetSingleton(); + Unused << gp->SendGraphicsError(mMessage); + } + return NS_OK; } @@ -334,8 +353,13 @@ void CrashStatsLogForwarder::Log(const std::string& aString) if (!XRE_IsParentProcess()) { nsCString stringToSend(aString.c_str()); if (NS_IsMainThread()) { - dom::ContentChild* cc = dom::ContentChild::GetSingleton(); - cc->SendGraphicsError(stringToSend); + if (XRE_IsContentProcess()) { + dom::ContentChild* cc = dom::ContentChild::GetSingleton(); + Unused << cc->SendGraphicsError(stringToSend); + } else if (XRE_IsGPUProcess()) { + GPUParent* gp = GPUParent::GetSingleton(); + Unused << gp->SendGraphicsError(stringToSend); + } } else { nsCOMPtr r1 = new LogForwarderEvent(stringToSend); NS_DispatchToMainThread(r1); @@ -600,9 +624,6 @@ gfxPlatform::Init() GPUProcessManager::Initialize(); } - auto fwd = new CrashStatsLogForwarder("GraphicsCriticalError"); - fwd->SetCircularBufferSize(gfxPrefs::GfxLoggingCrashLength()); - // Drop a note in the crash report if we end up forcing an option that could // destabilize things. New items should be appended at the end (of an existing // or in a new section), so that we don't have to know the version to interpret @@ -638,12 +659,7 @@ gfxPlatform::Init() ScopedGfxFeatureReporter::AppNote(forcedPrefs); } - mozilla::gfx::Config cfg; - cfg.mLogForwarder = fwd; - cfg.mMaxTextureSize = gfxPrefs::MaxTextureSize(); - cfg.mMaxAllocSize = gfxPrefs::MaxAllocSize(); - - gfx::Factory::Init(cfg); + InitMoz2DLogging(); gGfxPlatformPrefsLock = new Mutex("gfxPlatform::gGfxPlatformPrefsLock"); @@ -781,6 +797,20 @@ gfxPlatform::Init() } } +/* static */ void +gfxPlatform::InitMoz2DLogging() +{ + auto fwd = new CrashStatsLogForwarder("GraphicsCriticalError"); + fwd->SetCircularBufferSize(gfxPrefs::GfxLoggingCrashLength()); + + mozilla::gfx::Config cfg; + cfg.mLogForwarder = fwd; + cfg.mMaxTextureSize = gfxPrefs::MaxTextureSize(); + cfg.mMaxAllocSize = gfxPrefs::MaxAllocSize(); + + gfx::Factory::Init(cfg); +} + static bool sLayersIPCIsUp = false; /* static */ void diff --git a/gfx/thebes/gfxPlatform.h b/gfx/thebes/gfxPlatform.h index de923ceaa984..00fd388844da 100644 --- a/gfx/thebes/gfxPlatform.h +++ b/gfx/thebes/gfxPlatform.h @@ -181,6 +181,8 @@ public: */ static void InitNullMetadata(); + static void InitMoz2DLogging(); + /** * Create an offscreen surface of the given dimensions * and image format. diff --git a/intl/tzdata/2015f/be/metaZones.res b/intl/tzdata/2015f/be/metaZones.res new file mode 100644 index 000000000000..bddca6e6d1c4 Binary files /dev/null and b/intl/tzdata/2015f/be/metaZones.res differ diff --git a/intl/tzdata/2015f/be/timezoneTypes.res b/intl/tzdata/2015f/be/timezoneTypes.res new file mode 100644 index 000000000000..a4fbbe9ad995 Binary files /dev/null and b/intl/tzdata/2015f/be/timezoneTypes.res differ diff --git a/intl/tzdata/2015f/be/windowsZones.res b/intl/tzdata/2015f/be/windowsZones.res new file mode 100644 index 000000000000..98d5abc37c52 Binary files /dev/null and b/intl/tzdata/2015f/be/windowsZones.res differ diff --git a/intl/tzdata/2015f/be/zoneinfo64.res b/intl/tzdata/2015f/be/zoneinfo64.res new file mode 100644 index 000000000000..c7335e17bfe7 Binary files /dev/null and b/intl/tzdata/2015f/be/zoneinfo64.res differ diff --git a/intl/tzdata/2015f/ee/metaZones.res b/intl/tzdata/2015f/ee/metaZones.res new file mode 100644 index 000000000000..b1352086a6e1 Binary files /dev/null and b/intl/tzdata/2015f/ee/metaZones.res differ diff --git a/intl/tzdata/2015f/ee/timezoneTypes.res b/intl/tzdata/2015f/ee/timezoneTypes.res new file mode 100644 index 000000000000..a0f298686312 Binary files /dev/null and b/intl/tzdata/2015f/ee/timezoneTypes.res differ diff --git a/intl/tzdata/2015f/ee/windowsZones.res b/intl/tzdata/2015f/ee/windowsZones.res new file mode 100644 index 000000000000..2e4c6fd2a614 Binary files /dev/null and b/intl/tzdata/2015f/ee/windowsZones.res differ diff --git a/intl/tzdata/2015f/ee/zoneinfo64.res b/intl/tzdata/2015f/ee/zoneinfo64.res new file mode 100644 index 000000000000..4544a9669c6e Binary files /dev/null and b/intl/tzdata/2015f/ee/zoneinfo64.res differ diff --git a/intl/tzdata/2015f/le/metaZones.res b/intl/tzdata/2015f/le/metaZones.res new file mode 100644 index 000000000000..b3ba3c2a4a96 Binary files /dev/null and b/intl/tzdata/2015f/le/metaZones.res differ diff --git a/intl/tzdata/2015f/le/timezoneTypes.res b/intl/tzdata/2015f/le/timezoneTypes.res new file mode 100644 index 000000000000..66aec63c4f68 Binary files /dev/null and b/intl/tzdata/2015f/le/timezoneTypes.res differ diff --git a/intl/tzdata/2015f/le/windowsZones.res b/intl/tzdata/2015f/le/windowsZones.res new file mode 100644 index 000000000000..010e3ba60c3e Binary files /dev/null and b/intl/tzdata/2015f/le/windowsZones.res differ diff --git a/intl/tzdata/2015f/le/zoneinfo64.res b/intl/tzdata/2015f/le/zoneinfo64.res new file mode 100644 index 000000000000..233cb9f0bf07 Binary files /dev/null and b/intl/tzdata/2015f/le/zoneinfo64.res differ diff --git a/intl/tzdata/2015f/metaZones.txt b/intl/tzdata/2015f/metaZones.txt new file mode 100644 index 000000000000..4a458d14ff69 --- /dev/null +++ b/intl/tzdata/2015f/metaZones.txt @@ -0,0 +1,4240 @@ +// *************************************************************************** +// * +// * Copyright (C) 2015 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter +// * Source File: /metaZones.xml +// * +// *************************************************************************** +metaZones:table(nofallback){ + mapTimezones{ + Acre{ + 001{"America/Rio_Branco"} + } + Afghanistan{ + 001{"Asia/Kabul"} + } + Africa_Central{ + 001{"Africa/Maputo"} + BI{"Africa/Bujumbura"} + BW{"Africa/Gaborone"} + CD{"Africa/Lubumbashi"} + MW{"Africa/Blantyre"} + RW{"Africa/Kigali"} + ZM{"Africa/Lusaka"} + ZW{"Africa/Harare"} + } + Africa_Eastern{ + 001{"Africa/Nairobi"} + DJ{"Africa/Djibouti"} + ER{"Africa/Asmera"} + ET{"Africa/Addis_Ababa"} + KM{"Indian/Comoro"} + MG{"Indian/Antananarivo"} + SO{"Africa/Mogadishu"} + TZ{"Africa/Dar_es_Salaam"} + UG{"Africa/Kampala"} + YT{"Indian/Mayotte"} + } + Africa_FarWestern{ + 001{"Africa/El_Aaiun"} + } + Africa_Southern{ + 001{"Africa/Johannesburg"} + LS{"Africa/Maseru"} + SZ{"Africa/Mbabane"} + } + Africa_Western{ + 001{"Africa/Lagos"} + AO{"Africa/Luanda"} + BJ{"Africa/Porto-Novo"} + CD{"Africa/Kinshasa"} + CF{"Africa/Bangui"} + CG{"Africa/Brazzaville"} + CM{"Africa/Douala"} + GA{"Africa/Libreville"} + GQ{"Africa/Malabo"} + NE{"Africa/Niamey"} + TD{"Africa/Ndjamena"} + } + Aktyubinsk{ + 001{"Asia/Aqtobe"} + } + Alaska{ + 001{"America/Juneau"} + } + Alaska_Hawaii{ + 001{"America/Anchorage"} + } + Almaty{ + 001{"Asia/Almaty"} + } + Amazon{ + 001{"America/Manaus"} + } + America_Central{ + 001{"America/Chicago"} + BZ{"America/Belize"} + CA{"America/Winnipeg"} + CR{"America/Costa_Rica"} + GT{"America/Guatemala"} + HN{"America/Tegucigalpa"} + MX{"America/Mexico_City"} + SV{"America/El_Salvador"} + } + America_Eastern{ + 001{"America/New_York"} + BS{"America/Nassau"} + CA{"America/Toronto"} + HT{"America/Port-au-Prince"} + JM{"America/Jamaica"} + KY{"America/Cayman"} + PA{"America/Panama"} + } + America_Mountain{ + 001{"America/Denver"} + CA{"America/Edmonton"} + MX{"America/Hermosillo"} + } + America_Pacific{ + 001{"America/Los_Angeles"} + CA{"America/Vancouver"} + MX{"America/Tijuana"} + } + Anadyr{ + 001{"Asia/Anadyr"} + } + Apia{ + 001{"Pacific/Apia"} + } + Aqtau{ + 001{"Asia/Aqtau"} + } + Aqtobe{ + 001{"Asia/Aqtobe"} + } + Arabian{ + 001{"Asia/Riyadh"} + BH{"Asia/Bahrain"} + IQ{"Asia/Baghdad"} + KW{"Asia/Kuwait"} + QA{"Asia/Qatar"} + YE{"Asia/Aden"} + } + Argentina{ + 001{"America/Buenos_Aires"} + } + Argentina_Western{ + 001{"America/Argentina/San_Luis"} + } + Armenia{ + 001{"Asia/Yerevan"} + } + Ashkhabad{ + 001{"Asia/Ashgabat"} + } + Atlantic{ + 001{"America/Halifax"} + AG{"America/Antigua"} + AI{"America/Anguilla"} + AN{"America/Curacao"} + AW{"America/Aruba"} + BB{"America/Barbados"} + BM{"Atlantic/Bermuda"} + BQ{"America/Kralendijk"} + DM{"America/Dominica"} + GD{"America/Grenada"} + GL{"America/Thule"} + GP{"America/Guadeloupe"} + KN{"America/St_Kitts"} + LC{"America/St_Lucia"} + MF{"America/Marigot"} + MQ{"America/Martinique"} + MS{"America/Montserrat"} + PR{"America/Puerto_Rico"} + SX{"America/Lower_Princes"} + TT{"America/Port_of_Spain"} + VC{"America/St_Vincent"} + VG{"America/Tortola"} + VI{"America/St_Thomas"} + } + Australia_Central{ + 001{"Australia/Adelaide"} + } + Australia_CentralWestern{ + 001{"Australia/Eucla"} + } + Australia_Eastern{ + 001{"Australia/Sydney"} + } + Australia_Western{ + 001{"Australia/Perth"} + } + Azerbaijan{ + 001{"Asia/Baku"} + } + Azores{ + 001{"Atlantic/Azores"} + } + Baku{ + 001{"Asia/Baku"} + } + Bangladesh{ + 001{"Asia/Dhaka"} + } + Bering{ + 001{"America/Adak"} + } + Bhutan{ + 001{"Asia/Thimphu"} + } + Bolivia{ + 001{"America/La_Paz"} + } + Borneo{ + 001{"Asia/Kuching"} + } + Brasilia{ + 001{"America/Sao_Paulo"} + } + British{ + 001{"Europe/London"} + } + Brunei{ + 001{"Asia/Brunei"} + } + Cape_Verde{ + 001{"Atlantic/Cape_Verde"} + } + Casey{ + 001{"Antarctica/Casey"} + } + Chamorro{ + 001{"Pacific/Saipan"} + GU{"Pacific/Guam"} + } + Chatham{ + 001{"Pacific/Chatham"} + } + Chile{ + 001{"America/Santiago"} + AQ{"Antarctica/Palmer"} + } + China{ + 001{"Asia/Shanghai"} + } + Choibalsan{ + 001{"Asia/Choibalsan"} + } + Christmas{ + 001{"Indian/Christmas"} + } + Cocos{ + 001{"Indian/Cocos"} + } + Colombia{ + 001{"America/Bogota"} + } + Cook{ + 001{"Pacific/Rarotonga"} + } + Cuba{ + 001{"America/Havana"} + } + Dacca{ + 001{"Asia/Dhaka"} + } + Davis{ + 001{"Antarctica/Davis"} + } + Dominican{ + 001{"America/Santo_Domingo"} + } + DumontDUrville{ + 001{"Antarctica/DumontDUrville"} + } + Dushanbe{ + 001{"Asia/Dushanbe"} + } + Dutch_Guiana{ + 001{"America/Paramaribo"} + } + East_Timor{ + 001{"Asia/Dili"} + } + Easter{ + 001{"Pacific/Easter"} + } + Ecuador{ + 001{"America/Guayaquil"} + } + Europe_Central{ + 001{"Europe/Paris"} + AD{"Europe/Andorra"} + AL{"Europe/Tirane"} + AT{"Europe/Vienna"} + BA{"Europe/Sarajevo"} + BE{"Europe/Brussels"} + CH{"Europe/Zurich"} + CZ{"Europe/Prague"} + DE{"Europe/Berlin"} + DK{"Europe/Copenhagen"} + ES{"Europe/Madrid"} + GI{"Europe/Gibraltar"} + HR{"Europe/Zagreb"} + HU{"Europe/Budapest"} + IT{"Europe/Rome"} + LI{"Europe/Vaduz"} + LU{"Europe/Luxembourg"} + MC{"Europe/Monaco"} + ME{"Europe/Podgorica"} + MK{"Europe/Skopje"} + MT{"Europe/Malta"} + NL{"Europe/Amsterdam"} + NO{"Europe/Oslo"} + PL{"Europe/Warsaw"} + RS{"Europe/Belgrade"} + SE{"Europe/Stockholm"} + SI{"Europe/Ljubljana"} + SK{"Europe/Bratislava"} + SM{"Europe/San_Marino"} + TN{"Africa/Tunis"} + VA{"Europe/Vatican"} + XK{"Europe/Belgrade"} + } + Europe_Eastern{ + 001{"Europe/Bucharest"} + AX{"Europe/Mariehamn"} + BG{"Europe/Sofia"} + CY{"Asia/Nicosia"} + EG{"Africa/Cairo"} + FI{"Europe/Helsinki"} + GR{"Europe/Athens"} + JO{"Asia/Amman"} + LB{"Asia/Beirut"} + SY{"Asia/Damascus"} + } + Europe_Further_Eastern{ + 001{"Europe/Minsk"} + RU{"Europe/Kaliningrad"} + } + Europe_Western{ + 001{"Atlantic/Canary"} + FO{"Atlantic/Faeroe"} + } + Falkland{ + 001{"Atlantic/Stanley"} + } + Fiji{ + 001{"Pacific/Fiji"} + } + French_Guiana{ + 001{"America/Cayenne"} + } + French_Southern{ + 001{"Indian/Kerguelen"} + } + Frunze{ + 001{"Asia/Bishkek"} + } + GMT{ + 001{"Atlantic/Reykjavik"} + BF{"Africa/Ouagadougou"} + CI{"Africa/Abidjan"} + GB{"Europe/London"} + GH{"Africa/Accra"} + GM{"Africa/Banjul"} + GN{"Africa/Conakry"} + IE{"Europe/Dublin"} + ML{"Africa/Bamako"} + MR{"Africa/Nouakchott"} + SH{"Atlantic/St_Helena"} + SL{"Africa/Freetown"} + SN{"Africa/Dakar"} + ST{"Africa/Sao_Tome"} + TG{"Africa/Lome"} + } + Galapagos{ + 001{"Pacific/Galapagos"} + } + Gambier{ + 001{"Pacific/Gambier"} + } + Georgia{ + 001{"Asia/Tbilisi"} + } + Gilbert_Islands{ + 001{"Pacific/Tarawa"} + } + Goose_Bay{ + 001{"America/Goose_Bay"} + } + Greenland_Central{ + 001{"America/Scoresbysund"} + } + Greenland_Eastern{ + 001{"America/Scoresbysund"} + } + Greenland_Western{ + 001{"America/Godthab"} + } + Guam{ + 001{"Pacific/Guam"} + } + Gulf{ + 001{"Asia/Dubai"} + OM{"Asia/Muscat"} + } + Guyana{ + 001{"America/Guyana"} + } + Hawaii_Aleutian{ + 001{"Pacific/Honolulu"} + } + Hong_Kong{ + 001{"Asia/Hong_Kong"} + } + Hovd{ + 001{"Asia/Hovd"} + } + India{ + 001{"Asia/Calcutta"} + LK{"Asia/Colombo"} + } + Indian_Ocean{ + 001{"Indian/Chagos"} + } + Indochina{ + 001{"Asia/Bangkok"} + KH{"Asia/Phnom_Penh"} + LA{"Asia/Vientiane"} + } + Indonesia_Central{ + 001{"Asia/Makassar"} + } + Indonesia_Eastern{ + 001{"Asia/Jayapura"} + } + Indonesia_Western{ + 001{"Asia/Jakarta"} + } + Iran{ + 001{"Asia/Tehran"} + } + Irish{ + 001{"Europe/Dublin"} + } + Irkutsk{ + 001{"Asia/Irkutsk"} + } + Israel{ + 001{"Asia/Jerusalem"} + } + Japan{ + 001{"Asia/Tokyo"} + } + Kamchatka{ + 001{"Asia/Kamchatka"} + } + Karachi{ + 001{"Asia/Karachi"} + } + Kazakhstan_Eastern{ + 001{"Asia/Almaty"} + } + Kazakhstan_Western{ + 001{"Asia/Aqtobe"} + } + Kizilorda{ + 001{"Asia/Qyzylorda"} + } + Korea{ + 001{"Asia/Seoul"} + KP{"Asia/Pyongyang"} + } + Kosrae{ + 001{"Pacific/Kosrae"} + } + Krasnoyarsk{ + 001{"Asia/Krasnoyarsk"} + } + Kuybyshev{ + 001{"Europe/Samara"} + } + Kwajalein{ + 001{"Pacific/Kwajalein"} + } + Kyrgystan{ + 001{"Asia/Bishkek"} + } + Lanka{ + 001{"Asia/Colombo"} + } + Liberia{ + 001{"Africa/Monrovia"} + } + Line_Islands{ + 001{"Pacific/Kiritimati"} + } + Lord_Howe{ + 001{"Australia/Lord_Howe"} + } + Macau{ + 001{"Asia/Macau"} + } + Macquarie{ + 001{"Antarctica/Macquarie"} + } + Magadan{ + 001{"Asia/Magadan"} + } + Malaya{ + 001{"Asia/Kuala_Lumpur"} + } + Malaysia{ + 001{"Asia/Kuching"} + } + Maldives{ + 001{"Indian/Maldives"} + } + Marquesas{ + 001{"Pacific/Marquesas"} + } + Marshall_Islands{ + 001{"Pacific/Majuro"} + } + Mauritius{ + 001{"Indian/Mauritius"} + } + Mawson{ + 001{"Antarctica/Mawson"} + } + Mexico_Northwest{ + 001{"America/Santa_Isabel"} + } + Mexico_Pacific{ + 001{"America/Mazatlan"} + } + Mongolia{ + 001{"Asia/Ulaanbaatar"} + } + Moscow{ + 001{"Europe/Moscow"} + } + Myanmar{ + 001{"Asia/Rangoon"} + } + Nauru{ + 001{"Pacific/Nauru"} + } + Nepal{ + 001{"Asia/Katmandu"} + } + New_Caledonia{ + 001{"Pacific/Noumea"} + } + New_Zealand{ + 001{"Pacific/Auckland"} + AQ{"Antarctica/McMurdo"} + } + Newfoundland{ + 001{"America/St_Johns"} + } + Niue{ + 001{"Pacific/Niue"} + } + Norfolk{ + 001{"Pacific/Norfolk"} + } + Noronha{ + 001{"America/Noronha"} + } + North_Mariana{ + 001{"Pacific/Saipan"} + } + Novosibirsk{ + 001{"Asia/Novosibirsk"} + } + Omsk{ + 001{"Asia/Omsk"} + } + Oral{ + 001{"Asia/Oral"} + } + Pakistan{ + 001{"Asia/Karachi"} + } + Palau{ + 001{"Pacific/Palau"} + } + Papua_New_Guinea{ + 001{"Pacific/Port_Moresby"} + } + Paraguay{ + 001{"America/Asuncion"} + } + Peru{ + 001{"America/Lima"} + } + Philippines{ + 001{"Asia/Manila"} + } + Phoenix_Islands{ + 001{"Pacific/Enderbury"} + } + Pierre_Miquelon{ + 001{"America/Miquelon"} + } + Pitcairn{ + 001{"Pacific/Pitcairn"} + } + Ponape{ + 001{"Pacific/Ponape"} + } + Qyzylorda{ + 001{"Asia/Qyzylorda"} + } + Reunion{ + 001{"Indian/Reunion"} + } + Rothera{ + 001{"Antarctica/Rothera"} + } + Sakhalin{ + 001{"Asia/Sakhalin"} + } + Samara{ + 001{"Europe/Samara"} + } + Samarkand{ + 001{"Asia/Samarkand"} + } + Samoa{ + 001{"Pacific/Pago_Pago"} + } + Seychelles{ + 001{"Indian/Mahe"} + } + Shevchenko{ + 001{"Asia/Aqtau"} + } + Singapore{ + 001{"Asia/Singapore"} + } + Solomon{ + 001{"Pacific/Guadalcanal"} + } + South_Georgia{ + 001{"Atlantic/South_Georgia"} + } + Suriname{ + 001{"America/Paramaribo"} + } + Sverdlovsk{ + 001{"Asia/Yekaterinburg"} + } + Syowa{ + 001{"Antarctica/Syowa"} + } + Tahiti{ + 001{"Pacific/Tahiti"} + } + Taipei{ + 001{"Asia/Taipei"} + } + Tajikistan{ + 001{"Asia/Dushanbe"} + } + Tashkent{ + 001{"Asia/Tashkent"} + } + Tbilisi{ + 001{"Asia/Tbilisi"} + } + Tokelau{ + 001{"Pacific/Fakaofo"} + } + Tonga{ + 001{"Pacific/Tongatapu"} + } + Truk{ + 001{"Pacific/Truk"} + } + Turkey{ + 001{"Europe/Istanbul"} + } + Turkmenistan{ + 001{"Asia/Ashgabat"} + } + Tuvalu{ + 001{"Pacific/Funafuti"} + } + Uralsk{ + 001{"Asia/Oral"} + } + Uruguay{ + 001{"America/Montevideo"} + } + Urumqi{ + 001{"Asia/Urumqi"} + } + Uzbekistan{ + 001{"Asia/Tashkent"} + } + Vanuatu{ + 001{"Pacific/Efate"} + } + Venezuela{ + 001{"America/Caracas"} + } + Vladivostok{ + 001{"Asia/Vladivostok"} + } + Volgograd{ + 001{"Europe/Volgograd"} + } + Vostok{ + 001{"Antarctica/Vostok"} + } + Wake{ + 001{"Pacific/Wake"} + } + Wallis{ + 001{"Pacific/Wallis"} + } + Yakutsk{ + 001{"Asia/Yakutsk"} + } + Yekaterinburg{ + 001{"Asia/Yekaterinburg"} + } + Yerevan{ + 001{"Asia/Yerevan"} + } + Yukon{ + 001{"America/Yakutat"} + } + } + metazoneInfo{ + "Africa:Abidjan"{ + { + "GMT", + } + } + "Africa:Accra"{ + { + "GMT", + } + } + "Africa:Addis_Ababa"{ + { + "Africa_Eastern", + } + } + "Africa:Algiers"{ + { + "Europe_Western", + "1970-01-01 00:00", + "1977-10-20 23:00", + } + { + "Europe_Central", + "1977-10-20 23:00", + "1979-10-25 23:00", + } + { + "Europe_Western", + "1979-10-25 23:00", + "1981-05-01 00:00", + } + { + "Europe_Central", + "1981-05-01 00:00", + "9999-12-31 23:59", + } + } + "Africa:Asmera"{ + { + "Africa_Eastern", + } + } + "Africa:Bamako"{ + { + "GMT", + } + } + "Africa:Bangui"{ + { + "Africa_Western", + } + } + "Africa:Banjul"{ + { + "GMT", + } + } + "Africa:Bissau"{ + { + "Africa_FarWestern", + "1970-01-01 00:00", + "1975-01-01 01:00", + } + { + "GMT", + "1975-01-01 01:00", + "9999-12-31 23:59", + } + } + "Africa:Blantyre"{ + { + "Africa_Central", + } + } + "Africa:Brazzaville"{ + { + "Africa_Western", + } + } + "Africa:Bujumbura"{ + { + "Africa_Central", + } + } + "Africa:Cairo"{ + { + "Europe_Eastern", + } + } + "Africa:Casablanca"{ + { + "Europe_Western", + "1970-01-01 00:00", + "1984-03-16 00:00", + } + { + "Europe_Central", + "1984-03-16 00:00", + "1985-12-31 23:00", + } + { + "Europe_Western", + "1985-12-31 23:00", + "9999-12-31 23:59", + } + } + "Africa:Ceuta"{ + { + "Europe_Western", + "1970-01-01 00:00", + "1984-03-16 00:00", + } + { + "Europe_Central", + "1984-03-16 00:00", + "9999-12-31 23:59", + } + } + "Africa:Conakry"{ + { + "GMT", + } + } + "Africa:Dakar"{ + { + "GMT", + } + } + "Africa:Dar_es_Salaam"{ + { + "Africa_Eastern", + } + } + "Africa:Djibouti"{ + { + "Africa_Eastern", + } + } + "Africa:Douala"{ + { + "Africa_Western", + } + } + "Africa:El_Aaiun"{ + { + "Africa_FarWestern", + "1970-01-01 00:00", + "1976-04-14 01:00", + } + { + "Europe_Western", + "1976-04-14 01:00", + "9999-12-31 23:59", + } + } + "Africa:Freetown"{ + { + "GMT", + } + } + "Africa:Gaborone"{ + { + "Africa_Central", + } + } + "Africa:Harare"{ + { + "Africa_Central", + } + } + "Africa:Johannesburg"{ + { + "Africa_Southern", + } + } + "Africa:Juba"{ + { + "Africa_Central", + "1970-01-01 00:00", + "2000-01-15 10:00", + } + { + "Africa_Eastern", + "2000-01-15 10:00", + "9999-12-31 23:59", + } + } + "Africa:Kampala"{ + { + "Africa_Eastern", + } + } + "Africa:Khartoum"{ + { + "Africa_Central", + "1970-01-01 00:00", + "2000-01-15 10:00", + } + { + "Africa_Eastern", + "2000-01-15 10:00", + "9999-12-31 23:59", + } + } + "Africa:Kigali"{ + { + "Africa_Central", + } + } + "Africa:Kinshasa"{ + { + "Africa_Western", + } + } + "Africa:Lagos"{ + { + "Africa_Western", + } + } + "Africa:Libreville"{ + { + "Africa_Western", + } + } + "Africa:Lome"{ + { + "GMT", + } + } + "Africa:Luanda"{ + { + "Africa_Western", + } + } + "Africa:Lubumbashi"{ + { + "Africa_Central", + } + } + "Africa:Lusaka"{ + { + "Africa_Central", + } + } + "Africa:Malabo"{ + { + "Africa_Western", + } + } + "Africa:Maputo"{ + { + "Africa_Central", + } + } + "Africa:Maseru"{ + { + "Africa_Southern", + } + } + "Africa:Mbabane"{ + { + "Africa_Southern", + } + } + "Africa:Mogadishu"{ + { + "Africa_Eastern", + } + } + "Africa:Monrovia"{ + { + "Liberia", + "1970-01-01 00:00", + "1972-05-01 00:45", + } + { + "GMT", + "1972-05-01 00:45", + "9999-12-31 23:59", + } + } + "Africa:Nairobi"{ + { + "Africa_Eastern", + } + } + "Africa:Ndjamena"{ + { + "Africa_Western", + } + } + "Africa:Niamey"{ + { + "Africa_Western", + } + } + "Africa:Nouakchott"{ + { + "GMT", + } + } + "Africa:Ouagadougou"{ + { + "GMT", + } + } + "Africa:Porto-Novo"{ + { + "Africa_Western", + } + } + "Africa:Sao_Tome"{ + { + "GMT", + } + } + "Africa:Tripoli"{ + { + "Europe_Eastern", + "1970-01-01 00:00", + "1981-12-31 22:00", + } + { + "Europe_Central", + "1981-12-31 22:00", + "1990-05-03 23:00", + } + { + "Europe_Eastern", + "1990-05-03 23:00", + "1996-09-29 22:00", + } + { + "Europe_Central", + "1996-09-29 22:00", + "1997-10-03 22:00", + } + { + "Europe_Eastern", + "1997-10-03 22:00", + "2012-11-10 00:00", + } + { + "Europe_Central", + "2012-11-10 00:00", + "2013-10-25 00:00", + } + { + "Europe_Eastern", + "2013-10-25 00:00", + "9999-12-31 23:59", + } + } + "Africa:Tunis"{ + { + "Europe_Central", + } + } + "Africa:Windhoek"{ + { + "Africa_Southern", + "1970-01-01 00:00", + "1990-03-20 22:00", + } + { + "Africa_Central", + "1990-03-20 22:00", + "1994-04-02 22:00", + } + { + "Africa_Western", + "1994-04-02 22:00", + "9999-12-31 23:59", + } + } + "America:Adak"{ + { + "Bering", + "1970-01-01 00:00", + "1983-10-30 12:00", + } + { + "Hawaii_Aleutian", + "1983-11-30 10:00", + "9999-12-31 23:59", + } + } + "America:Anchorage"{ + { + "Alaska_Hawaii", + "1970-01-01 00:00", + "1983-10-30 11:00", + } + { + "Yukon", + "1983-10-30 11:00", + "1983-11-30 09:00", + } + { + "Alaska", + "1983-11-30 09:00", + "9999-12-31 23:59", + } + } + "America:Anguilla"{ + { + "Atlantic", + } + } + "America:Antigua"{ + { + "Atlantic", + } + } + "America:Araguaina"{ + { + "Brasilia", + } + } + "America:Argentina:La_Rioja"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-01 02:00", + } + { + "Argentina_Western", + "1991-03-01 02:00", + "1991-05-07 04:00", + } + { + "Argentina", + "1991-05-07 04:00", + "2004-06-01 03:00", + } + { + "Argentina_Western", + "2004-06-01 03:00", + "2004-06-20 04:00", + } + { + "Argentina", + "2004-06-20 04:00", + "9999-12-31 23:59", + } + } + "America:Argentina:Rio_Gallegos"{ + { + "Argentina", + "1970-01-01 00:00", + "2004-06-01 03:00", + } + { + "Argentina_Western", + "2004-06-01 03:00", + "2004-06-20 04:00", + } + { + "Argentina", + "2004-06-20 04:00", + "9999-12-31 23:59", + } + } + "America:Argentina:Salta"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-03 02:00", + } + { + "Argentina", + "1991-10-20 04:00", + "9999-12-31 23:59", + } + } + "America:Argentina:San_Juan"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-01 02:00", + } + { + "Argentina_Western", + "1991-03-01 02:00", + "1991-05-07 04:00", + } + { + "Argentina", + "1991-05-07 04:00", + "2004-05-31 03:00", + } + { + "Argentina_Western", + "2004-05-31 03:00", + "2004-07-25 04:00", + } + { + "Argentina", + "2004-07-25 04:00", + "9999-12-31 23:59", + } + } + "America:Argentina:San_Luis"{ + { + "Argentina", + "1970-01-01 00:00", + "1990-03-14 02:00", + } + { + "Argentina_Western", + "1990-03-14 02:00", + "1991-06-01 04:00", + } + { + "Argentina", + "1991-06-01 04:00", + "1999-10-03 03:00", + } + { + "Argentina_Western", + "1999-10-03 03:00", + "2000-03-03 03:00", + } + { + "Argentina", + "2000-03-03 03:00", + "2004-05-31 03:00", + } + { + "Argentina_Western", + "2004-05-31 03:00", + "2004-07-25 04:00", + } + { + "Argentina", + "2004-07-25 04:00", + "2008-01-21 02:00", + } + { + "Argentina_Western", + "2008-01-21 02:00", + "9999-12-31 23:59", + } + } + "America:Argentina:Tucuman"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-03 02:00", + } + { + "Argentina", + "1991-10-20 04:00", + "2004-06-01 03:00", + } + { + "Argentina_Western", + "2004-06-01 03:00", + "2004-06-13 04:00", + } + { + "Argentina", + "2004-06-13 04:00", + "9999-12-31 23:59", + } + } + "America:Argentina:Ushuaia"{ + { + "Argentina", + "1970-01-01 00:00", + "2004-05-30 03:00", + } + { + "Argentina", + "2004-06-20 04:00", + "9999-12-31 23:59", + } + } + "America:Aruba"{ + { + "Atlantic", + } + } + "America:Asuncion"{ + { + "Paraguay", + } + } + "America:Bahia"{ + { + "Brasilia", + } + } + "America:Bahia_Banderas"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1970-01-01 08:00", + } + { + "America_Mountain", + "1970-01-01 08:00", + "2010-04-04 09:00", + } + { + "America_Central", + "2010-04-04 09:00", + "9999-12-31 23:59", + } + } + "America:Barbados"{ + { + "Atlantic", + } + } + "America:Belem"{ + { + "Brasilia", + } + } + "America:Belize"{ + { + "America_Central", + } + } + "America:Blanc-Sablon"{ + { + "Atlantic", + } + } + "America:Boa_Vista"{ + { + "Amazon", + } + } + "America:Bogota"{ + { + "Colombia", + } + } + "America:Boise"{ + { + "America_Mountain", + } + } + "America:Buenos_Aires"{ + { + "Argentina", + } + } + "America:Cambridge_Bay"{ + { + "America_Mountain", + "1970-01-01 00:00", + "1999-10-31 08:00", + } + { + "America_Central", + "1999-10-31 08:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "2000-11-05 05:00", + } + { + "America_Central", + "2000-11-05 05:00", + "2001-04-01 09:00", + } + { + "America_Mountain", + "2001-04-01 09:00", + "9999-12-31 23:59", + } + } + "America:Campo_Grande"{ + { + "Amazon", + } + } + "America:Cancun"{ + { + "America_Central", + "1970-01-01 00:00", + "1981-12-23 06:00", + } + { + "America_Eastern", + "1981-12-23 06:00", + "1998-08-02 06:00", + } + { + "America_Central", + "1998-08-02 06:00", + "2015-02-01 08:00", + } + { + "America_Eastern", + "2015-02-01 08:00", + "9999-12-31 23:59", + } + } + "America:Caracas"{ + { + "Venezuela", + } + } + "America:Catamarca"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-03 02:00", + } + { + "Argentina", + "1991-10-20 04:00", + "2004-06-01 03:00", + } + { + "Argentina_Western", + "2004-06-01 03:00", + "2004-06-20 04:00", + } + { + "Argentina", + "2004-06-20 04:00", + "9999-12-31 23:59", + } + } + "America:Cayenne"{ + { + "French_Guiana", + } + } + "America:Cayman"{ + { + "America_Eastern", + } + } + "America:Chicago"{ + { + "America_Central", + } + } + "America:Chihuahua"{ + { + "America_Central", + "1970-01-01 00:00", + "1998-04-05 09:00", + } + { + "Mexico_Pacific", + "1998-04-05 09:00", + "9999-12-31 23:59", + } + } + "America:Coral_Harbour"{ + { + "America_Eastern", + } + } + "America:Cordoba"{ + { + "Argentina", + "1970-01-01 00:00", + "1991-03-03 02:00", + } + { + "Argentina", + "1991-10-20 04:00", + "9999-12-31 23:59", + } + } + "America:Costa_Rica"{ + { + "America_Central", + } + } + "America:Creston"{ + { + "America_Mountain", + } + } + "America:Cuiaba"{ + { + "Amazon", + } + } + "America:Curacao"{ + { + "Atlantic", + } + } + "America:Danmarkshavn"{ + { + "Greenland_Western", + "1970-01-01 00:00", + "1996-01-01 03:00", + } + { + "GMT", + "1996-01-01 03:00", + "9999-12-31 23:59", + } + } + "America:Dawson"{ + { + "Yukon", + "1970-01-01 00:00", + "1973-10-28 09:00", + } + { + "America_Pacific", + "1973-10-28 09:00", + "9999-12-31 23:59", + } + } + "America:Dawson_Creek"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1972-08-30 09:00", + } + { + "America_Mountain", + "1972-08-30 09:00", + "9999-12-31 23:59", + } + } + "America:Denver"{ + { + "America_Mountain", + } + } + "America:Detroit"{ + { + "America_Eastern", + } + } + "America:Dominica"{ + { + "Atlantic", + } + } + "America:Edmonton"{ + { + "America_Mountain", + } + } + "America:Eirunepe"{ + { + "Acre", + "1970-01-01 00:00", + "2008-06-24 05:00", + } + { + "Amazon", + "2008-06-24 05:00", + "2013-11-10 04:00", + } + { + "Acre", + "2013-11-10 04:00", + "9999-12-31 23:59", + } + } + "America:El_Salvador"{ + { + "America_Central", + } + } + "America:Fortaleza"{ + { + "Brasilia", + } + } + "America:Glace_Bay"{ + { + "Atlantic", + } + } + "America:Godthab"{ + { + "Greenland_Western", + } + } + "America:Goose_Bay"{ + { + "Atlantic", + "1970-01-01 00:00", + "1988-04-03 04:01", + } + { + "Goose_Bay", + "1988-04-03 04:01", + "1988-10-30 02:01", + } + { + "Atlantic", + "1988-10-30 02:01", + "9999-12-31 23:59", + } + } + "America:Grand_Turk"{ + { + "America_Eastern", + "1970-01-01 00:00", + "2015-11-01 06:00", + } + { + "Atlantic", + "2015-11-01 06:00", + "9999-12-31 23:59", + } + } + "America:Grenada"{ + { + "Atlantic", + } + } + "America:Guadeloupe"{ + { + "Atlantic", + } + } + "America:Guatemala"{ + { + "America_Central", + } + } + "America:Guayaquil"{ + { + "Ecuador", + } + } + "America:Guyana"{ + { + "Guyana", + } + } + "America:Halifax"{ + { + "Atlantic", + } + } + "America:Havana"{ + { + "Cuba", + } + } + "America:Hermosillo"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1970-01-01 08:00", + } + { + "Mexico_Pacific", + "1970-01-01 08:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Knox"{ + { + "America_Central", + "1970-01-01 00:00", + "1991-10-27 07:00", + } + { + "America_Eastern", + "1991-10-27 07:00", + "2006-04-02 07:00", + } + { + "America_Central", + "2006-04-02 07:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Marengo"{ + { + "America_Eastern", + "1970-01-01 00:00", + "1974-01-06 07:00", + } + { + "America_Central", + "1974-01-06 07:00", + "1974-10-27 07:00", + } + { + "America_Eastern", + "1974-10-27 07:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Petersburg"{ + { + "America_Central", + "1970-01-01 00:00", + "1977-10-30 07:00", + } + { + "America_Eastern", + "1977-10-30 07:00", + "2006-04-02 07:00", + } + { + "America_Central", + "2006-04-02 07:00", + "2007-11-04 07:00", + } + { + "America_Eastern", + "2007-11-04 07:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Tell_City"{ + { + "America_Eastern", + "1970-01-01 00:00", + "2006-04-02 07:00", + } + { + "America_Central", + "2006-04-02 07:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Vevay"{ + { + "America_Eastern", + } + } + "America:Indiana:Vincennes"{ + { + "America_Eastern", + "1970-01-01 00:00", + "2006-04-02 07:00", + } + { + "America_Central", + "2006-04-02 07:00", + "2007-11-04 07:00", + } + { + "America_Eastern", + "2007-11-04 07:00", + "9999-12-31 23:59", + } + } + "America:Indiana:Winamac"{ + { + "America_Eastern", + "1970-01-01 00:00", + "2006-04-02 07:00", + } + { + "America_Central", + "2006-04-02 07:00", + "2007-03-11 08:00", + } + { + "America_Eastern", + "2007-03-11 08:00", + "9999-12-31 23:59", + } + } + "America:Indianapolis"{ + { + "America_Eastern", + } + } + "America:Inuvik"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1979-04-29 10:00", + } + { + "America_Mountain", + "1979-04-29 10:00", + "9999-12-31 23:59", + } + } + "America:Iqaluit"{ + { + "America_Eastern", + "1970-01-01 00:00", + "1999-10-31 06:00", + } + { + "America_Central", + "1999-10-31 06:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "9999-12-31 23:59", + } + } + "America:Jamaica"{ + { + "America_Eastern", + } + } + "America:Jujuy"{ + { + "Argentina", + "1970-01-01 00:00", + "1990-03-04 02:00", + } + { + "Argentina", + "1991-10-06 04:00", + "9999-12-31 23:59", + } + } + "America:Juneau"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1980-04-27 10:00", + } + { + "Yukon", + "1980-04-27 10:00", + "1980-10-26 10:00", + } + { + "America_Pacific", + "1980-10-26 10:00", + "1983-10-30 09:00", + } + { + "Yukon", + "1983-10-30 09:00", + "1983-11-30 09:00", + } + { + "Alaska", + "1983-11-30 09:00", + "9999-12-31 23:59", + } + } + "America:Kentucky:Monticello"{ + { + "America_Central", + "1970-01-01 00:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "9999-12-31 23:59", + } + } + "America:Kralendijk"{ + { + "Atlantic", + } + } + "America:La_Paz"{ + { + "Bolivia", + } + } + "America:Lima"{ + { + "Peru", + } + } + "America:Los_Angeles"{ + { + "America_Pacific", + } + } + "America:Louisville"{ + { + "America_Eastern", + "1970-01-01 00:00", + "1974-01-06 07:00", + } + { + "America_Central", + "1974-01-06 07:00", + "1974-10-27 07:00", + } + { + "America_Eastern", + "1974-10-27 07:00", + "9999-12-31 23:59", + } + } + "America:Lower_Princes"{ + { + "Atlantic", + } + } + "America:Maceio"{ + { + "Brasilia", + } + } + "America:Managua"{ + { + "America_Central", + "1970-01-01 00:00", + "1973-05-01 06:00", + } + { + "America_Eastern", + "1973-05-01 06:00", + "1975-02-16 05:00", + } + { + "America_Central", + "1975-02-16 05:00", + "1992-01-01 10:00", + } + { + "America_Eastern", + "1992-01-01 10:00", + "1992-09-24 05:00", + } + { + "America_Central", + "1992-09-24 05:00", + "1993-01-01 06:00", + } + { + "America_Eastern", + "1993-01-01 06:00", + "1997-01-01 05:00", + } + { + "America_Central", + "1997-01-01 05:00", + "9999-12-31 23:59", + } + } + "America:Manaus"{ + { + "Amazon", + } + } + "America:Marigot"{ + { + "Atlantic", + } + } + "America:Martinique"{ + { + "Atlantic", + } + } + "America:Matamoros"{ + { + "America_Central", + } + } + "America:Mazatlan"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1970-01-01 08:00", + } + { + "Mexico_Pacific", + "1970-01-01 08:00", + "9999-12-31 23:59", + } + } + "America:Mendoza"{ + { + "Argentina", + "1970-01-01 00:00", + "1990-03-04 02:00", + } + { + "Argentina", + "1992-10-18 04:00", + "2004-05-23 03:00", + } + { + "Argentina", + "2004-09-26 04:00", + "9999-12-31 23:59", + } + } + "America:Menominee"{ + { + "America_Eastern", + "1970-01-01 00:00", + "1973-04-29 07:00", + } + { + "America_Central", + "1973-04-29 07:00", + "9999-12-31 23:59", + } + } + "America:Merida"{ + { + "America_Central", + "1970-01-01 00:00", + "1981-12-23 06:00", + } + { + "America_Eastern", + "1981-12-23 06:00", + "1982-12-02 05:00", + } + { + "America_Central", + "1982-12-02 05:00", + "9999-12-31 23:59", + } + } + "America:Metlakatla"{ + { + "America_Pacific", + } + } + "America:Mexico_City"{ + { + "America_Central", + } + } + "America:Miquelon"{ + { + "Atlantic", + "1970-01-01 00:00", + "1980-05-01 04:00", + } + { + "Pierre_Miquelon", + "1980-05-01 04:00", + "9999-12-31 23:59", + } + } + "America:Moncton"{ + { + "Atlantic", + } + } + "America:Monterrey"{ + { + "America_Central", + } + } + "America:Montevideo"{ + { + "Uruguay", + } + } + "America:Montserrat"{ + { + "Atlantic", + } + } + "America:Nassau"{ + { + "America_Eastern", + } + } + "America:New_York"{ + { + "America_Eastern", + } + } + "America:Nipigon"{ + { + "America_Eastern", + } + } + "America:Nome"{ + { + "Bering", + "1970-01-01 00:00", + "1983-10-30 12:00", + } + { + "Yukon", + "1983-10-30 12:00", + "1983-11-30 09:00", + } + { + "Alaska", + "1983-11-30 09:00", + "9999-12-31 23:59", + } + } + "America:Noronha"{ + { + "Noronha", + } + } + "America:North_Dakota:Beulah"{ + { + "America_Mountain", + "1970-01-01 00:00", + "2010-11-07 08:00", + } + { + "America_Central", + "2010-11-07 08:00", + "9999-12-31 23:59", + } + } + "America:North_Dakota:Center"{ + { + "America_Mountain", + "1970-01-01 00:00", + "1992-10-25 08:00", + } + { + "America_Central", + "1992-10-25 08:00", + "9999-12-31 23:59", + } + } + "America:North_Dakota:New_Salem"{ + { + "America_Mountain", + "1970-01-01 00:00", + "2003-10-26 08:00", + } + { + "America_Central", + "2003-10-26 08:00", + "9999-12-31 23:59", + } + } + "America:Ojinaga"{ + { + "America_Central", + "1970-01-01 00:00", + "1998-04-05 09:00", + } + { + "America_Mountain", + "1998-04-05 09:00", + "9999-12-31 23:59", + } + } + "America:Panama"{ + { + "America_Eastern", + } + } + "America:Pangnirtung"{ + { + "Atlantic", + "1970-01-01 00:00", + "1995-04-02 06:00", + } + { + "America_Eastern", + "1995-04-02 06:00", + "1999-10-31 06:00", + } + { + "America_Central", + "1999-10-31 06:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "9999-12-31 23:59", + } + } + "America:Paramaribo"{ + { + "Dutch_Guiana", + "1970-01-01 00:00", + "1975-11-20 03:30", + } + { + "Suriname", + "1975-11-20 03:30", + "9999-12-31 23:59", + } + } + "America:Phoenix"{ + { + "America_Mountain", + } + } + "America:Port-au-Prince"{ + { + "America_Eastern", + } + } + "America:Port_of_Spain"{ + { + "Atlantic", + } + } + "America:Porto_Velho"{ + { + "Amazon", + } + } + "America:Puerto_Rico"{ + { + "Atlantic", + } + } + "America:Rainy_River"{ + { + "America_Central", + } + } + "America:Rankin_Inlet"{ + { + "America_Central", + "1970-01-01 00:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "2001-04-01 08:00", + } + { + "America_Central", + "2001-04-01 08:00", + "9999-12-31 23:59", + } + } + "America:Recife"{ + { + "Brasilia", + } + } + "America:Regina"{ + { + "America_Central", + } + } + "America:Resolute"{ + { + "America_Central", + "1970-01-01 00:00", + "2000-10-29 07:00", + } + { + "America_Eastern", + "2000-10-29 07:00", + "2001-04-01 08:00", + } + { + "America_Central", + "2001-04-01 08:00", + "2006-10-29 07:00", + } + { + "America_Eastern", + "2006-10-29 07:00", + "2007-03-11 08:00", + } + { + "America_Central", + "2007-03-11 08:00", + "9999-12-31 23:59", + } + } + "America:Rio_Branco"{ + { + "Acre", + "1970-01-01 00:00", + "2008-06-24 05:00", + } + { + "Amazon", + "2008-06-24 05:00", + "2013-11-10 04:00", + } + { + "Acre", + "2013-11-10 04:00", + "9999-12-31 23:59", + } + } + "America:Santa_Isabel"{ + { + "Mexico_Northwest", + } + } + "America:Santarem"{ + { + "Amazon", + "1970-01-01 00:00", + "2008-06-24 04:00", + } + { + "Brasilia", + "2008-06-24 04:00", + "9999-12-31 23:59", + } + } + "America:Santiago"{ + { + "Chile", + } + } + "America:Santo_Domingo"{ + { + "Dominican", + "1970-01-01 00:00", + "1974-10-27 05:00", + } + { + "Atlantic", + "1974-10-27 05:00", + "2000-10-29 06:00", + } + { + "America_Eastern", + "2000-10-29 06:00", + "2000-12-03 06:00", + } + { + "Atlantic", + "2000-12-03 06:00", + "9999-12-31 23:59", + } + } + "America:Sao_Paulo"{ + { + "Brasilia", + } + } + "America:Scoresbysund"{ + { + "Greenland_Central", + "1970-01-01 00:00", + "1981-03-29 02:00", + } + { + "Greenland_Eastern", + "1981-03-29 02:00", + "9999-12-31 23:59", + } + } + "America:Sitka"{ + { + "America_Pacific", + "1970-01-01 00:00", + "1983-10-30 09:00", + } + { + "Yukon", + "1983-10-30 09:00", + "1983-11-30 09:00", + } + { + "Alaska", + "1983-11-30 09:00", + "9999-12-31 23:59", + } + } + "America:St_Barthelemy"{ + { + "Atlantic", + } + } + "America:St_Johns"{ + { + "Newfoundland", + } + } + "America:St_Kitts"{ + { + "Atlantic", + } + } + "America:St_Lucia"{ + { + "Atlantic", + } + } + "America:St_Thomas"{ + { + "Atlantic", + } + } + "America:St_Vincent"{ + { + "Atlantic", + } + } + "America:Swift_Current"{ + { + "America_Mountain", + "1970-01-01 00:00", + "1972-04-30 09:00", + } + { + "America_Central", + "1972-04-30 09:00", + "9999-12-31 23:59", + } + } + "America:Tegucigalpa"{ + { + "America_Central", + } + } + "America:Thule"{ + { + "Atlantic", + } + } + "America:Thunder_Bay"{ + { + "America_Eastern", + } + } + "America:Tijuana"{ + { + "America_Pacific", + } + } + "America:Toronto"{ + { + "America_Eastern", + } + } + "America:Tortola"{ + { + "Atlantic", + } + } + "America:Vancouver"{ + { + "America_Pacific", + } + } + "America:Whitehorse"{ + { + "America_Pacific", + } + } + "America:Winnipeg"{ + { + "America_Central", + } + } + "America:Yakutat"{ + { + "Yukon", + "1970-01-01 00:00", + "1983-11-30 09:00", + } + { + "Alaska", + "1983-11-30 09:00", + "9999-12-31 23:59", + } + } + "America:Yellowknife"{ + { + "America_Mountain", + } + } + "Antarctica:Casey"{ + { + "Australia_Western", + "1970-01-01 00:00", + "2009-10-17 18:00", + } + { + "Casey", + "2009-10-17 18:00", + "2010-03-04 15:00", + } + { + "Australia_Western", + "2010-03-04 15:00", + "2011-10-27 18:00", + } + { + "Casey", + "2011-10-27 18:00", + "2012-02-21 17:00", + } + { + "Australia_Western", + "2012-02-21 17:00", + "9999-12-31 23:59", + } + } + "Antarctica:Davis"{ + { + "Davis", + } + } + "Antarctica:DumontDUrville"{ + { + "DumontDUrville", + } + } + "Antarctica:Macquarie"{ + { + "Australia_Eastern", + "1970-01-01 00:00", + "2010-04-03 16:00", + } + { + "Macquarie", + "2010-04-03 16:00", + "9999-12-31 23:59", + } + } + "Antarctica:Mawson"{ + { + "Mawson", + } + } + "Antarctica:McMurdo"{ + { + "New_Zealand", + } + } + "Antarctica:Palmer"{ + { + "Argentina", + "1970-01-01 00:00", + "1982-05-01 03:00", + } + { + "Chile", + "1982-05-01 03:00", + "9999-12-31 23:59", + } + } + "Antarctica:Rothera"{ + { + "Rothera", + } + } + "Antarctica:Syowa"{ + { + "Syowa", + } + } + "Antarctica:Troll"{ + { + "GMT", + } + } + "Antarctica:Vostok"{ + { + "Vostok", + } + } + "Arctic:Longyearbyen"{ + { + "Europe_Central", + } + } + "Asia:Aden"{ + { + "Arabian", + } + } + "Asia:Almaty"{ + { + "Almaty", + "1970-01-01 00:00", + "2005-03-14 18:00", + } + { + "Kazakhstan_Eastern", + "2005-03-14 18:00", + "9999-12-31 23:59", + } + } + "Asia:Amman"{ + { + "Europe_Eastern", + } + } + "Asia:Anadyr"{ + { + "Anadyr", + "1970-01-01 00:00", + "2010-03-27 14:00", + } + { + "Magadan", + "2010-03-27 14:00", + "9999-12-31 23:59", + } + } + "Asia:Aqtau"{ + { + "Shevchenko", + "1970-01-01 00:00", + "1991-12-15 19:00", + } + { + "Aqtau", + "1991-12-15 19:00", + "2005-03-14 20:00", + } + { + "Kazakhstan_Western", + "2005-03-14 20:00", + "9999-12-31 23:59", + } + } + "Asia:Aqtobe"{ + { + "Aktyubinsk", + "1970-01-01 00:00", + "1991-12-15 19:00", + } + { + "Aqtobe", + "1991-12-15 19:00", + "2005-03-14 19:00", + } + { + "Kazakhstan_Western", + "2005-03-14 19:00", + "9999-12-31 23:59", + } + } + "Asia:Ashgabat"{ + { + "Ashkhabad", + "1970-01-01 00:00", + "1991-10-26 20:00", + } + { + "Turkmenistan", + "1991-10-26 20:00", + "9999-12-31 23:59", + } + } + "Asia:Baghdad"{ + { + "Arabian", + } + } + "Asia:Bahrain"{ + { + "Gulf", + "1970-01-01 00:00", + "1972-05-31 20:00", + } + { + "Arabian", + "1972-05-31 20:00", + "9999-12-31 23:59", + } + } + "Asia:Baku"{ + { + "Baku", + "1970-01-01 00:00", + "1991-08-29 20:00", + } + { + "Azerbaijan", + "1991-08-29 20:00", + "9999-12-31 23:59", + } + } + "Asia:Bangkok"{ + { + "Indochina", + } + } + "Asia:Beirut"{ + { + "Europe_Eastern", + } + } + "Asia:Bishkek"{ + { + "Frunze", + "1970-01-01 00:00", + "1991-08-30 20:00", + } + { + "Kyrgystan", + "1991-08-30 20:00", + "9999-12-31 23:59", + } + } + "Asia:Brunei"{ + { + "Brunei", + } + } + "Asia:Calcutta"{ + { + "India", + } + } + "Asia:Chita"{ + { + "Yakutsk", + "1970-01-01 00:00", + "2014-10-25 16:00", + } + { + "Irkutsk", + "2014-10-25 16:00", + "9999-12-31 23:59", + } + } + "Asia:Choibalsan"{ + { + "Mongolia", + "1970-01-01 00:00", + "1983-03-31 16:00", + } + { + "Choibalsan", + "1983-03-31 16:00", + "9999-12-31 23:59", + } + } + "Asia:Colombo"{ + { + "India", + "1970-01-01 00:00", + "1996-05-24 18:30", + } + { + "Lanka", + "1996-05-24 18:30", + "2006-04-14 18:30", + } + { + "India", + "2006-04-14 18:30", + "9999-12-31 23:59", + } + } + "Asia:Damascus"{ + { + "Europe_Eastern", + } + } + "Asia:Dhaka"{ + { + "Dacca", + "1970-01-01 00:00", + "1971-03-25 18:00", + } + { + "Bangladesh", + "1971-03-25 18:00", + "9999-12-31 23:59", + } + } + "Asia:Dili"{ + { + "East_Timor", + "1970-01-01 00:00", + "1976-05-02 15:00", + } + { + "Indonesia_Central", + "1976-05-02 15:00", + "2000-09-16 16:00", + } + { + "East_Timor", + "2000-09-16 16:00", + "9999-12-31 23:59", + } + } + "Asia:Dubai"{ + { + "Gulf", + } + } + "Asia:Dushanbe"{ + { + "Dushanbe", + "1970-01-01 00:00", + "1991-09-08 21:00", + } + { + "Tajikistan", + "1991-09-08 21:00", + "9999-12-31 23:59", + } + } + "Asia:Gaza"{ + { + "Israel", + "1970-01-01 00:00", + "1995-12-31 22:00", + } + { + "Europe_Eastern", + "1995-12-31 22:00", + "9999-12-31 23:59", + } + } + "Asia:Hebron"{ + { + "Israel", + "1970-01-01 00:00", + "1995-12-31 22:00", + } + { + "Europe_Eastern", + "1995-12-31 22:00", + "9999-12-31 23:59", + } + } + "Asia:Hong_Kong"{ + { + "Hong_Kong", + } + } + "Asia:Hovd"{ + { + "Hovd", + } + } + "Asia:Irkutsk"{ + { + "Irkutsk", + } + } + "Asia:Jakarta"{ + { + "Indonesia_Western", + } + } + "Asia:Jayapura"{ + { + "Indonesia_Eastern", + } + } + "Asia:Jerusalem"{ + { + "Israel", + } + } + "Asia:Kabul"{ + { + "Afghanistan", + } + } + "Asia:Kamchatka"{ + { + "Kamchatka", + } + } + "Asia:Karachi"{ + { + "Karachi", + "1970-01-01 00:00", + "1971-03-25 19:00", + } + { + "Pakistan", + "1971-03-25 19:00", + "9999-12-31 23:59", + } + } + "Asia:Katmandu"{ + { + "Nepal", + } + } + "Asia:Khandyga"{ + { + "Yakutsk", + "1970-01-01 00:00", + "2003-12-31 15:00", + } + { + "Vladivostok", + "2003-12-31 15:00", + "2011-09-12 13:00", + } + { + "Yakutsk", + "2011-09-12 13:00", + "9999-12-31 23:59", + } + } + "Asia:Krasnoyarsk"{ + { + "Krasnoyarsk", + } + } + "Asia:Kuala_Lumpur"{ + { + "Malaya", + "1970-01-01 00:00", + "1981-12-31 16:30", + } + { + "Malaysia", + "1981-12-31 16:30", + "9999-12-31 23:59", + } + } + "Asia:Kuching"{ + { + "Borneo", + "1970-01-01 00:00", + "1981-12-31 16:00", + } + { + "Malaysia", + "1981-12-31 16:00", + "9999-12-31 23:59", + } + } + "Asia:Kuwait"{ + { + "Arabian", + } + } + "Asia:Macau"{ + { + "Macau", + "1970-01-01 00:00", + "1999-12-19 16:00", + } + { + "China", + "1999-12-19 16:00", + "9999-12-31 23:59", + } + } + "Asia:Magadan"{ + { + "Magadan", + } + } + "Asia:Makassar"{ + { + "Indonesia_Central", + } + } + "Asia:Manila"{ + { + "Philippines", + } + } + "Asia:Muscat"{ + { + "Gulf", + } + } + "Asia:Nicosia"{ + { + "Europe_Eastern", + } + } + "Asia:Novokuznetsk"{ + { + "Krasnoyarsk", + "1970-01-01 00:00", + "2010-03-27 19:00", + } + { + "Novosibirsk", + "2010-03-27 19:00", + "2014-10-25 19:00", + } + { + "Krasnoyarsk", + "2014-10-25 19:00", + "9999-12-31 23:59", + } + } + "Asia:Novosibirsk"{ + { + "Novosibirsk", + } + } + "Asia:Omsk"{ + { + "Omsk", + } + } + "Asia:Oral"{ + { + "Uralsk", + "1970-01-01 00:00", + "1991-12-15 20:00", + } + { + "Oral", + "1991-12-15 20:00", + "2005-03-14 20:00", + } + { + "Kazakhstan_Western", + "2005-03-14 20:00", + "9999-12-31 23:59", + } + } + "Asia:Phnom_Penh"{ + { + "Indochina", + } + } + "Asia:Pontianak"{ + { + "Indonesia_Central", + "1970-01-01 00:00", + "1987-12-31 16:00", + } + { + "Indonesia_Western", + "1987-12-31 16:00", + "9999-12-31 23:59", + } + } + "Asia:Pyongyang"{ + { + "Korea", + "1970-01-01 00:00", + "2015-08-14 15:00", + } + } + "Asia:Qatar"{ + { + "Gulf", + "1970-01-01 00:00", + "1972-05-31 20:00", + } + { + "Arabian", + "1972-05-31 20:00", + "9999-12-31 23:59", + } + } + "Asia:Qyzylorda"{ + { + "Kizilorda", + "1970-01-01 00:00", + "1991-12-15 19:00", + } + { + "Qyzylorda", + "1991-12-15 19:00", + "2005-03-14 18:00", + } + { + "Kazakhstan_Eastern", + "2005-03-14 18:00", + "9999-12-31 23:59", + } + } + "Asia:Rangoon"{ + { + "Myanmar", + } + } + "Asia:Riyadh"{ + { + "Arabian", + } + } + "Asia:Saigon"{ + { + "Indochina", + "1975-06-12 16:00", + "9999-12-31 23:59", + } + } + "Asia:Sakhalin"{ + { + "Sakhalin", + } + } + "Asia:Samarkand"{ + { + "Samarkand", + "1970-01-01 00:00", + "1981-09-30 18:00", + } + { + "Tashkent", + "1981-09-30 18:00", + "1982-03-31 18:00", + } + { + "Samarkand", + "1982-03-31 18:00", + "1991-08-31 18:00", + } + { + "Uzbekistan", + "1991-08-31 18:00", + "9999-12-31 23:59", + } + } + "Asia:Seoul"{ + { + "Korea", + } + } + "Asia:Shanghai"{ + { + "China", + } + } + "Asia:Singapore"{ + { + "Singapore", + } + } + "Asia:Srednekolymsk"{ + { + "Magadan", + "1970-01-01 00:00", + "2014-10-25 14:00", + } + } + "Asia:Taipei"{ + { + "Taipei", + } + } + "Asia:Tashkent"{ + { + "Tashkent", + "1970-01-01 00:00", + "1991-08-31 18:00", + } + { + "Uzbekistan", + "1991-08-31 18:00", + "9999-12-31 23:59", + } + } + "Asia:Tbilisi"{ + { + "Tbilisi", + "1970-01-01 00:00", + "1991-04-08 20:00", + } + { + "Georgia", + "1991-04-08 20:00", + "9999-12-31 23:59", + } + } + "Asia:Tehran"{ + { + "Iran", + } + } + "Asia:Thimphu"{ + { + "India", + "1970-01-01 00:00", + "1987-09-30 18:30", + } + { + "Bhutan", + "1987-09-30 18:30", + "9999-12-31 23:59", + } + } + "Asia:Tokyo"{ + { + "Japan", + } + } + "Asia:Ulaanbaatar"{ + { + "Mongolia", + } + } + "Asia:Urumqi"{ + { + "Urumqi", + } + } + "Asia:Ust-Nera"{ + { + "Yakutsk", + "1970-01-01 00:00", + "1981-03-31 15:00", + } + { + "Magadan", + "1981-03-31 15:00", + "2011-09-12 12:00", + } + { + "Vladivostok", + "2011-09-12 12:00", + "9999-12-31 23:59", + } + } + "Asia:Vientiane"{ + { + "Indochina", + } + } + "Asia:Vladivostok"{ + { + "Vladivostok", + } + } + "Asia:Yakutsk"{ + { + "Yakutsk", + } + } + "Asia:Yekaterinburg"{ + { + "Sverdlovsk", + "1970-01-01 00:00", + "1992-01-18 22:00", + } + { + "Yekaterinburg", + "1992-01-18 22:00", + "9999-12-31 23:59", + } + } + "Asia:Yerevan"{ + { + "Yerevan", + "1970-01-01 00:00", + "1991-09-22 20:00", + } + { + "Armenia", + "1991-09-22 20:00", + "9999-12-31 23:59", + } + } + "Atlantic:Azores"{ + { + "Azores", + "1970-01-01 00:00", + "1992-09-27 02:00", + } + { + "Europe_Western", + "1992-09-27 02:00", + "1993-03-28 01:00", + } + { + "Azores", + "1993-03-28 01:00", + "9999-12-31 23:59", + } + } + "Atlantic:Bermuda"{ + { + "Atlantic", + } + } + "Atlantic:Canary"{ + { + "Europe_Western", + } + } + "Atlantic:Cape_Verde"{ + { + "Cape_Verde", + } + } + "Atlantic:Faeroe"{ + { + "Europe_Western", + } + } + "Atlantic:Madeira"{ + { + "Europe_Western", + } + } + "Atlantic:Reykjavik"{ + { + "GMT", + } + } + "Atlantic:South_Georgia"{ + { + "South_Georgia", + } + } + "Atlantic:St_Helena"{ + { + "GMT", + } + } + "Atlantic:Stanley"{ + { + "Falkland", + } + } + "Australia:Adelaide"{ + { + "Australia_Central", + } + } + "Australia:Brisbane"{ + { + "Australia_Eastern", + } + } + "Australia:Broken_Hill"{ + { + "Australia_Central", + } + } + "Australia:Currie"{ + { + "Australia_Eastern", + } + } + "Australia:Darwin"{ + { + "Australia_Central", + } + } + "Australia:Eucla"{ + { + "Australia_CentralWestern", + } + } + "Australia:Hobart"{ + { + "Australia_Eastern", + } + } + "Australia:Lindeman"{ + { + "Australia_Eastern", + } + } + "Australia:Lord_Howe"{ + { + "Australia_Eastern", + "1970-01-01 00:00", + "1981-02-28 14:00", + } + { + "Lord_Howe", + "1981-02-28 14:00", + "9999-12-31 23:59", + } + } + "Australia:Melbourne"{ + { + "Australia_Eastern", + } + } + "Australia:Perth"{ + { + "Australia_Western", + } + } + "Australia:Sydney"{ + { + "Australia_Eastern", + } + } + "CST6CDT"{ + { + "America_Central", + } + } + "EST5EDT"{ + { + "America_Eastern", + } + } + "Europe:Amsterdam"{ + { + "Europe_Central", + } + } + "Europe:Andorra"{ + { + "Europe_Central", + } + } + "Europe:Athens"{ + { + "Europe_Eastern", + } + } + "Europe:Belgrade"{ + { + "Europe_Central", + } + } + "Europe:Berlin"{ + { + "Europe_Central", + } + } + "Europe:Bratislava"{ + { + "Europe_Central", + } + } + "Europe:Brussels"{ + { + "Europe_Central", + } + } + "Europe:Bucharest"{ + { + "Europe_Eastern", + } + } + "Europe:Budapest"{ + { + "Europe_Central", + } + } + "Europe:Busingen"{ + { + "Europe_Central", + } + } + "Europe:Chisinau"{ + { + "Moscow", + "1970-01-01 00:00", + "1990-05-05 21:00", + } + { + "Europe_Eastern", + "1990-05-05 21:00", + "9999-12-31 23:59", + } + } + "Europe:Copenhagen"{ + { + "Europe_Central", + } + } + "Europe:Dublin"{ + { + "Irish", + "1970-01-01 00:00", + "1971-10-31 02:00", + } + { + "GMT", + "1971-10-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Gibraltar"{ + { + "Europe_Central", + } + } + "Europe:Guernsey"{ + { + "British", + "1970-01-01 00:00", + "1971-10-31 02:00", + } + { + "GMT", + "1971-10-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Helsinki"{ + { + "Europe_Eastern", + } + } + "Europe:Isle_of_Man"{ + { + "British", + "1970-01-01 00:00", + "1971-10-31 02:00", + } + { + "GMT", + "1971-10-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Istanbul"{ + { + "Europe_Eastern", + "1970-01-01 00:00", + "1978-10-14 21:00", + } + { + "Turkey", + "1978-10-14 21:00", + "1985-04-19 21:00", + } + { + "Europe_Eastern", + "1985-04-19 21:00", + "9999-12-31 23:59", + } + } + "Europe:Jersey"{ + { + "British", + "1970-01-01 00:00", + "1971-10-31 02:00", + } + { + "GMT", + "1971-10-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Kaliningrad"{ + { + "Moscow", + "1970-01-01 00:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "2011-03-27 00:00", + } + { + "Europe_Further_Eastern", + "2011-03-27 00:00", + "2014-10-25 23:00", + } + { + "Europe_Eastern", + "2014-10-25 23:00", + "9999-12-31 23:59", + } + } + "Europe:Kiev"{ + { + "Moscow", + "1970-01-01 00:00", + "1990-06-30 22:00", + } + { + "Europe_Eastern", + "1990-06-30 22:00", + "9999-12-31 23:59", + } + } + "Europe:Lisbon"{ + { + "Europe_Central", + "1970-01-01 00:00", + "1976-09-26 00:00", + } + { + "Europe_Western", + "1976-09-26 00:00", + "1992-09-27 01:00", + } + { + "Europe_Central", + "1992-09-27 01:00", + "1996-03-31 01:00", + } + { + "Europe_Western", + "1996-03-31 01:00", + "9999-12-31 23:59", + } + } + "Europe:Ljubljana"{ + { + "Europe_Central", + } + } + "Europe:London"{ + { + "British", + "1970-01-01 00:00", + "1971-10-31 02:00", + } + { + "GMT", + "1971-10-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Luxembourg"{ + { + "Europe_Central", + } + } + "Europe:Madrid"{ + { + "Europe_Central", + } + } + "Europe:Malta"{ + { + "Europe_Central", + } + } + "Europe:Mariehamn"{ + { + "Europe_Eastern", + } + } + "Europe:Minsk"{ + { + "Moscow", + "1970-01-01 00:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "2011-03-27 00:00", + } + { + "Europe_Further_Eastern", + "2011-03-27 00:00", + "9999-12-31 23:59", + } + } + "Europe:Monaco"{ + { + "Europe_Central", + } + } + "Europe:Moscow"{ + { + "Moscow", + "1970-01-01 00:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "1992-01-19 00:00", + } + { + "Moscow", + "1992-01-19 00:00", + "9999-12-31 23:59", + } + } + "Europe:Oslo"{ + { + "Europe_Central", + } + } + "Europe:Paris"{ + { + "Europe_Central", + } + } + "Europe:Podgorica"{ + { + "Europe_Central", + } + } + "Europe:Prague"{ + { + "Europe_Central", + } + } + "Europe:Riga"{ + { + "Moscow", + "1970-01-01 00:00", + "1989-03-25 23:00", + } + { + "Europe_Eastern", + "1989-03-25 23:00", + "9999-12-31 23:59", + } + } + "Europe:Rome"{ + { + "Europe_Central", + } + } + "Europe:Samara"{ + { + "Kuybyshev", + "1970-01-01 00:00", + "1989-03-25 22:00", + } + { + "Moscow", + "1989-03-25 22:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "1991-09-29 00:00", + } + { + "Kuybyshev", + "1991-09-29 00:00", + "1991-10-20 00:00", + } + { + "Samara", + "1991-10-20 00:00", + "9999-12-31 23:59", + } + } + "Europe:San_Marino"{ + { + "Europe_Central", + } + } + "Europe:Sarajevo"{ + { + "Europe_Central", + } + } + "Europe:Simferopol"{ + { + "Moscow", + "1970-01-01 00:00", + "1990-06-30 23:00", + } + { + "Europe_Eastern", + "1990-06-30 23:00", + "1994-04-30 21:00", + } + { + "Moscow", + "1994-04-30 21:00", + "1997-03-30 01:00", + } + { + "Europe_Eastern", + "1997-03-30 01:00", + "2014-03-30 00:00", + } + { + "Moscow", + "2014-03-30 00:00", + "9999-12-31 23:59", + } + } + "Europe:Skopje"{ + { + "Europe_Central", + } + } + "Europe:Sofia"{ + { + "Europe_Eastern", + } + } + "Europe:Stockholm"{ + { + "Europe_Central", + } + } + "Europe:Tallinn"{ + { + "Moscow", + "1970-01-01 00:00", + "1989-03-25 23:00", + } + { + "Europe_Eastern", + "1989-03-25 23:00", + "9999-12-31 23:59", + } + } + "Europe:Tirane"{ + { + "Europe_Central", + } + } + "Europe:Uzhgorod"{ + { + "Moscow", + "1970-01-01 00:00", + "1990-06-30 23:00", + } + { + "Europe_Central", + "1990-06-30 23:00", + "1991-03-31 02:00", + } + { + "Europe_Eastern", + "1991-03-31 02:00", + "9999-12-31 23:59", + } + } + "Europe:Vaduz"{ + { + "Europe_Central", + } + } + "Europe:Vatican"{ + { + "Europe_Central", + } + } + "Europe:Vienna"{ + { + "Europe_Central", + } + } + "Europe:Vilnius"{ + { + "Moscow", + "1970-01-01 00:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "1998-03-29 01:00", + } + { + "Europe_Central", + "1998-03-29 01:00", + "1999-10-31 01:00", + } + { + "Europe_Eastern", + "1999-10-31 01:00", + "9999-12-31 23:59", + } + } + "Europe:Volgograd"{ + { + "Volgograd", + "1970-01-01 00:00", + "1992-03-28 22:00", + } + { + "Moscow", + "1992-03-28 22:00", + "9999-12-31 23:59", + } + } + "Europe:Warsaw"{ + { + "Europe_Central", + } + } + "Europe:Zagreb"{ + { + "Europe_Central", + } + } + "Europe:Zaporozhye"{ + { + "Moscow", + "1970-01-01 00:00", + "1991-03-30 23:00", + } + { + "Europe_Eastern", + "1991-03-30 23:00", + "9999-12-31 23:59", + } + } + "Europe:Zurich"{ + { + "Europe_Central", + } + } + "Indian:Antananarivo"{ + { + "Africa_Eastern", + } + } + "Indian:Chagos"{ + { + "Indian_Ocean", + } + } + "Indian:Christmas"{ + { + "Christmas", + } + } + "Indian:Cocos"{ + { + "Cocos", + } + } + "Indian:Comoro"{ + { + "Africa_Eastern", + } + } + "Indian:Kerguelen"{ + { + "French_Southern", + } + } + "Indian:Mahe"{ + { + "Seychelles", + } + } + "Indian:Maldives"{ + { + "Maldives", + } + } + "Indian:Mauritius"{ + { + "Mauritius", + } + } + "Indian:Mayotte"{ + { + "Africa_Eastern", + } + } + "Indian:Reunion"{ + { + "Reunion", + } + } + "MST7MDT"{ + { + "America_Mountain", + } + } + "PST8PDT"{ + { + "America_Pacific", + } + } + "Pacific:Apia"{ + { + "Apia", + } + } + "Pacific:Auckland"{ + { + "New_Zealand", + } + } + "Pacific:Bougainville"{ + { + "Papua_New_Guinea", + "1970-01-01 00:00", + "2014-12-27 16:00", + } + } + "Pacific:Chatham"{ + { + "Chatham", + } + } + "Pacific:Easter"{ + { + "Easter", + } + } + "Pacific:Efate"{ + { + "Vanuatu", + } + } + "Pacific:Enderbury"{ + { + "Phoenix_Islands", + } + } + "Pacific:Fakaofo"{ + { + "Tokelau", + } + } + "Pacific:Fiji"{ + { + "Fiji", + } + } + "Pacific:Funafuti"{ + { + "Tuvalu", + } + } + "Pacific:Galapagos"{ + { + "Ecuador", + "1970-01-01 00:00", + "1986-01-01 05:00", + } + { + "Galapagos", + "1986-01-01 05:00", + "9999-12-31 23:59", + } + } + "Pacific:Gambier"{ + { + "Gambier", + } + } + "Pacific:Guadalcanal"{ + { + "Solomon", + } + } + "Pacific:Guam"{ + { + "Guam", + "1970-01-01 00:00", + "2000-12-22 14:00", + } + { + "Chamorro", + "2000-12-22 14:00", + "9999-12-31 23:59", + } + } + "Pacific:Honolulu"{ + { + "Alaska_Hawaii", + "1970-01-01 00:00", + "1983-10-30 11:00", + } + { + "Hawaii_Aleutian", + "1983-10-30 11:00", + "9999-12-31 23:59", + } + } + "Pacific:Johnston"{ + { + "Alaska_Hawaii", + "1970-01-01 00:00", + "1983-10-30 11:00", + } + { + "Hawaii_Aleutian", + "1983-10-30 11:00", + "9999-12-31 23:59", + } + } + "Pacific:Kiritimati"{ + { + "Line_Islands", + } + } + "Pacific:Kosrae"{ + { + "Kosrae", + } + } + "Pacific:Kwajalein"{ + { + "Kwajalein", + "1970-01-01 00:00", + "1993-08-20 12:00", + } + { + "Marshall_Islands", + "1993-08-20 12:00", + "9999-12-31 23:59", + } + } + "Pacific:Majuro"{ + { + "Marshall_Islands", + } + } + "Pacific:Marquesas"{ + { + "Marquesas", + } + } + "Pacific:Midway"{ + { + "Bering", + "1970-01-01 00:00", + "1983-10-30 12:00", + } + { + "Samoa", + "1983-10-30 12:00", + "9999-12-31 23:59", + } + } + "Pacific:Nauru"{ + { + "Nauru", + } + } + "Pacific:Niue"{ + { + "Niue", + } + } + "Pacific:Norfolk"{ + { + "Norfolk", + } + } + "Pacific:Noumea"{ + { + "New_Caledonia", + } + } + "Pacific:Pago_Pago"{ + { + "Bering", + "1970-01-01 00:00", + "1983-10-30 12:00", + } + { + "Samoa", + "1983-10-30 12:00", + "9999-12-31 23:59", + } + } + "Pacific:Palau"{ + { + "Palau", + } + } + "Pacific:Pitcairn"{ + { + "Pitcairn", + } + } + "Pacific:Ponape"{ + { + "Ponape", + } + } + "Pacific:Port_Moresby"{ + { + "Papua_New_Guinea", + } + } + "Pacific:Rarotonga"{ + { + "Cook", + } + } + "Pacific:Saipan"{ + { + "North_Mariana", + "1970-01-01 00:00", + "2000-12-22 14:00", + } + { + "Chamorro", + "2000-12-22 14:00", + "9999-12-31 23:59", + } + } + "Pacific:Tahiti"{ + { + "Tahiti", + } + } + "Pacific:Tarawa"{ + { + "Gilbert_Islands", + } + } + "Pacific:Tongatapu"{ + { + "Tonga", + } + } + "Pacific:Truk"{ + { + "Truk", + } + } + "Pacific:Wake"{ + { + "Wake", + } + } + "Pacific:Wallis"{ + { + "Wallis", + } + } + } + primaryZones{ + CL{"America/Santiago"} + CN{"Asia/Shanghai"} + DE{"Europe/Berlin"} + EC{"America/Guayaquil"} + ES{"Europe/Madrid"} + MH{"Pacific/Majuro"} + MY{"Asia/Kuala_Lumpur"} + NZ{"Pacific/Auckland"} + PT{"Europe/Lisbon"} + UA{"Europe/Kiev"} + UZ{"Asia/Tashkent"} + } +} diff --git a/intl/tzdata/2015f/timezoneTypes.txt b/intl/tzdata/2015f/timezoneTypes.txt new file mode 100644 index 000000000000..366b101fa14e --- /dev/null +++ b/intl/tzdata/2015f/timezoneTypes.txt @@ -0,0 +1,606 @@ +// *************************************************************************** +// * +// * Copyright (C) 2014 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter +// * Source File: /common/bcp47/timezone.xml +// * +// *************************************************************************** +timezoneTypes:table(nofallback){ + bcpTypeAlias{ + tz{ + aqams{"nzakl"} + cnckg{"cnsha"} + cnhrb{"cnsha"} + cnkhg{"cnurc"} + usnavajo{"usden"} + } + } + typeAlias{ + timezone{ + "Africa:Asmara"{"Africa/Asmera"} + "Africa:Timbuktu"{"Africa/Bamako"} + "America:Argentina:Buenos_Aires"{"America/Buenos_Aires"} + "America:Argentina:Catamarca"{"America/Catamarca"} + "America:Argentina:ComodRivadavia"{"America/Catamarca"} + "America:Argentina:Cordoba"{"America/Cordoba"} + "America:Argentina:Jujuy"{"America/Jujuy"} + "America:Argentina:Mendoza"{"America/Mendoza"} + "America:Atikokan"{"America/Coral_Harbour"} + "America:Atka"{"America/Adak"} + "America:Ensenada"{"America/Tijuana"} + "America:Fort_Wayne"{"America/Indianapolis"} + "America:Indiana:Indianapolis"{"America/Indianapolis"} + "America:Kentucky:Louisville"{"America/Louisville"} + "America:Knox_IN"{"America/Indiana/Knox"} + "America:Porto_Acre"{"America/Rio_Branco"} + "America:Rosario"{"America/Cordoba"} + "America:Shiprock"{"America/Denver"} + "America:Virgin"{"America/St_Thomas"} + "Antarctica:South_Pole"{"Pacific/Auckland"} + "Asia:Ashkhabad"{"Asia/Ashgabat"} + "Asia:Chongqing"{"Asia/Shanghai"} + "Asia:Chungking"{"Asia/Shanghai"} + "Asia:Dacca"{"Asia/Dhaka"} + "Asia:Harbin"{"Asia/Shanghai"} + "Asia:Ho_Chi_Minh"{"Asia/Saigon"} + "Asia:Istanbul"{"Europe/Istanbul"} + "Asia:Kashgar"{"Asia/Urumqi"} + "Asia:Kathmandu"{"Asia/Katmandu"} + "Asia:Kolkata"{"Asia/Calcutta"} + "Asia:Macao"{"Asia/Macau"} + "Asia:Tel_Aviv"{"Asia/Jerusalem"} + "Asia:Thimbu"{"Asia/Thimphu"} + "Asia:Ujung_Pandang"{"Asia/Makassar"} + "Asia:Ulan_Bator"{"Asia/Ulaanbaatar"} + "Atlantic:Faroe"{"Atlantic/Faeroe"} + "Atlantic:Jan_Mayen"{"Arctic/Longyearbyen"} + "Australia:ACT"{"Australia/Sydney"} + "Australia:Canberra"{"Australia/Sydney"} + "Australia:LHI"{"Australia/Lord_Howe"} + "Australia:NSW"{"Australia/Sydney"} + "Australia:North"{"Australia/Darwin"} + "Australia:Queensland"{"Australia/Brisbane"} + "Australia:South"{"Australia/Adelaide"} + "Australia:Tasmania"{"Australia/Hobart"} + "Australia:Victoria"{"Australia/Melbourne"} + "Australia:West"{"Australia/Perth"} + "Australia:Yancowinna"{"Australia/Broken_Hill"} + "Brazil:Acre"{"America/Rio_Branco"} + "Brazil:DeNoronha"{"America/Noronha"} + "Brazil:East"{"America/Sao_Paulo"} + "Brazil:West"{"America/Manaus"} + "Canada:Atlantic"{"America/Halifax"} + "Canada:Central"{"America/Winnipeg"} + "Canada:East-Saskatchewan"{"America/Regina"} + "Canada:Eastern"{"America/Toronto"} + "Canada:Mountain"{"America/Edmonton"} + "Canada:Newfoundland"{"America/St_Johns"} + "Canada:Pacific"{"America/Vancouver"} + "Canada:Saskatchewan"{"America/Regina"} + "Canada:Yukon"{"America/Whitehorse"} + "Chile:Continental"{"America/Santiago"} + "Chile:EasterIsland"{"Pacific/Easter"} + "Etc:GMT+0"{"Etc/GMT"} + "Etc:GMT-0"{"Etc/GMT"} + "Etc:GMT0"{"Etc/GMT"} + "Etc:Greenwich"{"Etc/GMT"} + "Etc:UCT"{"Etc/GMT"} + "Etc:UTC"{"Etc/GMT"} + "Etc:Universal"{"Etc/GMT"} + "Etc:Zulu"{"Etc/GMT"} + "Europe:Belfast"{"Europe/London"} + "Europe:Nicosia"{"Asia/Nicosia"} + "Europe:Tiraspol"{"Europe/Chisinau"} + "Mexico:BajaNorte"{"America/Tijuana"} + "Mexico:BajaSur"{"America/Mazatlan"} + "Mexico:General"{"America/Mexico_City"} + "Pacific:Chuuk"{"Pacific/Truk"} + "Pacific:Pohnpei"{"Pacific/Ponape"} + "Pacific:Samoa"{"Pacific/Pago_Pago"} + "Pacific:Yap"{"Pacific/Truk"} + "US:Alaska"{"America/Anchorage"} + "US:Aleutian"{"America/Adak"} + "US:Arizona"{"America/Phoenix"} + "US:Central"{"America/Chicago"} + "US:East-Indiana"{"America/Indianapolis"} + "US:Eastern"{"America/New_York"} + "US:Hawaii"{"Pacific/Honolulu"} + "US:Indiana-Starke"{"America/Indiana/Knox"} + "US:Michigan"{"America/Detroit"} + "US:Mountain"{"America/Denver"} + "US:Pacific"{"America/Los_Angeles"} + "US:Pacific-New"{"America/Los_Angeles"} + "US:Samoa"{"Pacific/Pago_Pago"} + Cuba{"America/Havana"} + EST{"Etc/GMT+5"} + Egypt{"Africa/Cairo"} + Eire{"Europe/Dublin"} + GB{"Europe/London"} + GB-Eire{"Europe/London"} + GMT{"Etc/GMT"} + GMT+0{"Etc/GMT"} + GMT-0{"Etc/GMT"} + GMT0{"Etc/GMT"} + Greenwich{"Etc/GMT"} + HST{"Etc/GMT+10"} + Hongkong{"Asia/Hong_Kong"} + Iceland{"Atlantic/Reykjavik"} + Iran{"Asia/Tehran"} + Israel{"Asia/Jerusalem"} + Jamaica{"America/Jamaica"} + Japan{"Asia/Tokyo"} + Kwajalein{"Pacific/Kwajalein"} + Libya{"Africa/Tripoli"} + MST{"Etc/GMT+7"} + NZ{"Pacific/Auckland"} + NZ-CHAT{"Pacific/Chatham"} + Navajo{"America/Denver"} + PRC{"Asia/Shanghai"} + Poland{"Europe/Warsaw"} + Portugal{"Europe/Lisbon"} + ROC{"Asia/Taipei"} + ROK{"Asia/Seoul"} + Singapore{"Asia/Singapore"} + Turkey{"Europe/Istanbul"} + UCT{"Etc/GMT"} + UTC{"Etc/GMT"} + Universal{"Etc/GMT"} + W-SU{"Europe/Moscow"} + Zulu{"Etc/GMT"} + } + } + typeMap{ + timezone{ + "Africa:Abidjan"{"ciabj"} + "Africa:Accra"{"ghacc"} + "Africa:Addis_Ababa"{"etadd"} + "Africa:Algiers"{"dzalg"} + "Africa:Asmera"{"erasm"} + "Africa:Bamako"{"mlbko"} + "Africa:Bangui"{"cfbgf"} + "Africa:Banjul"{"gmbjl"} + "Africa:Bissau"{"gwoxb"} + "Africa:Blantyre"{"mwblz"} + "Africa:Brazzaville"{"cgbzv"} + "Africa:Bujumbura"{"bibjm"} + "Africa:Cairo"{"egcai"} + "Africa:Casablanca"{"macas"} + "Africa:Ceuta"{"esceu"} + "Africa:Conakry"{"gncky"} + "Africa:Dakar"{"sndkr"} + "Africa:Dar_es_Salaam"{"tzdar"} + "Africa:Djibouti"{"djjib"} + "Africa:Douala"{"cmdla"} + "Africa:El_Aaiun"{"eheai"} + "Africa:Freetown"{"slfna"} + "Africa:Gaborone"{"bwgbe"} + "Africa:Harare"{"zwhre"} + "Africa:Johannesburg"{"zajnb"} + "Africa:Juba"{"ssjub"} + "Africa:Kampala"{"ugkla"} + "Africa:Khartoum"{"sdkrt"} + "Africa:Kigali"{"rwkgl"} + "Africa:Kinshasa"{"cdfih"} + "Africa:Lagos"{"nglos"} + "Africa:Libreville"{"galbv"} + "Africa:Lome"{"tglfw"} + "Africa:Luanda"{"aolad"} + "Africa:Lubumbashi"{"cdfbm"} + "Africa:Lusaka"{"zmlun"} + "Africa:Malabo"{"gqssg"} + "Africa:Maputo"{"mzmpm"} + "Africa:Maseru"{"lsmsu"} + "Africa:Mbabane"{"szqmn"} + "Africa:Mogadishu"{"somgq"} + "Africa:Monrovia"{"lrmlw"} + "Africa:Nairobi"{"kenbo"} + "Africa:Ndjamena"{"tdndj"} + "Africa:Niamey"{"nenim"} + "Africa:Nouakchott"{"mrnkc"} + "Africa:Ouagadougou"{"bfoua"} + "Africa:Porto-Novo"{"bjptn"} + "Africa:Sao_Tome"{"sttms"} + "Africa:Tripoli"{"lytip"} + "Africa:Tunis"{"tntun"} + "Africa:Windhoek"{"nawdh"} + "America:Adak"{"usadk"} + "America:Anchorage"{"usanc"} + "America:Anguilla"{"aiaxa"} + "America:Antigua"{"aganu"} + "America:Araguaina"{"braux"} + "America:Argentina:La_Rioja"{"arirj"} + "America:Argentina:Rio_Gallegos"{"arrgl"} + "America:Argentina:Salta"{"arsla"} + "America:Argentina:San_Juan"{"aruaq"} + "America:Argentina:San_Luis"{"arluq"} + "America:Argentina:Tucuman"{"artuc"} + "America:Argentina:Ushuaia"{"arush"} + "America:Aruba"{"awaua"} + "America:Asuncion"{"pyasu"} + "America:Bahia"{"brssa"} + "America:Bahia_Banderas"{"mxpvr"} + "America:Barbados"{"bbbgi"} + "America:Belem"{"brbel"} + "America:Belize"{"bzbze"} + "America:Blanc-Sablon"{"caybx"} + "America:Boa_Vista"{"brbvb"} + "America:Bogota"{"cobog"} + "America:Boise"{"usboi"} + "America:Buenos_Aires"{"arbue"} + "America:Cambridge_Bay"{"caycb"} + "America:Campo_Grande"{"brcgr"} + "America:Cancun"{"mxcun"} + "America:Caracas"{"veccs"} + "America:Catamarca"{"arctc"} + "America:Cayenne"{"gfcay"} + "America:Cayman"{"kygec"} + "America:Chicago"{"uschi"} + "America:Chihuahua"{"mxchi"} + "America:Coral_Harbour"{"cayzs"} + "America:Cordoba"{"arcor"} + "America:Costa_Rica"{"crsjo"} + "America:Creston"{"cacfq"} + "America:Cuiaba"{"brcgb"} + "America:Curacao"{"ancur"} + "America:Danmarkshavn"{"gldkshvn"} + "America:Dawson"{"cayda"} + "America:Dawson_Creek"{"caydq"} + "America:Denver"{"usden"} + "America:Detroit"{"usdet"} + "America:Dominica"{"dmdom"} + "America:Edmonton"{"caedm"} + "America:Eirunepe"{"brern"} + "America:El_Salvador"{"svsal"} + "America:Fortaleza"{"brfor"} + "America:Glace_Bay"{"caglb"} + "America:Godthab"{"glgoh"} + "America:Goose_Bay"{"cagoo"} + "America:Grand_Turk"{"tcgdt"} + "America:Grenada"{"gdgnd"} + "America:Guadeloupe"{"gpbbr"} + "America:Guatemala"{"gtgua"} + "America:Guayaquil"{"ecgye"} + "America:Guyana"{"gygeo"} + "America:Halifax"{"cahal"} + "America:Havana"{"cuhav"} + "America:Hermosillo"{"mxhmo"} + "America:Indiana:Knox"{"usknx"} + "America:Indiana:Marengo"{"usaeg"} + "America:Indiana:Petersburg"{"uswsq"} + "America:Indiana:Tell_City"{"ustel"} + "America:Indiana:Vevay"{"usinvev"} + "America:Indiana:Vincennes"{"usoea"} + "America:Indiana:Winamac"{"uswlz"} + "America:Indianapolis"{"usind"} + "America:Inuvik"{"cayev"} + "America:Iqaluit"{"caiql"} + "America:Jamaica"{"jmkin"} + "America:Jujuy"{"arjuj"} + "America:Juneau"{"usjnu"} + "America:Kentucky:Monticello"{"usmoc"} + "America:Kralendijk"{"bqkra"} + "America:La_Paz"{"bolpb"} + "America:Lima"{"pelim"} + "America:Los_Angeles"{"uslax"} + "America:Louisville"{"uslui"} + "America:Lower_Princes"{"sxphi"} + "America:Maceio"{"brmcz"} + "America:Managua"{"nimga"} + "America:Manaus"{"brmao"} + "America:Marigot"{"gpmsb"} + "America:Martinique"{"mqfdf"} + "America:Matamoros"{"mxmam"} + "America:Mazatlan"{"mxmzt"} + "America:Mendoza"{"armdz"} + "America:Menominee"{"usmnm"} + "America:Merida"{"mxmid"} + "America:Metlakatla"{"usmtm"} + "America:Mexico_City"{"mxmex"} + "America:Miquelon"{"pmmqc"} + "America:Moncton"{"camon"} + "America:Monterrey"{"mxmty"} + "America:Montevideo"{"uymvd"} + "America:Montreal"{"camtr"} + "America:Montserrat"{"msmni"} + "America:Nassau"{"bsnas"} + "America:New_York"{"usnyc"} + "America:Nipigon"{"canpg"} + "America:Nome"{"usome"} + "America:Noronha"{"brfen"} + "America:North_Dakota:Beulah"{"usxul"} + "America:North_Dakota:Center"{"usndcnt"} + "America:North_Dakota:New_Salem"{"usndnsl"} + "America:Ojinaga"{"mxoji"} + "America:Panama"{"papty"} + "America:Pangnirtung"{"capnt"} + "America:Paramaribo"{"srpbm"} + "America:Phoenix"{"usphx"} + "America:Port-au-Prince"{"htpap"} + "America:Port_of_Spain"{"ttpos"} + "America:Porto_Velho"{"brpvh"} + "America:Puerto_Rico"{"prsju"} + "America:Rainy_River"{"caffs"} + "America:Rankin_Inlet"{"cayek"} + "America:Recife"{"brrec"} + "America:Regina"{"careg"} + "America:Resolute"{"careb"} + "America:Rio_Branco"{"brrbr"} + "America:Santa_Isabel"{"mxstis"} + "America:Santarem"{"brstm"} + "America:Santiago"{"clscl"} + "America:Santo_Domingo"{"dosdq"} + "America:Sao_Paulo"{"brsao"} + "America:Scoresbysund"{"globy"} + "America:Sitka"{"ussit"} + "America:St_Barthelemy"{"gpsbh"} + "America:St_Johns"{"casjf"} + "America:St_Kitts"{"knbas"} + "America:St_Lucia"{"lccas"} + "America:St_Thomas"{"vistt"} + "America:St_Vincent"{"vcsvd"} + "America:Swift_Current"{"cayyn"} + "America:Tegucigalpa"{"hntgu"} + "America:Thule"{"glthu"} + "America:Thunder_Bay"{"cathu"} + "America:Tijuana"{"mxtij"} + "America:Toronto"{"cator"} + "America:Tortola"{"vgtov"} + "America:Vancouver"{"cavan"} + "America:Whitehorse"{"cayxy"} + "America:Winnipeg"{"cawnp"} + "America:Yakutat"{"usyak"} + "America:Yellowknife"{"cayzf"} + "Antarctica:Casey"{"aqcas"} + "Antarctica:Davis"{"aqdav"} + "Antarctica:DumontDUrville"{"aqddu"} + "Antarctica:Macquarie"{"aumqi"} + "Antarctica:Mawson"{"aqmaw"} + "Antarctica:McMurdo"{"aqmcm"} + "Antarctica:Palmer"{"aqplm"} + "Antarctica:Rothera"{"aqrot"} + "Antarctica:Syowa"{"aqsyw"} + "Antarctica:Troll"{"aqtrl"} + "Antarctica:Vostok"{"aqvos"} + "Arctic:Longyearbyen"{"sjlyr"} + "Asia:Aden"{"yeade"} + "Asia:Almaty"{"kzala"} + "Asia:Amman"{"joamm"} + "Asia:Anadyr"{"rudyr"} + "Asia:Aqtau"{"kzaau"} + "Asia:Aqtobe"{"kzakx"} + "Asia:Ashgabat"{"tmasb"} + "Asia:Baghdad"{"iqbgw"} + "Asia:Bahrain"{"bhbah"} + "Asia:Baku"{"azbak"} + "Asia:Bangkok"{"thbkk"} + "Asia:Beirut"{"lbbey"} + "Asia:Bishkek"{"kgfru"} + "Asia:Brunei"{"bnbwn"} + "Asia:Calcutta"{"inccu"} + "Asia:Chita"{"ruchita"} + "Asia:Choibalsan"{"mncoq"} + "Asia:Colombo"{"lkcmb"} + "Asia:Damascus"{"sydam"} + "Asia:Dhaka"{"bddac"} + "Asia:Dili"{"tldil"} + "Asia:Dubai"{"aedxb"} + "Asia:Dushanbe"{"tjdyu"} + "Asia:Gaza"{"gaza"} + "Asia:Hebron"{"hebron"} + "Asia:Hong_Kong"{"hkhkg"} + "Asia:Hovd"{"mnhvd"} + "Asia:Irkutsk"{"ruikt"} + "Asia:Jakarta"{"idjkt"} + "Asia:Jayapura"{"iddjj"} + "Asia:Jerusalem"{"jeruslm"} + "Asia:Kabul"{"afkbl"} + "Asia:Kamchatka"{"rupkc"} + "Asia:Karachi"{"pkkhi"} + "Asia:Katmandu"{"npktm"} + "Asia:Khandyga"{"rukhndg"} + "Asia:Krasnoyarsk"{"rukra"} + "Asia:Kuala_Lumpur"{"mykul"} + "Asia:Kuching"{"mykch"} + "Asia:Kuwait"{"kwkwi"} + "Asia:Macau"{"momfm"} + "Asia:Magadan"{"rugdx"} + "Asia:Makassar"{"idmak"} + "Asia:Manila"{"phmnl"} + "Asia:Muscat"{"ommct"} + "Asia:Nicosia"{"cynic"} + "Asia:Novokuznetsk"{"runoz"} + "Asia:Novosibirsk"{"ruovb"} + "Asia:Omsk"{"ruoms"} + "Asia:Oral"{"kzura"} + "Asia:Phnom_Penh"{"khpnh"} + "Asia:Pontianak"{"idpnk"} + "Asia:Pyongyang"{"kpfnj"} + "Asia:Qatar"{"qadoh"} + "Asia:Qyzylorda"{"kzkzo"} + "Asia:Rangoon"{"mmrgn"} + "Asia:Riyadh"{"saruh"} + "Asia:Saigon"{"vnsgn"} + "Asia:Sakhalin"{"ruuus"} + "Asia:Samarkand"{"uzskd"} + "Asia:Seoul"{"krsel"} + "Asia:Shanghai"{"cnsha"} + "Asia:Singapore"{"sgsin"} + "Asia:Srednekolymsk"{"rusred"} + "Asia:Taipei"{"twtpe"} + "Asia:Tashkent"{"uztas"} + "Asia:Tbilisi"{"getbs"} + "Asia:Tehran"{"irthr"} + "Asia:Thimphu"{"btthi"} + "Asia:Tokyo"{"jptyo"} + "Asia:Ulaanbaatar"{"mnuln"} + "Asia:Urumqi"{"cnurc"} + "Asia:Ust-Nera"{"ruunera"} + "Asia:Vientiane"{"lavte"} + "Asia:Vladivostok"{"ruvvo"} + "Asia:Yakutsk"{"ruyks"} + "Asia:Yekaterinburg"{"ruyek"} + "Asia:Yerevan"{"amevn"} + "Atlantic:Azores"{"ptpdl"} + "Atlantic:Bermuda"{"bmbda"} + "Atlantic:Canary"{"eslpa"} + "Atlantic:Cape_Verde"{"cvrai"} + "Atlantic:Faeroe"{"fotho"} + "Atlantic:Madeira"{"ptfnc"} + "Atlantic:Reykjavik"{"isrey"} + "Atlantic:South_Georgia"{"gsgrv"} + "Atlantic:St_Helena"{"shshn"} + "Atlantic:Stanley"{"fkpsy"} + "Australia:Adelaide"{"auadl"} + "Australia:Brisbane"{"aubne"} + "Australia:Broken_Hill"{"aubhq"} + "Australia:Currie"{"aukns"} + "Australia:Darwin"{"audrw"} + "Australia:Eucla"{"aueuc"} + "Australia:Hobart"{"auhba"} + "Australia:Lindeman"{"auldc"} + "Australia:Lord_Howe"{"auldh"} + "Australia:Melbourne"{"aumel"} + "Australia:Perth"{"auper"} + "Australia:Sydney"{"ausyd"} + "Etc:GMT"{"utc"} + "Etc:GMT+1"{"utcw01"} + "Etc:GMT+10"{"utcw10"} + "Etc:GMT+11"{"utcw11"} + "Etc:GMT+12"{"utcw12"} + "Etc:GMT+2"{"utcw02"} + "Etc:GMT+3"{"utcw03"} + "Etc:GMT+4"{"utcw04"} + "Etc:GMT+5"{"utcw05"} + "Etc:GMT+6"{"utcw06"} + "Etc:GMT+7"{"utcw07"} + "Etc:GMT+8"{"utcw08"} + "Etc:GMT+9"{"utcw09"} + "Etc:GMT-1"{"utce01"} + "Etc:GMT-10"{"utce10"} + "Etc:GMT-11"{"utce11"} + "Etc:GMT-12"{"utce12"} + "Etc:GMT-13"{"utce13"} + "Etc:GMT-14"{"utce14"} + "Etc:GMT-2"{"utce02"} + "Etc:GMT-3"{"utce03"} + "Etc:GMT-4"{"utce04"} + "Etc:GMT-5"{"utce05"} + "Etc:GMT-6"{"utce06"} + "Etc:GMT-7"{"utce07"} + "Etc:GMT-8"{"utce08"} + "Etc:GMT-9"{"utce09"} + "Etc:Unknown"{"unk"} + "Europe:Amsterdam"{"nlams"} + "Europe:Andorra"{"adalv"} + "Europe:Athens"{"grath"} + "Europe:Belgrade"{"rsbeg"} + "Europe:Berlin"{"deber"} + "Europe:Bratislava"{"skbts"} + "Europe:Brussels"{"bebru"} + "Europe:Bucharest"{"robuh"} + "Europe:Budapest"{"hubud"} + "Europe:Busingen"{"debsngn"} + "Europe:Chisinau"{"mdkiv"} + "Europe:Copenhagen"{"dkcph"} + "Europe:Dublin"{"iedub"} + "Europe:Gibraltar"{"gigib"} + "Europe:Guernsey"{"gggci"} + "Europe:Helsinki"{"fihel"} + "Europe:Isle_of_Man"{"imdgs"} + "Europe:Istanbul"{"trist"} + "Europe:Jersey"{"jesth"} + "Europe:Kaliningrad"{"rukgd"} + "Europe:Kiev"{"uaiev"} + "Europe:Lisbon"{"ptlis"} + "Europe:Ljubljana"{"silju"} + "Europe:London"{"gblon"} + "Europe:Luxembourg"{"lulux"} + "Europe:Madrid"{"esmad"} + "Europe:Malta"{"mtmla"} + "Europe:Mariehamn"{"fimhq"} + "Europe:Minsk"{"bymsq"} + "Europe:Monaco"{"mcmon"} + "Europe:Moscow"{"rumow"} + "Europe:Oslo"{"noosl"} + "Europe:Paris"{"frpar"} + "Europe:Podgorica"{"metgd"} + "Europe:Prague"{"czprg"} + "Europe:Riga"{"lvrix"} + "Europe:Rome"{"itrom"} + "Europe:Samara"{"rukuf"} + "Europe:San_Marino"{"smsai"} + "Europe:Sarajevo"{"basjj"} + "Europe:Simferopol"{"uasip"} + "Europe:Skopje"{"mkskp"} + "Europe:Sofia"{"bgsof"} + "Europe:Stockholm"{"sesto"} + "Europe:Tallinn"{"eetll"} + "Europe:Tirane"{"altia"} + "Europe:Uzhgorod"{"uauzh"} + "Europe:Vaduz"{"livdz"} + "Europe:Vatican"{"vavat"} + "Europe:Vienna"{"atvie"} + "Europe:Vilnius"{"ltvno"} + "Europe:Volgograd"{"ruvog"} + "Europe:Warsaw"{"plwaw"} + "Europe:Zagreb"{"hrzag"} + "Europe:Zaporozhye"{"uaozh"} + "Europe:Zurich"{"chzrh"} + "Indian:Antananarivo"{"mgtnr"} + "Indian:Chagos"{"iodga"} + "Indian:Christmas"{"cxxch"} + "Indian:Cocos"{"cccck"} + "Indian:Comoro"{"kmyva"} + "Indian:Kerguelen"{"tfpfr"} + "Indian:Mahe"{"scmaw"} + "Indian:Maldives"{"mvmle"} + "Indian:Mauritius"{"muplu"} + "Indian:Mayotte"{"ytmam"} + "Indian:Reunion"{"rereu"} + "Pacific:Apia"{"wsapw"} + "Pacific:Auckland"{"nzakl"} + "Pacific:Bougainville"{"pgraw"} + "Pacific:Chatham"{"nzcht"} + "Pacific:Easter"{"clipc"} + "Pacific:Efate"{"vuvli"} + "Pacific:Enderbury"{"kipho"} + "Pacific:Fakaofo"{"tkfko"} + "Pacific:Fiji"{"fjsuv"} + "Pacific:Funafuti"{"tvfun"} + "Pacific:Galapagos"{"ecgps"} + "Pacific:Gambier"{"pfgmr"} + "Pacific:Guadalcanal"{"sbhir"} + "Pacific:Guam"{"gugum"} + "Pacific:Honolulu"{"ushnl"} + "Pacific:Johnston"{"umjon"} + "Pacific:Kiritimati"{"kicxi"} + "Pacific:Kosrae"{"fmksa"} + "Pacific:Kwajalein"{"mhkwa"} + "Pacific:Majuro"{"mhmaj"} + "Pacific:Marquesas"{"pfnhv"} + "Pacific:Midway"{"ummdy"} + "Pacific:Nauru"{"nrinu"} + "Pacific:Niue"{"nuiue"} + "Pacific:Norfolk"{"nfnlk"} + "Pacific:Noumea"{"ncnou"} + "Pacific:Pago_Pago"{"asppg"} + "Pacific:Palau"{"pwror"} + "Pacific:Pitcairn"{"pnpcn"} + "Pacific:Ponape"{"fmpni"} + "Pacific:Port_Moresby"{"pgpom"} + "Pacific:Rarotonga"{"ckrar"} + "Pacific:Saipan"{"mpspn"} + "Pacific:Tahiti"{"pfppt"} + "Pacific:Tarawa"{"kitrw"} + "Pacific:Tongatapu"{"totbu"} + "Pacific:Truk"{"fmtkk"} + "Pacific:Wake"{"umawk"} + "Pacific:Wallis"{"wfmau"} + CST6CDT{"cst6cdt"} + EST5EDT{"est5edt"} + MST7MDT{"mst7mdt"} + PST8PDT{"pst8pdt"} + } + } +} diff --git a/intl/tzdata/2015f/windowsZones.txt b/intl/tzdata/2015f/windowsZones.txt new file mode 100644 index 000000000000..061e3c4f7a75 --- /dev/null +++ b/intl/tzdata/2015f/windowsZones.txt @@ -0,0 +1,701 @@ +// *************************************************************************** +// * +// * Copyright (C) 2015 International Business Machines +// * Corporation and others. All Rights Reserved. +// * Tool: org.unicode.cldr.icu.NewLdml2IcuConverter +// * Source File: /windowsZones.xml +// * +// *************************************************************************** +windowsZones:table(nofallback){ + mapTimezones{ + "AUS Central Standard Time"{ + 001{"Australia/Darwin"} + AU{"Australia/Darwin"} + } + "AUS Eastern Standard Time"{ + 001{"Australia/Sydney"} + AU{"Australia/Sydney Australia/Melbourne"} + } + "Afghanistan Standard Time"{ + 001{"Asia/Kabul"} + AF{"Asia/Kabul"} + } + "Alaskan Standard Time"{ + 001{"America/Anchorage"} + US{ + "America/Anchorage America/Juneau America/Nome America/Sitka America/" + "Yakutat" + } + } + "Arab Standard Time"{ + 001{"Asia/Riyadh"} + BH{"Asia/Bahrain"} + KW{"Asia/Kuwait"} + QA{"Asia/Qatar"} + SA{"Asia/Riyadh"} + YE{"Asia/Aden"} + } + "Arabian Standard Time"{ + 001{"Asia/Dubai"} + AE{"Asia/Dubai"} + OM{"Asia/Muscat"} + ZZ{"Etc/GMT-4"} + } + "Arabic Standard Time"{ + 001{"Asia/Baghdad"} + IQ{"Asia/Baghdad"} + } + "Argentina Standard Time"{ + 001{"America/Buenos_Aires"} + AR{ + "America/Buenos_Aires America/Argentina/La_Rioja America/Argentina/Ri" + "o_Gallegos America/Argentina/Salta America/Argentina/San_Juan Americ" + "a/Argentina/San_Luis America/Argentina/Tucuman America/Argentina/Ush" + "uaia America/Catamarca America/Cordoba America/Jujuy America/Mendoza" + } + } + "Atlantic Standard Time"{ + 001{"America/Halifax"} + BM{"Atlantic/Bermuda"} + CA{"America/Halifax America/Glace_Bay America/Goose_Bay America/Moncton"} + GL{"America/Thule"} + } + "Azerbaijan Standard Time"{ + 001{"Asia/Baku"} + AZ{"Asia/Baku"} + } + "Azores Standard Time"{ + 001{"Atlantic/Azores"} + GL{"America/Scoresbysund"} + PT{"Atlantic/Azores"} + } + "Bahia Standard Time"{ + 001{"America/Bahia"} + BR{"America/Bahia"} + } + "Bangladesh Standard Time"{ + 001{"Asia/Dhaka"} + BD{"Asia/Dhaka"} + BT{"Asia/Thimphu"} + } + "Belarus Standard Time"{ + 001{"Europe/Minsk"} + BY{"Europe/Minsk"} + } + "Canada Central Standard Time"{ + 001{"America/Regina"} + CA{"America/Regina America/Swift_Current"} + } + "Cape Verde Standard Time"{ + 001{"Atlantic/Cape_Verde"} + CV{"Atlantic/Cape_Verde"} + ZZ{"Etc/GMT+1"} + } + "Caucasus Standard Time"{ + 001{"Asia/Yerevan"} + AM{"Asia/Yerevan"} + } + "Cen. Australia Standard Time"{ + 001{"Australia/Adelaide"} + AU{"Australia/Adelaide Australia/Broken_Hill"} + } + "Central America Standard Time"{ + 001{"America/Guatemala"} + BZ{"America/Belize"} + CR{"America/Costa_Rica"} + EC{"Pacific/Galapagos"} + GT{"America/Guatemala"} + HN{"America/Tegucigalpa"} + NI{"America/Managua"} + SV{"America/El_Salvador"} + ZZ{"Etc/GMT+6"} + } + "Central Asia Standard Time"{ + 001{"Asia/Almaty"} + AQ{"Antarctica/Vostok"} + CN{"Asia/Urumqi"} + IO{"Indian/Chagos"} + KG{"Asia/Bishkek"} + KZ{"Asia/Almaty Asia/Qyzylorda"} + ZZ{"Etc/GMT-6"} + } + "Central Brazilian Standard Time"{ + 001{"America/Cuiaba"} + BR{"America/Cuiaba America/Campo_Grande"} + } + "Central Europe Standard Time"{ + 001{"Europe/Budapest"} + AL{"Europe/Tirane"} + CZ{"Europe/Prague"} + HU{"Europe/Budapest"} + ME{"Europe/Podgorica"} + RS{"Europe/Belgrade"} + SI{"Europe/Ljubljana"} + SK{"Europe/Bratislava"} + } + "Central European Standard Time"{ + 001{"Europe/Warsaw"} + BA{"Europe/Sarajevo"} + HR{"Europe/Zagreb"} + MK{"Europe/Skopje"} + PL{"Europe/Warsaw"} + } + "Central Pacific Standard Time"{ + 001{"Pacific/Guadalcanal"} + AU{"Antarctica/Macquarie"} + FM{"Pacific/Ponape Pacific/Kosrae"} + NC{"Pacific/Noumea"} + PG{"Pacific/Bougainville"} + SB{"Pacific/Guadalcanal"} + VU{"Pacific/Efate"} + ZZ{"Etc/GMT-11"} + } + "Central Standard Time (Mexico)"{ + 001{"America/Mexico_City"} + MX{ + "America/Mexico_City America/Bahia_Banderas America/Merida America/Mo" + "nterrey" + } + } + "Central Standard Time"{ + 001{"America/Chicago"} + CA{ + "America/Winnipeg America/Rainy_River America/Rankin_Inlet America/Re" + "solute" + } + MX{"America/Matamoros"} + US{ + "America/Chicago America/Indiana/Knox America/Indiana/Tell_City Ameri" + "ca/Menominee America/North_Dakota/Beulah America/North_Dakota/Center" + " America/North_Dakota/New_Salem" + } + ZZ{"CST6CDT"} + } + "China Standard Time"{ + 001{"Asia/Shanghai"} + CN{"Asia/Shanghai"} + HK{"Asia/Hong_Kong"} + MO{"Asia/Macau"} + } + "Dateline Standard Time"{ + 001{"Etc/GMT+12"} + ZZ{"Etc/GMT+12"} + } + "E. Africa Standard Time"{ + 001{"Africa/Nairobi"} + AQ{"Antarctica/Syowa"} + DJ{"Africa/Djibouti"} + ER{"Africa/Asmera"} + ET{"Africa/Addis_Ababa"} + KE{"Africa/Nairobi"} + KM{"Indian/Comoro"} + MG{"Indian/Antananarivo"} + SD{"Africa/Khartoum"} + SO{"Africa/Mogadishu"} + SS{"Africa/Juba"} + TZ{"Africa/Dar_es_Salaam"} + UG{"Africa/Kampala"} + YT{"Indian/Mayotte"} + ZZ{"Etc/GMT-3"} + } + "E. Australia Standard Time"{ + 001{"Australia/Brisbane"} + AU{"Australia/Brisbane Australia/Lindeman"} + } + "E. South America Standard Time"{ + 001{"America/Sao_Paulo"} + BR{"America/Sao_Paulo"} + } + "Eastern Standard Time (Mexico)"{ + 001{"America/Cancun"} + MX{"America/Cancun"} + } + "Eastern Standard Time"{ + 001{"America/New_York"} + BS{"America/Nassau"} + CA{ + "America/Toronto America/Iqaluit America/Montreal America/Nipigon Ame" + "rica/Pangnirtung America/Thunder_Bay" + } + CU{"America/Havana"} + HT{"America/Port-au-Prince"} + US{ + "America/New_York America/Detroit America/Indiana/Petersburg America/" + "Indiana/Vincennes America/Indiana/Winamac America/Kentucky/Monticell" + "o America/Louisville" + } + ZZ{"EST5EDT"} + } + "Egypt Standard Time"{ + 001{"Africa/Cairo"} + EG{"Africa/Cairo"} + } + "Ekaterinburg Standard Time"{ + 001{"Asia/Yekaterinburg"} + RU{"Asia/Yekaterinburg"} + } + "FLE Standard Time"{ + 001{"Europe/Kiev"} + AX{"Europe/Mariehamn"} + BG{"Europe/Sofia"} + EE{"Europe/Tallinn"} + FI{"Europe/Helsinki"} + LT{"Europe/Vilnius"} + LV{"Europe/Riga"} + UA{"Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye"} + } + "Fiji Standard Time"{ + 001{"Pacific/Fiji"} + FJ{"Pacific/Fiji"} + } + "GMT Standard Time"{ + 001{"Europe/London"} + ES{"Atlantic/Canary"} + FO{"Atlantic/Faeroe"} + GB{"Europe/London"} + GG{"Europe/Guernsey"} + IE{"Europe/Dublin"} + IM{"Europe/Isle_of_Man"} + JE{"Europe/Jersey"} + PT{"Europe/Lisbon Atlantic/Madeira"} + } + "GTB Standard Time"{ + 001{"Europe/Bucharest"} + CY{"Asia/Nicosia"} + GR{"Europe/Athens"} + MD{"Europe/Chisinau"} + RO{"Europe/Bucharest"} + } + "Georgian Standard Time"{ + 001{"Asia/Tbilisi"} + GE{"Asia/Tbilisi"} + } + "Greenland Standard Time"{ + 001{"America/Godthab"} + GL{"America/Godthab"} + } + "Greenwich Standard Time"{ + 001{"Atlantic/Reykjavik"} + BF{"Africa/Ouagadougou"} + CI{"Africa/Abidjan"} + GH{"Africa/Accra"} + GM{"Africa/Banjul"} + GN{"Africa/Conakry"} + GW{"Africa/Bissau"} + IS{"Atlantic/Reykjavik"} + LR{"Africa/Monrovia"} + ML{"Africa/Bamako"} + MR{"Africa/Nouakchott"} + SH{"Atlantic/St_Helena"} + SL{"Africa/Freetown"} + SN{"Africa/Dakar"} + ST{"Africa/Sao_Tome"} + TG{"Africa/Lome"} + } + "Hawaiian Standard Time"{ + 001{"Pacific/Honolulu"} + CK{"Pacific/Rarotonga"} + PF{"Pacific/Tahiti"} + UM{"Pacific/Johnston"} + US{"Pacific/Honolulu"} + ZZ{"Etc/GMT+10"} + } + "India Standard Time"{ + 001{"Asia/Calcutta"} + IN{"Asia/Calcutta"} + } + "Iran Standard Time"{ + 001{"Asia/Tehran"} + IR{"Asia/Tehran"} + } + "Israel Standard Time"{ + 001{"Asia/Jerusalem"} + IL{"Asia/Jerusalem"} + } + "Jordan Standard Time"{ + 001{"Asia/Amman"} + JO{"Asia/Amman"} + } + "Kaliningrad Standard Time"{ + 001{"Europe/Kaliningrad"} + RU{"Europe/Kaliningrad"} + } + "Korea Standard Time"{ + 001{"Asia/Seoul"} + KR{"Asia/Seoul"} + } + "Libya Standard Time"{ + 001{"Africa/Tripoli"} + LY{"Africa/Tripoli"} + } + "Line Islands Standard Time"{ + 001{"Pacific/Kiritimati"} + KI{"Pacific/Kiritimati"} + ZZ{"Etc/GMT-14"} + } + "Magadan Standard Time"{ + 001{"Asia/Magadan"} + RU{"Asia/Magadan"} + } + "Mauritius Standard Time"{ + 001{"Indian/Mauritius"} + MU{"Indian/Mauritius"} + RE{"Indian/Reunion"} + SC{"Indian/Mahe"} + } + "Middle East Standard Time"{ + 001{"Asia/Beirut"} + LB{"Asia/Beirut"} + } + "Montevideo Standard Time"{ + 001{"America/Montevideo"} + UY{"America/Montevideo"} + } + "Morocco Standard Time"{ + 001{"Africa/Casablanca"} + EH{"Africa/El_Aaiun"} + MA{"Africa/Casablanca"} + } + "Mountain Standard Time (Mexico)"{ + 001{"America/Chihuahua"} + MX{"America/Chihuahua America/Mazatlan"} + } + "Mountain Standard Time"{ + 001{"America/Denver"} + CA{ + "America/Edmonton America/Cambridge_Bay America/Inuvik America/Yellow" + "knife" + } + MX{"America/Ojinaga"} + US{"America/Denver America/Boise"} + ZZ{"MST7MDT"} + } + "Myanmar Standard Time"{ + 001{"Asia/Rangoon"} + CC{"Indian/Cocos"} + MM{"Asia/Rangoon"} + } + "N. Central Asia Standard Time"{ + 001{"Asia/Novosibirsk"} + RU{"Asia/Novosibirsk Asia/Omsk"} + } + "Namibia Standard Time"{ + 001{"Africa/Windhoek"} + NA{"Africa/Windhoek"} + } + "Nepal Standard Time"{ + 001{"Asia/Katmandu"} + NP{"Asia/Katmandu"} + } + "New Zealand Standard Time"{ + 001{"Pacific/Auckland"} + AQ{"Antarctica/McMurdo"} + NZ{"Pacific/Auckland"} + } + "Newfoundland Standard Time"{ + 001{"America/St_Johns"} + CA{"America/St_Johns"} + } + "North Asia East Standard Time"{ + 001{"Asia/Irkutsk"} + RU{"Asia/Irkutsk Asia/Chita"} + } + "North Asia Standard Time"{ + 001{"Asia/Krasnoyarsk"} + RU{"Asia/Krasnoyarsk Asia/Novokuznetsk"} + } + "Pacific SA Standard Time"{ + 001{"America/Santiago"} + AQ{"Antarctica/Palmer"} + CL{"America/Santiago"} + } + "Pacific Standard Time (Mexico)"{ + 001{"America/Santa_Isabel"} + MX{"America/Santa_Isabel"} + } + "Pacific Standard Time"{ + 001{"America/Los_Angeles"} + CA{"America/Vancouver America/Dawson America/Whitehorse"} + MX{"America/Tijuana"} + US{"America/Los_Angeles"} + ZZ{"PST8PDT"} + } + "Pakistan Standard Time"{ + 001{"Asia/Karachi"} + PK{"Asia/Karachi"} + } + "Paraguay Standard Time"{ + 001{"America/Asuncion"} + PY{"America/Asuncion"} + } + "Romance Standard Time"{ + 001{"Europe/Paris"} + BE{"Europe/Brussels"} + DK{"Europe/Copenhagen"} + ES{"Europe/Madrid Africa/Ceuta"} + FR{"Europe/Paris"} + } + "Russia Time Zone 10"{ + 001{"Asia/Srednekolymsk"} + RU{"Asia/Srednekolymsk"} + } + "Russia Time Zone 11"{ + 001{"Asia/Kamchatka"} + RU{"Asia/Kamchatka Asia/Anadyr"} + } + "Russia Time Zone 3"{ + 001{"Europe/Samara"} + RU{"Europe/Samara"} + } + "Russian Standard Time"{ + 001{"Europe/Moscow"} + RU{"Europe/Moscow Europe/Simferopol Europe/Volgograd"} + } + "SA Eastern Standard Time"{ + 001{"America/Cayenne"} + AQ{"Antarctica/Rothera"} + BR{ + "America/Fortaleza America/Araguaina America/Belem America/Maceio Ame" + "rica/Recife America/Santarem" + } + FK{"Atlantic/Stanley"} + GF{"America/Cayenne"} + SR{"America/Paramaribo"} + ZZ{"Etc/GMT+3"} + } + "SA Pacific Standard Time"{ + 001{"America/Bogota"} + BR{"America/Rio_Branco America/Eirunepe"} + CA{"America/Coral_Harbour"} + CO{"America/Bogota"} + EC{"America/Guayaquil"} + JM{"America/Jamaica"} + KY{"America/Cayman"} + PA{"America/Panama"} + PE{"America/Lima"} + ZZ{"Etc/GMT+5"} + } + "SA Western Standard Time"{ + 001{"America/La_Paz"} + AG{"America/Antigua"} + AI{"America/Anguilla"} + AW{"America/Aruba"} + BB{"America/Barbados"} + BL{"America/St_Barthelemy"} + BO{"America/La_Paz"} + BQ{"America/Kralendijk"} + BR{"America/Manaus America/Boa_Vista America/Porto_Velho"} + CA{"America/Blanc-Sablon"} + CW{"America/Curacao"} + DM{"America/Dominica"} + DO{"America/Santo_Domingo"} + GD{"America/Grenada"} + GP{"America/Guadeloupe"} + GY{"America/Guyana"} + KN{"America/St_Kitts"} + LC{"America/St_Lucia"} + MF{"America/Marigot"} + MQ{"America/Martinique"} + MS{"America/Montserrat"} + PR{"America/Puerto_Rico"} + SX{"America/Lower_Princes"} + TC{"America/Grand_Turk"} + TT{"America/Port_of_Spain"} + VC{"America/St_Vincent"} + VG{"America/Tortola"} + VI{"America/St_Thomas"} + ZZ{"Etc/GMT+4"} + } + "SE Asia Standard Time"{ + 001{"Asia/Bangkok"} + AQ{"Antarctica/Davis"} + CX{"Indian/Christmas"} + ID{"Asia/Jakarta Asia/Pontianak"} + KH{"Asia/Phnom_Penh"} + LA{"Asia/Vientiane"} + MN{"Asia/Hovd"} + TH{"Asia/Bangkok"} + VN{"Asia/Saigon"} + ZZ{"Etc/GMT-7"} + } + "Samoa Standard Time"{ + 001{"Pacific/Apia"} + WS{"Pacific/Apia"} + } + "Singapore Standard Time"{ + 001{"Asia/Singapore"} + BN{"Asia/Brunei"} + ID{"Asia/Makassar"} + MY{"Asia/Kuala_Lumpur Asia/Kuching"} + PH{"Asia/Manila"} + SG{"Asia/Singapore"} + ZZ{"Etc/GMT-8"} + } + "South Africa Standard Time"{ + 001{"Africa/Johannesburg"} + BI{"Africa/Bujumbura"} + BW{"Africa/Gaborone"} + CD{"Africa/Lubumbashi"} + LS{"Africa/Maseru"} + MW{"Africa/Blantyre"} + MZ{"Africa/Maputo"} + RW{"Africa/Kigali"} + SZ{"Africa/Mbabane"} + ZA{"Africa/Johannesburg"} + ZM{"Africa/Lusaka"} + ZW{"Africa/Harare"} + ZZ{"Etc/GMT-2"} + } + "Sri Lanka Standard Time"{ + 001{"Asia/Colombo"} + LK{"Asia/Colombo"} + } + "Syria Standard Time"{ + 001{"Asia/Damascus"} + SY{"Asia/Damascus"} + } + "Taipei Standard Time"{ + 001{"Asia/Taipei"} + TW{"Asia/Taipei"} + } + "Tasmania Standard Time"{ + 001{"Australia/Hobart"} + AU{"Australia/Hobart Australia/Currie"} + } + "Tokyo Standard Time"{ + 001{"Asia/Tokyo"} + ID{"Asia/Jayapura"} + JP{"Asia/Tokyo"} + PW{"Pacific/Palau"} + TL{"Asia/Dili"} + ZZ{"Etc/GMT-9"} + } + "Tonga Standard Time"{ + 001{"Pacific/Tongatapu"} + KI{"Pacific/Enderbury"} + TK{"Pacific/Fakaofo"} + TO{"Pacific/Tongatapu"} + ZZ{"Etc/GMT-13"} + } + "Turkey Standard Time"{ + 001{"Europe/Istanbul"} + TR{"Europe/Istanbul"} + } + "US Eastern Standard Time"{ + 001{"America/Indianapolis"} + US{"America/Indianapolis America/Indiana/Marengo America/Indiana/Vevay"} + } + "US Mountain Standard Time"{ + 001{"America/Phoenix"} + CA{"America/Dawson_Creek America/Creston"} + MX{"America/Hermosillo"} + US{"America/Phoenix"} + ZZ{"Etc/GMT+7"} + } + "UTC"{ + 001{"Etc/GMT"} + GL{"America/Danmarkshavn"} + ZZ{"Etc/GMT"} + } + "UTC+12"{ + 001{"Etc/GMT-12"} + KI{"Pacific/Tarawa"} + MH{"Pacific/Majuro Pacific/Kwajalein"} + NR{"Pacific/Nauru"} + TV{"Pacific/Funafuti"} + UM{"Pacific/Wake"} + WF{"Pacific/Wallis"} + ZZ{"Etc/GMT-12"} + } + "UTC-02"{ + 001{"Etc/GMT+2"} + BR{"America/Noronha"} + GS{"Atlantic/South_Georgia"} + ZZ{"Etc/GMT+2"} + } + "UTC-11"{ + 001{"Etc/GMT+11"} + AS{"Pacific/Pago_Pago"} + NU{"Pacific/Niue"} + UM{"Pacific/Midway"} + ZZ{"Etc/GMT+11"} + } + "Ulaanbaatar Standard Time"{ + 001{"Asia/Ulaanbaatar"} + MN{"Asia/Ulaanbaatar Asia/Choibalsan"} + } + "Venezuela Standard Time"{ + 001{"America/Caracas"} + VE{"America/Caracas"} + } + "Vladivostok Standard Time"{ + 001{"Asia/Vladivostok"} + RU{"Asia/Vladivostok Asia/Sakhalin Asia/Ust-Nera"} + } + "W. Australia Standard Time"{ + 001{"Australia/Perth"} + AQ{"Antarctica/Casey"} + AU{"Australia/Perth"} + } + "W. Central Africa Standard Time"{ + 001{"Africa/Lagos"} + AO{"Africa/Luanda"} + BJ{"Africa/Porto-Novo"} + CD{"Africa/Kinshasa"} + CF{"Africa/Bangui"} + CG{"Africa/Brazzaville"} + CM{"Africa/Douala"} + DZ{"Africa/Algiers"} + GA{"Africa/Libreville"} + GQ{"Africa/Malabo"} + NE{"Africa/Niamey"} + NG{"Africa/Lagos"} + TD{"Africa/Ndjamena"} + TN{"Africa/Tunis"} + ZZ{"Etc/GMT-1"} + } + "W. Europe Standard Time"{ + 001{"Europe/Berlin"} + AD{"Europe/Andorra"} + AT{"Europe/Vienna"} + CH{"Europe/Zurich"} + DE{"Europe/Berlin Europe/Busingen"} + GI{"Europe/Gibraltar"} + IT{"Europe/Rome"} + LI{"Europe/Vaduz"} + LU{"Europe/Luxembourg"} + MC{"Europe/Monaco"} + MT{"Europe/Malta"} + NL{"Europe/Amsterdam"} + NO{"Europe/Oslo"} + SE{"Europe/Stockholm"} + SJ{"Arctic/Longyearbyen"} + SM{"Europe/San_Marino"} + VA{"Europe/Vatican"} + } + "West Asia Standard Time"{ + 001{"Asia/Tashkent"} + AQ{"Antarctica/Mawson"} + KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe"} + MV{"Indian/Maldives"} + TF{"Indian/Kerguelen"} + TJ{"Asia/Dushanbe"} + TM{"Asia/Ashgabat"} + UZ{"Asia/Tashkent Asia/Samarkand"} + ZZ{"Etc/GMT-5"} + } + "West Pacific Standard Time"{ + 001{"Pacific/Port_Moresby"} + AQ{"Antarctica/DumontDUrville"} + FM{"Pacific/Truk"} + GU{"Pacific/Guam"} + MP{"Pacific/Saipan"} + PG{"Pacific/Port_Moresby"} + ZZ{"Etc/GMT-10"} + } + "Yakutsk Standard Time"{ + 001{"Asia/Yakutsk"} + RU{"Asia/Yakutsk Asia/Khandyga"} + } + } +} diff --git a/intl/tzdata/2015f/zoneinfo64.txt b/intl/tzdata/2015f/zoneinfo64.txt new file mode 100644 index 000000000000..fa2d65cba3ae --- /dev/null +++ b/intl/tzdata/2015f/zoneinfo64.txt @@ -0,0 +1,3747 @@ +//--------------------------------------------------------- +// Copyright (C) 2003-2015, International Business Machines +// Corporation and others. All Rights Reserved. +//--------------------------------------------------------- +// Build tool: tz2icu +// Build date: Wed Aug 12 12:17:51 2015 +// tz database: ftp://ftp.iana.org/tz/ +// tz version: 2015f +// ICU version: 56.0.1 +//--------------------------------------------------------- +// >> !!! >> THIS IS A MACHINE-GENERATED FILE << !!! << +// >> !!! >>> DO NOT EDIT <<< !!! << +//--------------------------------------------------------- + +zoneinfo64:table(nofallback) { + TZVersion { "2015f" } + Zones:array { + /* ACT */ :int { 347 } //Z#0 + /* AET */ :int { 359 } //Z#1 + /* AGT */ :int { 64 } //Z#2 + /* ART */ :int { 18 } //Z#3 + /* AST */ :int { 60 } //Z#4 + /* Africa/Abidjan */ :table { + trans:intvector { -1830383032 } + typeOffsets:intvector { -968, 0, 0, 0 } + typeMap:bin { "01" } + links:intvector { 5, 11, 13, 21, 22, 27, 38, 51, 52, 54, 55, 339 } + } //Z#5 + /* Africa/Accra */ :table { + trans:intvector { -1640995148, -1556841600, -1546388400, -1525305600, -1514852400, -1493769600, -1483316400, -1462233600, -1451780400, -1430611200, -1420158000, -1399075200, -1388622000, -1367539200, -1357086000, -1336003200, -1325550000, -1304380800, -1293927600, -1272844800, -1262391600, -1241308800, -1230855600, -1209772800, -1199319600, -1178150400, -1167697200, -1146614400, -1136161200, -1115078400, -1104625200, -1083542400, -1073089200, -1051920000, -1041466800, -1020384000, -1009930800, -988848000, -978394800, -957312000, -946858800, -925689600, -915236400, -894153600, -883700400, -862617600, -852164400 } + typeOffsets:intvector { -52, 0, 0, 0, 0, 1200 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#6 + /* Africa/Addis_Ababa */ :int { 48 } //Z#7 + /* Africa/Algiers */ :table { + transPre32:intvector { -1, 1808288224 } + trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1531443600, -956365200, -950486400, -942012000, -812502000, -796262400, -781052400, -766630800, -733280400, -439430400, -212029200, 41468400, 54774000, 231724800, 246236400, 259545600, 275274000, 309740400, 325468800, 341802000, 357523200 } + typeOffsets:intvector { 732, 0, 0, 0, 0, 3600, 561, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "03010201020102010201020102010201040504050401040102010204050401020104" } + } //Z#8 + /* Africa/Asmara */ :int { 48 } //Z#9 + /* Africa/Asmera */ :int { 48 } //Z#10 + /* Africa/Bamako */ :int { 5 } //Z#11 + /* Africa/Bangui */ :int { 36 } //Z#12 + /* Africa/Banjul */ :int { 5 } //Z#13 + /* Africa/Bissau */ :table { + trans:intvector { -1830380260, 157770000 } + typeOffsets:intvector { -3740, 0, -3600, 0, 0, 0 } + typeMap:bin { "0102" } + } //Z#14 + /* Africa/Blantyre */ :int { 43 } //Z#15 + /* Africa/Brazzaville */ :int { 36 } //Z#16 + /* Africa/Bujumbura */ :int { 43 } //Z#17 + /* Africa/Cairo */ :table { + transPre32:intvector { -1, 2109558187 } + trans:intvector { -929844000, -923108400, -906170400, -892868400, -875844000, -857790000, -844308000, -825822000, -812685600, -794199600, -779853600, -762663600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -71107200, -52707600, -39484800, -21171600, -7948800, 10364400, 23587200, 41900400, 55123200, 73522800, 86745600, 105058800, 118281600, 136594800, 149817600, 168130800, 181353600, 199753200, 212976000, 231289200, 244512000, 262825200, 276048000, 294361200, 307584000, 325983600, 339206400, 357519600, 370742400, 396399600, 402278400, 426812400, 433814400, 452214000, 465436800, 483750000, 496972800, 515286000, 528508800, 546822000, 560044800, 578444400, 591667200, 610412400, 623203200, 641516400, 654739200, 673052400, 686275200, 704674800, 717897600, 736210800, 749433600, 767746800, 780969600, 799020000, 812322000, 830469600, 843771600, 861919200, 875221200, 893368800, 906670800, 925423200, 938725200, 956872800, 970174800, 988322400, 1001624400, 1019772000, 1033074000, 1051221600, 1064523600, 1083276000, 1096578000, 1114725600, 1128027600, 1146175200, 1158872400, 1177624800, 1189112400, 1209074400, 1219957200, 1240524000, 1250802000, 1272578400, 1281474000, 1284069600, 1285880400, 1400191200, 1403816400, 1406844000, 1411678800 } + typeOffsets:intvector { 7509, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 3, 18, 393 } + } //Z#18 + /* Africa/Casablanca */ :table { + trans:intvector { -1773012580, -956361600, -950490000, -942019200, -761187600, -617241600, -605149200, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 504918000, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1553997600, 1557021600, 1560045600, 1572141600, 1585447200, 1587261600, 1590285600, 1603591200, 1616896800, 1618106400, 1621130400, 1635645600, 1651975200, 1667095200, 1682215200, 1698544800, 1713060000, 1729994400, 1743904800, 1761444000, 1774749600, 1792893600, 1806199200, 1824948000, 1837648800, 1856397600, 1869098400, 1887847200, 1901152800, 1919296800, 1932602400, 1950746400, 1964052000, 1982800800, 1995501600, 2014250400, 2026951200, 2045700000, 2058400800, 2077149600, 2090455200, 2107994400, 2121904800, 2138234400 } + transPost32:intvector { 0, -2141612896, 0, -2122864096 } + typeOffsets:intvector { -1820, 0, 0, 0, 0, 3600, 3600, 0 } + typeMap:bin { "0102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Morocco" } + finalRaw:int { 0 } + finalYear:int { 2039 } + } //Z#19 + /* Africa/Ceuta */ :table { + transPre32:intvector { -1, 2117515772 } + trans:intvector { -1630112400, -1616810400, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -81432000, -71110800, 141264000, 147222000, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 448243200, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -1276, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#20 + /* Africa/Conakry */ :int { 5 } //Z#21 + /* Africa/Dakar */ :int { 5 } //Z#22 + /* Africa/Dar_es_Salaam */ :int { 48 } //Z#23 + /* Africa/Djibouti */ :int { 48 } //Z#24 + /* Africa/Douala */ :int { 36 } //Z#25 + /* Africa/El_Aaiun */ :table { + trans:intvector { -1136070432, 198291600, 199756800, 207702000, 231292800, 244249200, 265507200, 271033200, 1212278400, 1220223600, 1243814400, 1250809200, 1272758400, 1281222000, 1301788800, 1312066800, 1335664800, 1342749600, 1345428000, 1348970400, 1367114400, 1373162400, 1376100000, 1382839200, 1396144800, 1403920800, 1406944800, 1414288800, 1427594400, 1434247200, 1437271200, 1445738400, 1459044000, 1465092000, 1468116000, 1477792800, 1490493600, 1495332000, 1498960800, 1509242400, 1521943200, 1526176800, 1529200800, 1540692000, 1553997600, 1557021600, 1560045600, 1572141600, 1585447200, 1587261600, 1590285600, 1603591200, 1616896800, 1618106400, 1621130400, 1635645600, 1651975200, 1667095200, 1682215200, 1698544800, 1713060000, 1729994400, 1743904800, 1761444000, 1774749600, 1792893600, 1806199200, 1824948000, 1837648800, 1856397600, 1869098400, 1887847200, 1901152800, 1919296800, 1932602400, 1950746400, 1964052000, 1982800800, 1995501600, 2014250400, 2026951200, 2045700000, 2058400800, 2077149600, 2090455200, 2107994400, 2121904800, 2138234400 } + transPost32:intvector { 0, -2141612896, 0, -2122864096 } + typeOffsets:intvector { -3168, 0, -3600, 0, 0, 0, 0, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Morocco" } + finalRaw:int { 0 } + finalYear:int { 2039 } + } //Z#26 + /* Africa/Freetown */ :int { 5 } //Z#27 + /* Africa/Gaborone */ :int { 43 } //Z#28 + /* Africa/Harare */ :int { 43 } //Z#29 + /* Africa/Johannesburg */ :table { + transPre32:intvector { -1, 1836794176 } + trans:intvector { -2109288600, -860976000, -845254800, -829526400, -813805200 } + typeOffsets:intvector { 6720, 0, 5400, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "010203020302" } + links:intvector { 30, 44, 45 } + } //Z#30 + /* Africa/Juba */ :int { 33 } //Z#31 + /* Africa/Kampala */ :int { 48 } //Z#32 + /* Africa/Khartoum */ :table { + trans:intvector { -1230775808, 10360800, 24786000, 41810400, 56322000, 73432800, 87944400, 104882400, 119480400, 136332000, 151016400, 167781600, 182552400, 199231200, 214174800, 230680800, 245710800, 262735200, 277246800, 294184800, 308782800, 325634400, 340405200, 357084000, 371941200, 388533600, 403477200, 419983200, 435013200, 452037600, 466635600, 483487200, 498171600, 947930400 } + typeOffsets:intvector { 7808, 0, 7200, 0, 7200, 3600, 10800, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } + links:intvector { 31, 33 } + } //Z#33 + /* Africa/Kigali */ :int { 43 } //Z#34 + /* Africa/Kinshasa */ :int { 36 } //Z#35 + /* Africa/Lagos */ :table { + trans:intvector { -1588464816 } + typeOffsets:intvector { 816, 0, 3600, 0 } + typeMap:bin { "01" } + links:intvector { 12, 16, 25, 35, 36, 37, 39, 42, 50, 53 } + } //Z#36 + /* Africa/Libreville */ :int { 36 } //Z#37 + /* Africa/Lome */ :int { 5 } //Z#38 + /* Africa/Luanda */ :int { 36 } //Z#39 + /* Africa/Lubumbashi */ :int { 43 } //Z#40 + /* Africa/Lusaka */ :int { 43 } //Z#41 + /* Africa/Malabo */ :int { 36 } //Z#42 + /* Africa/Maputo */ :table { + trans:intvector { -2109291020 } + typeOffsets:intvector { 7820, 0, 7200, 0 } + typeMap:bin { "01" } + links:intvector { 15, 17, 28, 29, 34, 40, 41, 43, 370 } + } //Z#43 + /* Africa/Maseru */ :int { 30 } //Z#44 + /* Africa/Mbabane */ :int { 30 } //Z#45 + /* Africa/Mogadishu */ :int { 48 } //Z#46 + /* Africa/Monrovia */ :table { + trans:intvector { -1604359012, 73529070 } + typeOffsets:intvector { -2588, 0, -2670, 0, 0, 0 } + typeMap:bin { "0102" } + } //Z#47 + /* Africa/Nairobi */ :table { + trans:intvector { -1309746436, -1262314800, -946780200, -315629100 } + typeOffsets:intvector { 8836, 0, 9000, 0, 9900, 0, 10800, 0 } + typeMap:bin { "03010203" } + links:intvector { 7, 9, 10, 23, 24, 32, 46, 48, 388, 503, 507, 512 } + } //Z#48 + /* Africa/Ndjamena */ :table { + trans:intvector { -1830387612, 308703600, 321314400 } + typeOffsets:intvector { 3612, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201" } + } //Z#49 + /* Africa/Niamey */ :int { 36 } //Z#50 + /* Africa/Nouakchott */ :int { 5 } //Z#51 + /* Africa/Ouagadougou */ :int { 5 } //Z#52 + /* Africa/Porto-Novo */ :int { 36 } //Z#53 + /* Africa/Sao_Tome */ :int { 5 } //Z#54 + /* Africa/Timbuktu */ :int { 5 } //Z#55 + /* Africa/Tripoli */ :table { + trans:intvector { -1577926364, -574902000, -568087200, -512175600, -504928800, -449888400, -441856800, -347158800, 378684000, 386463600, 402271200, 417999600, 433807200, 449622000, 465429600, 481590000, 496965600, 512953200, 528674400, 544230000, 560037600, 575852400, 591660000, 607388400, 623196000, 641775600, 844034400, 860108400, 875916000, 1352505600, 1364515200, 1382659200 } + typeOffsets:intvector { 3164, 0, 3600, 0, 3600, 3600, 7200, 0 } + typeMap:bin { "0102010201020103010201020102010201020102010201020103010203010203" } + links:intvector { 56, 520 } + } //Z#56 + /* Africa/Tunis */ :table { + transPre32:intvector { -1, 1497764852 } + trans:intvector { -1855958961, -969242400, -950493600, -941940000, -891136800, -877827600, -857257200, -844556400, -842918400, -842223600, -828230400, -812502000, -796269600, -781052400, -766634400, 231202800, 243903600, 262825200, 276044400, 581122800, 591145200, 606870000, 622594800, 641516400, 654649200, 1114902000, 1128038400, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800 } + typeOffsets:intvector { 2444, 0, 561, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302" } + } //Z#57 + /* Africa/Windhoek */ :table { + transPre32:intvector { -1, 1836796792 } + trans:intvector { -2109288600, -860976000, -845254800, 765324000, 778640400, 796780800, 810090000 } + typeOffsets:intvector { 4104, 0, 3600, 0, 3600, 3600, 5400, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0304050401020102" } + finalRule { "Namibia" } + finalRaw:int { 3600 } + finalYear:int { 1996 } + } //Z#58 + /* America/Adak */ :table { + transPre32:intvector { -1, 1069611295, -1, 2106022494 } + trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452088000, 467809200, 483537600, 499258800, 514987200, 530708400, 544622400, 562158000, 576072000, 594212400, 607521600, 625662000, 638971200, 657111600, 671025600, 688561200, 702475200, 720010800, 733924800, 752065200, 765374400, 783514800, 796824000, 814964400, 828878400, 846414000, 860328000, 877863600, 891777600, 909313200, 923227200, 941367600, 954676800, 972817200, 986126400, 1004266800, 1018180800, 1035716400, 1049630400, 1067166000, 1081080000, 1099220400, 1112529600, 1130670000, 1143979200, 1162119600, 1173614400, 1194174000 } + typeOffsets:intvector { 44001, 0, -42398, 0, -39600, 0, -39600, 3600, -36000, 0, -36000, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "US" } + finalRaw:int { -36000 } + finalYear:int { 2008 } + links:intvector { 59, 80, 604 } + } //Z#59 + /* America/Anchorage */ :table { + transPre32:intvector { -1, 1069604872, -1, 2106016072 } + trans:intvector { -880200000, -765378000, -21470400, -5749200, 9979200, 25700400, 41428800, 57754800, 73483200, 89204400, 104932800, 120654000, 126705600, 152103600, 162388800, 183553200, 199281600, 215607600, 230731200, 247057200, 262785600, 278506800, 294235200, 309956400, 325684800, 341406000, 357134400, 372855600, 388584000, 404910000, 420033600, 436359600, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } + typeOffsets:intvector { 50424, 0, -36000, 0, -36000, 3600, -35976, 0, -32400, 0, -32400, 3600 } + typeMap:bin { "03010201020102010201020102010201020102010201020102010201020102010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "US" } + finalRaw:int { -32400 } + finalYear:int { 2008 } + links:intvector { 4, 60, 603 } + } //Z#60 + /* America/Anguilla */ :int { 185 } //Z#61 + /* America/Antigua */ :int { 185 } //Z#62 + /* America/Araguaina */ :table { + trans:intvector { -1767214032, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1350788400, 1361066400 } + typeOffsets:intvector { -11568, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#63 + /* America/Argentina/Buenos_Aires */ :table { + transPre32:intvector { -1, 1922869324 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } + typeOffsets:intvector { -14028, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030405040504" } + links:intvector { 2, 64, 90 } + } //Z#64 + /* America/Argentina/Catamarca */ :table { + transPre32:intvector { -1, 1922871084 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } + typeOffsets:intvector { -15788, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050205040504030402040504" } + links:intvector { 65, 66, 95 } + } //Z#65 + /* America/Argentina/ComodRivadavia */ :int { 65 } //Z#66 + /* America/Argentina/Cordoba */ :table { + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800, 1224385200, 1237082400 } + typeOffsets:intvector { -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020103040304030403040104030403020304030403" } + links:intvector { 67, 101, 195 } + } //Z#67 + /* America/Argentina/Jujuy */ :table { + transPre32:intvector { -1, 1922870968 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 657086400, 669178800, 686721600, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } + typeOffsets:intvector { -15672, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020504050403040504" } + links:intvector { 68, 142 } + } //Z#68 + /* America/Argentina/La_Rioja */ :table { + transPre32:intvector { -1, 1922871340 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } + typeOffsets:intvector { -16044, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020405040504030402040504" } + } //Z#69 + /* America/Argentina/Mendoza */ :table { + transPre32:intvector { -1, 1922871812 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 655963200, 667796400, 687499200, 699418800, 719380800, 731469600, 938919600, 952052400, 1085281200, 1096171200, 1198983600, 1205632800 } + typeOffsets:intvector { -16516, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040502030203020504030402040504" } + links:intvector { 70, 160 } + } //Z#70 + /* America/Argentina/Rio_Gallegos */ :table { + transPre32:intvector { -1, 1922871908 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087704000, 1198983600, 1205632800 } + typeOffsets:intvector { -16612, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } + } //Z#71 + /* America/Argentina/Salta */ :table { + transPre32:intvector { -1, 1922870996 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1198983600, 1205632800 } + typeOffsets:intvector { -15700, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020504050403040504" } + } //Z#72 + /* America/Argentina/San_Juan */ :table { + transPre32:intvector { -1, 1922871740 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667792800, 673588800, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085972400, 1090728000, 1198983600, 1205632800 } + typeOffsets:intvector { -16444, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050405020405040504030402040504" } + } //Z#73 + /* America/Argentina/San_Luis */ :table { + transPre32:intvector { -1, 1922871220 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 637380000, 655963200, 667796400, 675748800, 938919600, 952052400, 1085972400, 1090728000, 1198983600, 1200880800, 1205031600, 1223784000, 1236481200, 1255233600 } + typeOffsets:intvector { -15924, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020405040504050203020403040204050302030204" } + } //Z#74 + /* America/Argentina/Tucuman */ :table { + transPre32:intvector { -1, 1922870948 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687931200, 699415200, 719377200, 731469600, 938919600, 952052400, 1086058800, 1087099200, 1198983600, 1205632800, 1224385200, 1237082400 } + typeOffsets:intvector { -15652, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302040504050405040502050405040304020405040504" } + } //Z#75 + /* America/Argentina/Ushuaia */ :table { + transPre32:intvector { -1, 1922871688 } + trans:intvector { -1567453392, -1233432000, -1222981200, -1205956800, -1194037200, -1172865600, -1162501200, -1141329600, -1130965200, -1109793600, -1099429200, -1078257600, -1067806800, -1046635200, -1036270800, -1015099200, -1004734800, -983563200, -973198800, -952027200, -941576400, -931032000, -900882000, -890337600, -833749200, -827265600, -752274000, -733780800, -197326800, -190843200, -184194000, -164491200, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 596948400, 605066400, 624423600, 636516000, 656478000, 667965600, 687927600, 699415200, 719377200, 731469600, 938919600, 952052400, 1085886000, 1087704000, 1198983600, 1205632800 } + typeOffsets:intvector { -16392, 0, -15408, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030204050405040504050405040504030402040504" } + } //Z#76 + /* America/Aruba */ :int { 105 } //Z#77 + /* America/Asuncion */ :table { + trans:intvector { -1206389360, 86760000, 134017200, 181368000, 194497200, 212990400, 226033200, 244526400, 257569200, 276062400, 291783600, 307598400, 323406000, 339220800, 354942000, 370756800, 386478000, 402292800, 418014000, 433828800, 449636400, 465451200, 481172400, 496987200, 512708400, 528523200, 544244400, 560059200, 575866800, 591681600, 607402800, 625032000, 638938800, 654753600, 670474800, 686721600, 699418800, 718257600, 733546800, 749448000, 762318000, 780984000, 793767600, 812520000, 825649200, 844574400, 856666800, 876024000, 888721200, 907473600, 920775600, 938923200, 952225200, 970372800, 983674800, 1002427200, 1018148400, 1030852800, 1049598000, 1062907200, 1081047600, 1097985600, 1110682800, 1129435200, 1142132400, 1160884800, 1173582000, 1192939200, 1205031600, 1224388800, 1236481200, 1255838400, 1270954800, 1286078400, 1302404400, 1317528000, 1333854000, 1349582400, 1364094000, 1381032000 } + typeOffsets:intvector { -13840, 0, -14400, 0, -14400, 3600, -10800, 0 } + typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "Para" } + finalRaw:int { -14400 } + finalYear:int { 2014 } + } //Z#78 + /* America/Atikokan */ :table { + transPre32:intvector { -1, 1928234084 } + trans:intvector { -1632067200, -1615136400, -923248800, -765392400 } + typeOffsets:intvector { -21988, 0, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "0102010203" } + links:intvector { 79, 100 } + } //Z#79 + /* America/Atka */ :int { 59 } //Z#80 + /* America/Bahia */ :table { + trans:intvector { -1767216356, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1318734000, 1330221600 } + typeOffsets:intvector { -9244, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#81 + /* America/Bahia_Banderas */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1270371600, 1288508400, 1301817600, 1319958000 } + typeOffsets:intvector { -25260, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "0204020402040201020302030203020302030203020302030203020302030203020302030205040504" } + finalRule { "Mexico" } + finalRaw:int { -21600 } + finalYear:int { 2012 } + } //Z#82 + /* America/Barbados */ :table { + trans:intvector { -1199217691, 234943200, 244616400, 261554400, 276066000, 293004000, 307515600, 325058400, 338706000 } + typeOffsets:intvector { -14309, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "010201020102010201" } + } //Z#83 + /* America/Belem */ :table { + trans:intvector { -1767213964, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600 } + typeOffsets:intvector { -11636, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } + } //Z#84 + /* America/Belize */ :table { + trans:intvector { -1822500432, -1616954400, -1606069800, -1585504800, -1574015400, -1554055200, -1542565800, -1522605600, -1511116200, -1490551200, -1479666600, -1459101600, -1448217000, -1427652000, -1416162600, -1396202400, -1384713000, -1364752800, -1353263400, -1333303200, -1321813800, -1301248800, -1290364200, -1269799200, -1258914600, -1238349600, -1226860200, -1206900000, -1195410600, -1175450400, -1163961000, -1143396000, -1132511400, -1111946400, -1101061800, -1080496800, -1069612200, -1049047200, -1037557800, -1017597600, -1006108200, -986148000, -974658600, -954093600, -943209000, -922644000, -911759400, -891194400, -879705000, -859744800, -848255400, 123919200, 129618000, 409039200, 413874000 } + typeOffsets:intvector { -21168, 0, -21600, 0, -21600, 1800, -21600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103010301" } + } //Z#85 + /* America/Blanc-Sablon */ :table { + transPre32:intvector { -1, 1581070604 } + trans:intvector { -1632074400, -1615143600, -880221600, -765399600 } + typeOffsets:intvector { -13708, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102010201" } + } //Z#86 + /* America/Boa_Vista */ :table { + trans:intvector { -1767211040, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 938923200, 951620400, 970977600, 971578800 } + typeOffsets:intvector { -14560, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#87 + /* America/Bogota */ :table { + trans:intvector { -1739041424, 704869200, 733896000 } + typeOffsets:intvector { -17776, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010201" } + } //Z#88 + /* America/Boise */ :table { + transPre32:intvector { -1, 1577327296 } + trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -1471788000, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 129114000, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { -27889, 0, -28800, 0, -28800, 3600, -25200, 0, -25200, 3600 } + typeMap:bin { "010201020103040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "US" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + } //Z#89 + /* America/Buenos_Aires */ :int { 64 } //Z#90 + /* America/Cambridge_Bay */ :table { + trans:intvector { -1577923200, -880210800, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954662400, 972802800, 973400400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { 0, 0, -25200, 0, -25200, 3600, -25200, 7200, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "0102010301020102010201020102010201020102010201020102010201020102010201020102010201020102040506040201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + } //Z#91 + /* America/Campo_Grande */ :table { + trans:intvector { -1767212492, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1066536000, 1076814000, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1540094400, 1550372400, 1571544000, 1581822000, 1602993600, 1613876400, 1634443200, 1645326000, 1665892800, 1677380400, 1697342400, 1708225200, 1729396800, 1739674800, 1760846400, 1771729200, 1792296000, 1803178800, 1823745600, 1834628400, 1855195200, 1866078000, 1887249600, 1897527600, 1918699200, 1928977200, 1950148800, 1960426800, 1981598400, 1992481200, 2013048000, 2024535600, 2044497600, 2055380400, 2076552000, 2086830000, 2108001600, 2118884400, 2139451200 } + transPost32:intvector { 0, -2144633296, 0, -2124066496 } + typeOffsets:intvector { -13108, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "Brazil" } + finalRaw:int { -14400 } + finalYear:int { 2039 } + } //Z#92 + /* America/Cancun */ :table { + trans:intvector { -1514743200, 377935200, 828860400, 846396000, 860310000, 877845600, 891759600, 902037600, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1270368000, 1288508400, 1301817600, 1319958000, 1333267200, 1351407600, 1365321600, 1382857200, 1396771200, 1414306800, 1422777600 } + typeOffsets:intvector { -20824, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010304030403040201020102010201020102010201020102010201020102010201020102010201020103" } + } //Z#93 + /* America/Caracas */ :table { + transPre32:intvector { -1, 1770461760 } + trans:intvector { -1826739140, -157750200, 1197183600 } + typeOffsets:intvector { -16064, 0, -16200, 0, -16060, 0, -14400, 0 } + typeMap:bin { "02010301" } + } //Z#94 + /* America/Catamarca */ :int { 65 } //Z#95 + /* America/Cayenne */ :table { + trans:intvector { -1846269040, -71092800 } + typeOffsets:intvector { -12560, 0, -14400, 0, -10800, 0 } + typeMap:bin { "0102" } + } //Z#96 + /* America/Cayman */ :table { + transPre32:intvector { -1, 1770465228 } + trans:intvector { -1827687169, 1457852400, 1478412000 } + typeOffsets:intvector { -19532, 0, -18431, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "01020302" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2017 } + } //Z#97 + /* America/Chicago */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1563724800, -1551632400, -1538928000, -1520182800, -1504454400, -1491757200, -1473004800, -1459702800, -1441555200, -1428253200, -1410105600, -1396803600, -1378656000, -1365354000, -1347206400, -1333904400, -1315152000, -1301850000, -1283702400, -1270400400, -1252252800, -1238950800, -1220803200, -1207501200, -1189353600, -1176051600, -1157299200, -1144602000, -1125849600, -1112547600, -1094400000, -1081098000, -1067788800, -1045414800, -1031500800, -1018198800, -1000051200, -986749200, -967996800, -955299600, -936547200, -923245200, -905097600, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -21036, 0, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + links:intvector { 98, 373, 606 } + } //Z#98 + /* America/Chihuahua */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 } + typeOffsets:intvector { -25460, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "0103010301030403040302010201020102010201" } + finalRule { "Mexico" } + finalRaw:int { -25200 } + finalYear:int { 2003 } + } //Z#99 + /* America/Coral_Harbour */ :int { 79 } //Z#100 + /* America/Cordoba */ :int { 67 } //Z#101 + /* America/Costa_Rica */ :table { + trans:intvector { -1545071027, 288770400, 297234000, 320220000, 328683600, 664264800, 678344400, 695714400, 700635600 } + typeOffsets:intvector { -20173, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "010201020102010201" } + } //Z#102 + /* America/Creston */ :table { + transPre32:intvector { -1, 1581084860 } + trans:intvector { -1680454800, -1627833600 } + typeOffsets:intvector { -27964, 0, -28800, 0, -25200, 0 } + typeMap:bin { "020102" } + } //Z#103 + /* America/Cuiaba */ :table { + trans:intvector { -1767212140, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 592977600, 602046000, 624427200, 634705200, 656481600, 666759600, 687931200, 697604400, 719985600, 728449200, 750830400, 761713200, 782280000, 793162800, 813729600, 824007600, 844574400, 856062000, 876110400, 888721200, 908078400, 919566000, 938923200, 951620400, 970977600, 982465200, 1003032000, 1013914800, 1036296000, 1045364400, 1099368000, 1108868400, 1129435200, 1140318000, 1162699200, 1172372400, 1192334400, 1203217200, 1224388800, 1234666800, 1255838400, 1266721200, 1287288000, 1298170800, 1318737600, 1330225200, 1350792000, 1361070000, 1382241600, 1392519600, 1413691200, 1424574000, 1445140800, 1456023600, 1476590400, 1487473200, 1508040000, 1518922800, 1540094400, 1550372400, 1571544000, 1581822000, 1602993600, 1613876400, 1634443200, 1645326000, 1665892800, 1677380400, 1697342400, 1708225200, 1729396800, 1739674800, 1760846400, 1771729200, 1792296000, 1803178800, 1823745600, 1834628400, 1855195200, 1866078000, 1887249600, 1897527600, 1918699200, 1928977200, 1950148800, 1960426800, 1981598400, 1992481200, 2013048000, 2024535600, 2044497600, 2055380400, 2076552000, 2086830000, 2108001600, 2118884400, 2139451200 } + transPost32:intvector { 0, -2144633296, 0, -2124066496 } + typeOffsets:intvector { -13460, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "Brazil" } + finalRaw:int { -14400 } + finalYear:int { 2039 } + } //Z#104 + /* America/Curacao */ :table { + trans:intvector { -1826738653, -157750200 } + typeOffsets:intvector { -16547, 0, -16200, 0, -14400, 0 } + typeMap:bin { "0102" } + links:intvector { 77, 105, 147, 152 } + } //Z#105 + /* America/Danmarkshavn */ :table { + trans:intvector { -1686091520, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 820465200 } + typeOffsets:intvector { -4480, 0, -10800, 0, -10800, 3600, 0, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020103" } + } //Z#106 + /* America/Dawson */ :table { + transPre32:intvector { -1, 2105970356 } + trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, 120646800, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } + typeOffsets:intvector { -33460, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } + typeMap:bin { "010201020102010301040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "Canada" } + finalRaw:int { -28800 } + finalYear:int { 2008 } + } //Z#107 + /* America/Dawson_Creek */ :table { + transPre32:intvector { -1, 1581085752 } + trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 84013200 } + typeOffsets:intvector { -28856, 0, -28800, 0, -28800, 3600, -25200, 0 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } + } //Z#108 + /* America/Denver */ :table { + transPre32:intvector { -1, 1577323696 } + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -1570374000, -1551628800, -1538924400, -1534089600, -880210800, -765388800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { -25196, 0, -25200, 0, -25200, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + links:intvector { 109, 202, 532, 612 } + } //Z#109 + /* America/Detroit */ :table { + trans:intvector { -2051202469, -1724083200, -880218000, -765396000, -684349200, -671047200, -80499600, -68666400, 104914800, 120636000, 126687600, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -19931, 0, -21600, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + links:intvector { 110, 611 } + } //Z#110 + /* America/Dominica */ :int { 185 } //Z#111 + /* America/Edmonton */ :table { + trans:intvector { -1998663968, -1632063600, -1615132800, -1600614000, -1596816000, -1567954800, -1551628800, -1536505200, -1523203200, -1504450800, -1491753600, -1473001200, -1459699200, -880210800, -765388800, -715791600, -702489600, -84380400, -68659200, -21481200, -5760000, 73472400, 89193600, 104922000, 120643200, 136371600, 152092800, 167821200, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { -27232, 0, -25200, 0, -25200, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + links:intvector { 112, 380 } + } //Z#112 + /* America/Eirunepe */ :table { + trans:intvector { -1767208832, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 750834000, 761716800, 1214283600, 1384056000 } + typeOffsets:intvector { -16768, 0, -18000, 0, -18000, 3600, -14400, 0 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010301" } + } //Z#113 + /* America/El_Salvador */ :table { + trans:intvector { -1546279392, 547020000, 559717200, 578469600, 591166800 } + typeOffsets:intvector { -21408, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "0102010201" } + } //Z#114 + /* America/Ensenada */ :int { 214 } //Z#115 + /* America/Fort_Wayne */ :int { 130 } //Z#116 + /* America/Fortaleza */ :table { + trans:intvector { -1767216360, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } + typeOffsets:intvector { -9240, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#117 + /* America/Glace_Bay */ :table { + trans:intvector { -2131646412, -1632074400, -1615143600, -880221600, -765399600, -526500000, -513198000, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } + typeOffsets:intvector { -14388, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -14400 } + finalYear:int { 2008 } + } //Z#118 + /* America/Godthab */ :table { + trans:intvector { -1686083584, 323845200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -12416, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { -10800 } + finalYear:int { 1997 } + } //Z#119 + /* America/Goose_Bay */ :table { + transPre32:intvector { -1, 1581071396 } + trans:intvector { -1632076148, -1615145348, -1096921748, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -119903400, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544593660, 562129260, 576043260, 594180060, 607492860, 625633260, 638942460, 657082860, 670996860, 688532460, 702446460, 719982060, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173585660, 1194145260, 1205035260, 1225594860, 1236484860, 1257044460, 1268539260, 1289098860, 1299988860, 1320555600, 1331445600, 1352005200 } + typeOffsets:intvector { -14500, 0, -14400, 0, -14400, 3600, -14400, 7200, -12652, 0, -12652, 3600, -12600, 0, -12600, 3600 } + typeMap:bin { "040504060706070607060706070607060706070607060706070607060706070607060706070607060706070607060706070607060706070607060102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -14400 } + finalYear:int { 2013 } + } //Z#120 + /* America/Grand_Turk */ :table { + transPre32:intvector { -1, 1770462768 } + trans:intvector { -1827687169, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000, 1205046000, 1225605600, 1236495600, 1257055200, 1268550000, 1289109600, 1299999600, 1320559200, 1331449200, 1352008800, 1362898800, 1383458400, 1394348400, 1414908000, 1425798000, 1446357600 } + typeOffsets:intvector { -17072, 0, -18431, 0, -18000, 0, -18000, 3600, -14400, 0 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020304" } + } //Z#121 + /* America/Grenada */ :int { 185 } //Z#122 + /* America/Guadeloupe */ :int { 185 } //Z#123 + /* America/Guatemala */ :table { + trans:intvector { -1617040676, 123055200, 130914000, 422344800, 433054800, 669708000, 684219600, 1146376800, 1159678800 } + typeOffsets:intvector { -21724, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "010201020102010201" } + } //Z#124 + /* America/Guayaquil */ :table { + transPre32:intvector { -1, 1770464856 } + trans:intvector { -1230749160 } + typeOffsets:intvector { -19160, 0, -18840, 0, -18000, 0 } + typeMap:bin { "0102" } + } //Z#125 + /* America/Guyana */ :table { + trans:intvector { -1730578040, 176010300, 662698800 } + typeOffsets:intvector { -13960, 0, -14400, 0, -13500, 0, -10800, 0 } + typeMap:bin { "020301" } + } //Z#126 + /* America/Halifax */ :table { + trans:intvector { -2131645536, -1696276800, -1680469200, -1632074400, -1615143600, -1566763200, -1557090000, -1535486400, -1524949200, -1504468800, -1493413200, -1472414400, -1461963600, -1440964800, -1429390800, -1409515200, -1396731600, -1376856000, -1366491600, -1346616000, -1333832400, -1313956800, -1303678800, -1282507200, -1272661200, -1251057600, -1240088400, -1219608000, -1207429200, -1188763200, -1175979600, -1157313600, -1143925200, -1124049600, -1113771600, -1091390400, -1081026000, -1059854400, -1050786000, -1030910400, -1018126800, -999460800, -986677200, -965592000, -955227600, -935956800, -923173200, -904507200, -891723600, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -431546400, -418244400, -400096800, -386794800, -368647200, -355345200, -337197600, -323895600, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } + typeOffsets:intvector { -15264, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -14400 } + finalYear:int { 2008 } + links:intvector { 127, 376 } + } //Z#127 + /* America/Havana */ :table { + transPre32:intvector { -1, 1770465464 } + trans:intvector { -1402813824, -1311534000, -1300996800, -933534000, -925675200, -902084400, -893620800, -870030000, -862171200, -775681200, -767822400, -744231600, -736372800, -144702000, -134251200, -113425200, -102542400, -86295600, -72907200, -54154800, -41457600, -21495600, -5774400, 9954000, 25675200, 41403600, 57729600, 73458000, 87364800, 104907600, 118900800, 136357200, 150436800, 167806800, 183528000, 199256400, 215582400, 230706000, 247032000, 263365200, 276667200, 290581200, 308721600, 322030800, 340171200, 358318800, 371620800, 389768400, 403070400, 421218000, 434520000, 452667600, 466574400, 484117200, 498024000, 511333200, 529473600, 542782800, 560923200, 574837200, 592372800, 606286800, 623822400, 638946000, 655876800, 671000400, 687330000, 702450000, 718779600, 733899600, 750229200, 765349200, 781678800, 796798800, 813128400, 828853200, 844578000, 860302800, 876632400, 891147600, 909291600, 922597200, 941346000, 954651600, 972795600, 986101200, 1004245200, 1018155600, 1035694800, 1049605200, 1067144400, 1080450000, 1162098000, 1173589200, 1193547600, 1205643600, 1224997200, 1236488400, 1256446800, 1268542800, 1288501200, 1300597200, 1321160400, 1333256400, 1352005200, 1362891600, 1383454800 } + typeOffsets:intvector { -19768, 0, -19776, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Cuba" } + finalRaw:int { -18000 } + finalYear:int { 2014 } + links:intvector { 128, 387 } + } //Z#128 + /* America/Hermosillo */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400 } + typeOffsets:intvector { -26632, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } + typeMap:bin { "020402040204020102030203020302" } + } //Z#129 + /* America/Indiana/Indianapolis */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -900259200, -891795600, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -386787600, -368640000, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -20678, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010301030403040304030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + links:intvector { 116, 130, 138, 500, 607 } + } //Z#130 + /* America/Indiana/Knox */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -195066000, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 1143961200, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -20790, 0, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302010201" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + links:intvector { 131, 146, 610 } + } //Z#131 + /* America/Indiana/Marengo */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -589392000, -576090000, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -20723, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020103040304030403040304030203040304030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#132 + /* America/Indiana/Petersburg */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } + typeOffsets:intvector { -20947, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201030102010201020102010201020102010201020102010203020102030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2009 } + } //Z#133 + /* America/Indiana/Tell_City */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -20823, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201030403040302010201" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#134 + /* America/Indiana/Vevay */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -495043200, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -20416, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "0102010201020103040304030403040304030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#135 + /* America/Indiana/Vincennes */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -526492800, -513190800, -495043200, -481741200, -462996000, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -289414800, -273686400, -260989200, -242236800, -226515600, -210787200, -195066000, -179337600, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194159600, 1205046000, 1225605600 } + typeOffsets:intvector { -21007, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010304030403020102030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2009 } + } //Z#136 + /* America/Indiana/Winamac */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620841600, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -447267600, -431539200, -415818000, -400089600, -386787600, -368640000, -355338000, -337190400, -323888400, -305740800, -292438800, -273686400, -21488400, -5767200, 9961200, 25682400, 1143961200, 1162105200, 1173600000, 1194156000, 1205046000, 1225605600 } + typeOffsets:intvector { -20785, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010304030403020104030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2009 } + } //Z#137 + /* America/Indianapolis */ :int { 130 } //Z#138 + /* America/Inuvik */ :table { + trans:intvector { -536457600, -147888000, -131558400, 294228000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { 0, 0, -28800, 0, -28800, 7200, -25200, 0, -25200, 3600 } + typeMap:bin { "010201030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "Canada" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + } //Z#139 + /* America/Iqaluit */ :table { + trans:intvector { -865296000, -765396000, -147898800, -131569200, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600, -18000, 7200 } + typeMap:bin { "040305030403040304030403040304030403040304030403040304030403040304030403040304030403040102030403040304030403040304030403" } + finalRule { "Canada" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#140 + /* America/Jamaica */ :table { + trans:intvector { -1827687169, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600 } + typeOffsets:intvector { -18431, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201" } + links:intvector { 141, 517 } + } //Z#141 + /* America/Jujuy */ :int { 68 } //Z#142 + /* America/Juneau */ :table { + transPre32:intvector { -1, 1069601157, -1, 2106012357 } + trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341402400, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } + typeOffsets:intvector { 54139, 0, -32400, 0, -32400, 3600, -32261, 0, -28800, 0, -28800, 3600 } + typeMap:bin { "03040504050405040504050405040504050405040504050405040204050405040501020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -32400 } + finalYear:int { 2008 } + } //Z#143 + /* America/Kentucky/Louisville */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -1535904000, -1525280400, -905097600, -891795600, -880214400, -765392400, -757360800, -744224400, -715795200, -608144400, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -266432400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152089200, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -20582, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403040304030203040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + links:intvector { 144, 151 } + } //Z#144 + /* America/Kentucky/Monticello */ :table { + transPre32:intvector { -1, 1577320096 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -20364, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403040304030403" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#145 + /* America/Knox_IN */ :int { 131 } //Z#146 + /* America/Kralendijk */ :int { 105 } //Z#147 + /* America/La_Paz */ :table { + trans:intvector { -1205954844, -1192307244 } + typeOffsets:intvector { -16356, 0, -16356, 3600, -14400, 0 } + typeMap:bin { "0102" } + } //Z#148 + /* America/Lima */ :table { + transPre32:intvector { -1, 1770464188 } + trans:intvector { -1938538284, -1009825200, -1002052800, -986756400, -971035200, -955306800, -939585600, 504939600, 512712000, 536475600, 544248000, 631170000, 638942400, 757400400, 765172800 } + typeOffsets:intvector { -18492, 0, -18516, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "01020302030203020302030203020302" } + } //Z#149 + /* America/Los_Angeles */ :table { + transPre32:intvector { -1, 1577327296 } + trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -687967200, -662655600, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } + typeOffsets:intvector { -28378, 0, -28800, 0, -28800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -28800 } + finalYear:int { 2008 } + links:intvector { 150, 537, 613, 614 } + } //Z#150 + /* America/Louisville */ :int { 144 } //Z#151 + /* America/Lower_Princes */ :int { 105 } //Z#152 + /* America/Maceio */ :table { + trans:intvector { -1767217028, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 813726000, 824004000, 938919600, 951616800, 970974000, 972180000, 1003028400, 1013911200 } + typeOffsets:intvector { -8572, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#153 + /* America/Managua */ :table { + transPre32:intvector { -1, 1770466404 } + trans:intvector { -1121105688, 105084000, 161758800, 290584800, 299134800, 322034400, 330584400, 694260000, 717310800, 725868000, 852094800, 1113112800, 1128229200, 1146384000, 1159682400 } + typeOffsets:intvector { -20708, 0, -21600, 0, -21600, 3600, -20712, 0, -18000, 0 } + typeMap:bin { "03010401020102010401040102010201" } + } //Z#154 + /* America/Manaus */ :table { + trans:intvector { -1767211196, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 750830400, 761713200 } + typeOffsets:intvector { -14404, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 155, 369 } + } //Z#155 + /* America/Marigot */ :int { 185 } //Z#156 + /* America/Martinique */ :table { + trans:intvector { -1851537340, 323841600, 338958000 } + typeOffsets:intvector { -14660, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "010201" } + } //Z#157 + /* America/Matamoros */ :table { + trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1175414400, 1193554800, 1207468800, 1225004400, 1238918400, 1256454000, 1268553600, 1289113200 } + typeOffsets:intvector { -24000, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2011 } + } //Z#158 + /* America/Mazatlan */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -873828000, -661539600, 28800, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600 } + typeOffsets:intvector { -25540, 0, -28800, 0, -25200, 0, -25200, 3600, -21600, 0 } + typeMap:bin { "0204020402040201020302030203020302030203020302" } + finalRule { "Mexico" } + finalRaw:int { -25200 } + finalYear:int { 2003 } + links:intvector { 159, 526 } + } //Z#159 + /* America/Mendoza */ :int { 70 } //Z#160 + /* America/Menominee */ :table { + transPre32:intvector { -1, 1635207523 } + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -747244800, -733942800, -116438400, -100112400, -21484800, 104914800, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -21027, 0, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "01020102010201020102010302010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#161 + /* America/Merida */ :table { + trans:intvector { -1514743200, 377935200, 407653200, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } + typeOffsets:intvector { -21508, 0, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "0103010201020102010201020102010201" } + finalRule { "Mexico" } + finalRaw:int { -21600 } + finalYear:int { 2003 } + } //Z#162 + /* America/Metlakatla */ :table { + transPre32:intvector { -1, 1069600474, -1, 2106011674 } + trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400 } + typeOffsets:intvector { 54822, 0, -31578, 0, -28800, 0, -28800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302" } + } //Z#163 + /* America/Mexico_City */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, -975261600, -963169200, -917114400, -907354800, -821901600, -810068400, -627501600, -612990000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } + typeOffsets:intvector { -23796, 0, -25200, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "01020102010203020302030203020302030203020302030203020302" } + finalRule { "Mexico" } + finalRaw:int { -21600 } + finalYear:int { 2003 } + links:intvector { 164, 527 } + } //Z#164 + /* America/Miquelon */ :table { + trans:intvector { -1850328920, 326001600, 544597200, 562132800, 576046800, 594187200, 607496400, 625636800, 638946000, 657086400, 671000400, 688536000, 702450000, 719985600, 733899600, 752040000, 765349200, 783489600, 796798800, 814939200, 828853200, 846388800, 860302800, 877838400, 891752400, 909288000, 923202000, 941342400, 954651600, 972792000, 986101200, 1004241600, 1018155600, 1035691200, 1049605200, 1067140800, 1081054800, 1099195200, 1112504400, 1130644800, 1143954000, 1162094400, 1173589200, 1194148800 } + typeOffsets:intvector { -13480, 0, -14400, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Canada" } + finalRaw:int { -10800 } + finalYear:int { 2008 } + } //Z#165 + /* America/Moncton */ :table { + transPre32:intvector { -1, 1579085244 } + trans:intvector { -2131642800, -1632074400, -1615143600, -1153681200, -1145822400, -1122231600, -1114372800, -1090782000, -1082923200, -1059332400, -1051473600, -1027882800, -1020024000, -996433200, -988574400, -965674800, -955396800, -934743600, -923947200, -904503600, -891892800, -880221600, -765399600, -747252000, -733950000, -715802400, -702500400, -684352800, -671050800, -652903200, -639601200, -620848800, -608151600, -589399200, -576097200, -557949600, -544647600, -526500000, -513198000, -495050400, -481748400, -463600800, -450298800, -431546400, -418244400, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733896060, 752036460, 765345660, 783486060, 796795260, 814935660, 828849660, 846385260, 860299260, 877834860, 891748860, 909284460, 923198460, 941338860, 954648060, 972788460, 986097660, 1004238060, 1018152060, 1035687660, 1049601660, 1067137260, 1081051260, 1099191660, 1112500860, 1130641260, 1143950460, 1162090860, 1173592800, 1194152400 } + typeOffsets:intvector { -15548, 0, -18000, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Canada" } + finalRaw:int { -14400 } + finalYear:int { 2008 } + } //Z#166 + /* America/Monterrey */ :table { + trans:intvector { -1514743200, 576057600, 594198000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 989136000, 1001833200, 1018166400, 1035702000 } + typeOffsets:intvector { -24076, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "0102010201020102010201020102010201" } + finalRule { "Mexico" } + finalRaw:int { -21600 } + finalYear:int { 2003 } + } //Z#167 + /* America/Montevideo */ :table { + trans:intvector { -1567455316, -1459542600, -1443819600, -1428006600, -1412283600, -1396470600, -1380747600, -1141590600, -1128286800, -1110141000, -1096837200, -1078691400, -1065387600, -1046637000, -1033938000, -1015187400, -1002488400, -983737800, -971038800, -952288200, -938984400, -920838600, -907534800, -896819400, -883602000, -853619400, -845848800, -334789200, -319672800, -314226000, -309996000, -149720400, -134604000, -118270800, -100044000, -86821200, -68508000, -50446800, -34119000, -18910800, -2583000, 12625200, 28953000, 72932400, 82692000, 132116400, 156911400, 212983200, 250052400, 260244000, 307594800, 325994400, 566449200, 574308000, 597812400, 605671200, 625633200, 636516000, 656478000, 667965600, 688532400, 699415200, 719377200, 730864800, 1095562800, 1111896000, 1128834000, 1142136000, 1159678800, 1173585600, 1191733200, 1205035200, 1223182800, 1236484800, 1254632400, 1268539200, 1286082000, 1299988800, 1317531600, 1331438400, 1349586000, 1362888000, 1381035600, 1394337600, 1412485200, 1425787200 } + typeOffsets:intvector { -13484, 0, -12600, 0, -12600, 1800, -10800, 0, -10800, 1800, -10800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020105030503050305030503050304030403040305030405030503050305030503050305030503050305030503050305030503050305030503050305030503" } + } //Z#168 + /* America/Montreal */ :int { 215 } //Z#169 + /* America/Montserrat */ :int { 185 } //Z#170 + /* America/Nassau */ :table { + trans:intvector { -1825095030, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -18570, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#171 + /* America/New_York */ :table { + transPre32:intvector { -1, 1577316496 } + trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -1570381200, -1551636000, -1536512400, -1523210400, -1504458000, -1491760800, -1473008400, -1459706400, -1441558800, -1428256800, -1410109200, -1396807200, -1378659600, -1365357600, -1347210000, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1189357200, -1176055200, -1157302800, -1144605600, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -923248800, -905101200, -891799200, -880218000, -765396000, -747248400, -733946400, -715798800, -702496800, -684349200, -671047200, -652899600, -639597600, -620845200, -608148000, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -17762, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + links:intvector { 172, 608 } + } //Z#172 + /* America/Nipigon */ :table { + transPre32:intvector { -1, 1928233280 } + trans:intvector { -1632070800, -1615140000, -923252400, -765396000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -21184, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#173 + /* America/Nome */ :table { + transPre32:intvector { -1, 1069608595, -1, 2106019794 } + trans:intvector { -880196400, -765374400, -21466800, -5745600, 9982800, 25704000, 41432400, 57758400, 73486800, 89208000, 104936400, 120657600, 126709200, 152107200, 162392400, 183556800, 199285200, 215611200, 230734800, 247060800, 262789200, 278510400, 294238800, 309960000, 325688400, 341409600, 357138000, 372859200, 388587600, 404913600, 420037200, 436363200, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } + typeOffsets:intvector { 46701, 0, -39698, 0, -39600, 0, -39600, 3600, -32400, 0, -32400, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "US" } + finalRaw:int { -32400 } + finalYear:int { 2008 } + } //Z#174 + /* America/Noronha */ :table { + trans:intvector { -1767217820, -1206961200, -1191366000, -1175378400, -1159830000, -633823200, -622072800, -602287200, -591836400, -570751200, -560214000, -539128800, -531356400, -191368800, -184201200, -155167200, -150073200, -128901600, -121129200, -99957600, -89593200, -68421600, -57970800, 499744800, 511232400, 530589600, 540262800, 562125600, 571194000, 592970400, 602038800, 624420000, 634698000, 938916000, 951613200, 970970400, 971571600, 1003024800, 1013907600 } + typeOffsets:intvector { -7780, 0, -7200, 0, -7200, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 175, 367 } + } //Z#175 + /* America/North_Dakota/Beulah */ :table { + transPre32:intvector { -1, 1577323696 } + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200, 1205053200, 1225612800, 1236502800, 1257062400, 1268557200, 1289116800, 1300003200, 1320562800 } + typeOffsets:intvector { -24427, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2012 } + } //Z#176 + /* America/North_Dakota/Center */ :table { + transPre32:intvector { -1, 1577323696 } + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -24312, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203040304030403040304030403040304030403040304030403040304030403" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#177 + /* America/North_Dakota/New_Salem */ :table { + transPre32:intvector { -1, 1577323696 } + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -24339, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030403040304030403" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#178 + /* America/Ojinaga */ :table { + trans:intvector { -1514739600, -1343066400, -1234807200, -1220292000, -1207159200, -1191344400, 828864000, 846399600, 860313600, 877849200, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 989139600, 1001836800, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1175418000, 1193558400, 1207472400, 1225008000, 1238922000, 1256457600, 1268557200, 1289116800 } + typeOffsets:intvector { -25060, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600 } + typeMap:bin { "010301030103040304030201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -25200 } + finalYear:int { 2011 } + } //Z#179 + /* America/Panama */ :table { + transPre32:intvector { -1, 1770464784 } + trans:intvector { -1946918424 } + typeOffsets:intvector { -19088, 0, -19176, 0, -18000, 0 } + typeMap:bin { "0102" } + } //Z#180 + /* America/Pangnirtung */ :table { + trans:intvector { -1546300800, -880221600, -765399600, -147902400, -131572800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954662400, 972802800, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600, -14400, 7200 } + typeMap:bin { "05060507050605060506050605060506050605060506050605060506050605060506050403040304030403040102030403040304030403040304030403" } + finalRule { "Canada" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#181 + /* America/Paramaribo */ :table { + trans:intvector { -1861906760, -1104524348, -765317964, 465449400 } + typeOffsets:intvector { -13240, 0, -13252, 0, -13236, 0, -12600, 0, -10800, 0 } + typeMap:bin { "01020304" } + } //Z#182 + /* America/Phoenix */ :table { + transPre32:intvector { -1, 1577323696 } + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -820519140, -812653140, -796845540, -84380400, -68659200 } + typeOffsets:intvector { -26898, 0, -25200, 0, -25200, 3600 } + typeMap:bin { "0102010201020102010201" } + links:intvector { 183, 534, 605 } + } //Z#183 + /* America/Port-au-Prince */ :table { + transPre32:intvector { -1, 1770463056 } + trans:intvector { -1670483460, 421218000, 436334400, 452062800, 467784000, 483512400, 499233600, 514962000, 530683200, 546411600, 562132800, 576050400, 594194400, 607500000, 625644000, 638949600, 657093600, 671004000, 688543200, 702453600, 719992800, 733903200, 752047200, 765352800, 783496800, 796802400, 814946400, 828856800, 846396000, 860306400, 877845600, 1112504400, 1130644800, 1143954000, 1162094400, 1331449200, 1352008800 } + typeOffsets:intvector { -17360, 0, -18000, 0, -18000, 3600, -17340, 0 } + typeMap:bin { "0301020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Haiti" } + finalRaw:int { -18000 } + finalYear:int { 2013 } + } //Z#184 + /* America/Port_of_Spain */ :table { + trans:intvector { -1825098836 } + typeOffsets:intvector { -14764, 0, -14400, 0 } + typeMap:bin { "01" } + links:intvector { 61, 62, 111, 122, 123, 156, 170, 185, 204, 206, 207, 208, 209, 216, 218 } + } //Z#185 + /* America/Porto_Acre */ :int { 194 } //Z#186 + /* America/Porto_Velho */ :table { + trans:intvector { -1767210264, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200 } + typeOffsets:intvector { -15336, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201" } + } //Z#187 + /* America/Puerto_Rico */ :table { + transPre32:intvector { -1, 2061931961 } + trans:intvector { -873057600, -765399600 } + typeOffsets:intvector { -15865, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "010201" } + links:intvector { 188, 536 } + } //Z#188 + /* America/Rainy_River */ :table { + transPre32:intvector { -1, 1928234792 } + trans:intvector { -1632067200, -1615136400, -923248800, -765392400, 136368000, 152089200, 167817600, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -22696, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#189 + /* America/Rankin_Inlet */ :table { + trans:intvector { -410227200, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -21600, 7200, -18000, 0 } + typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102040201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#190 + /* America/Recife */ :table { + trans:intvector { -1767217224, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -191365200, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 938919600, 951616800, 970974000, 971575200, 1003028400, 1013911200 } + typeOffsets:intvector { -8376, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201" } + } //Z#191 + /* America/Regina */ :table { + trans:intvector { -2030202084, -1632063600, -1615132800, -1251651600, -1238349600, -1220202000, -1206900000, -1188752400, -1175450400, -1156698000, -1144000800, -1125248400, -1111946400, -1032714000, -1016992800, -1001264400, -986148000, -969814800, -954093600, -937760400, -922039200, -906310800, -890589600, -880210800, -765388800, -748450800, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -620838000, -608140800, -589388400, -576086400, -557938800, -544636800, -526489200, -513187200, -495039600, -481737600, -463590000, -450288000, -431535600, -418233600, -400086000, -386784000, -337186800, -321465600, -305737200 } + typeOffsets:intvector { -25116, 0, -25200, 0, -25200, 3600, -21600, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } + links:intvector { 192, 378, 383 } + } //Z#192 + /* America/Resolute */ :table { + trans:intvector { -704937600, -147895200, -131565600, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { 0, 0, -21600, 0, -21600, 3600, -21600, 7200, -18000, 0 } + typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201020102040201020102010201020102040201" } + finalRule { "Canada" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#193 + /* America/Rio_Branco */ :table { + trans:intvector { -1767209328, -1206950400, -1191355200, -1175367600, -1159819200, -633812400, -622062000, -602276400, -591825600, -570740400, -560203200, -539118000, -531345600, -191358000, -184190400, -155156400, -150062400, -128890800, -121118400, -99946800, -89582400, -68410800, -57960000, 499755600, 511243200, 530600400, 540273600, 562136400, 571204800, 1214283600, 1384056000 } + typeOffsets:intvector { -16272, 0, -18000, 0, -18000, 3600, -14400, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010301" } + links:intvector { 186, 194, 366 } + } //Z#194 + /* America/Rosario */ :int { 67 } //Z#195 + /* America/Santa_Isabel */ :table { + trans:intvector { -1514736000, -1451667600, -1343062800, -1234803600, -1222963200, -1207242000, -873820800, -761677200, -686073600, -661539600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200 } + typeOffsets:intvector { -27568, 0, -28800, 0, -28800, 3600, -25200, 0 } + typeMap:bin { "030103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Mexico" } + finalRaw:int { -28800 } + finalYear:int { 2003 } + } //Z#196 + /* America/Santarem */ :table { + trans:intvector { -1767212472, -1206954000, -1191358800, -1175371200, -1159822800, -633816000, -622065600, -602280000, -591829200, -570744000, -560206800, -539121600, -531349200, -191361600, -184194000, -155160000, -150066000, -128894400, -121122000, -99950400, -89586000, -68414400, -57963600, 499752000, 511239600, 530596800, 540270000, 562132800, 571201200, 1214280000 } + typeOffsets:intvector { -13128, 0, -14400, 0, -14400, 3600, -10800, 0 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020103" } + } //Z#197 + /* America/Santiago */ :table { + trans:intvector { -1892661434, -1688410800, -1619205434, -1593806400, -1335986234, -1317585600, -1304362800, -1286049600, -1272826800, -1254513600, -1241290800, -1222977600, -1209754800, -1191355200, -1178132400, -870552000, -865278000, -740520000, -736376400, -718056000, -713649600, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1430017200 } + typeOffsets:intvector { -16966, 0, -18000, 0, -18000, 3600, -14400, 0, -14400, 3600, -10800, 0 } + typeMap:bin { "01000300020102010201020102010301030403010304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030405" } + links:intvector { 198, 385 } + } //Z#198 + /* America/Santo_Domingo */ :table { + transPre32:intvector { -1, 1770462472 } + trans:intvector { -1159773600, -100119600, -89668800, -5770800, 4422600, 25678800, 33193800, 57733200, 64816200, 89182800, 96438600, 120632400, 127974600, 152082000, 972799200, 975823200 } + typeOffsets:intvector { -16776, 0, -18000, 0, -18000, 1800, -18000, 3600, -16800, 0, -14400, 0 } + typeMap:bin { "0401030102010201020102010201050105" } + } //Z#199 + /* America/Sao_Paulo */ :table { + trans:intvector { -1767214412, -1206957600, -1191362400, -1175374800, -1159826400, -633819600, -622069200, -602283600, -591832800, -570747600, -560210400, -539125200, -531352800, -195426000, -184197600, -155163600, -150069600, -128898000, -121125600, -99954000, -89589600, -68418000, -57967200, 499748400, 511236000, 530593200, 540266400, 562129200, 571197600, 592974000, 602042400, 624423600, 634701600, 656478000, 666756000, 687927600, 697600800, 719982000, 728445600, 750826800, 761709600, 782276400, 793159200, 813726000, 824004000, 844570800, 856058400, 876106800, 888717600, 908074800, 919562400, 938919600, 951616800, 970974000, 982461600, 1003028400, 1013911200, 1036292400, 1045360800, 1066532400, 1076810400, 1099364400, 1108864800, 1129431600, 1140314400, 1162695600, 1172368800, 1192330800, 1203213600, 1224385200, 1234663200, 1255834800, 1266717600, 1287284400, 1298167200, 1318734000, 1330221600, 1350788400, 1361066400, 1382238000, 1392516000, 1413687600, 1424570400, 1445137200, 1456020000, 1476586800, 1487469600, 1508036400, 1518919200, 1540090800, 1550368800, 1571540400, 1581818400, 1602990000, 1613872800, 1634439600, 1645322400, 1665889200, 1677376800, 1697338800, 1708221600, 1729393200, 1739671200, 1760842800, 1771725600, 1792292400, 1803175200, 1823742000, 1834624800, 1855191600, 1866074400, 1887246000, 1897524000, 1918695600, 1928973600, 1950145200, 1960423200, 1981594800, 1992477600, 2013044400, 2024532000, 2044494000, 2055376800, 2076548400, 2086826400, 2107998000, 2118880800, 2139447600 } + transPost32:intvector { 0, -2144636896, 0, -2124070096 } + typeOffsets:intvector { -11188, 0, -10800, 0, -10800, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "Brazil" } + finalRaw:int { -10800 } + finalYear:int { 2039 } + links:intvector { 200, 364, 368 } + } //Z#200 + /* America/Scoresbysund */ :table { + trans:intvector { -1686090728, 323841600, 338961600, 354679200, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -5272, 0, -7200, 0, -7200, 3600, -3600, 0, -3600, 3600 } + typeMap:bin { "0102010403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { -3600 } + finalYear:int { 1997 } + } //Z#201 + /* America/Shiprock */ :int { 109 } //Z#202 + /* America/Sitka */ :table { + transPre32:intvector { -1, 1069601369, -1, 2106012569 } + trans:intvector { -880207200, -765385200, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } + typeOffsets:intvector { 53927, 0, -32473, 0, -32400, 0, -32400, 3600, -28800, 0, -28800, 3600 } + typeMap:bin { "01040504050405040504050405040504050405040504050405040504050405040502030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "US" } + finalRaw:int { -32400 } + finalYear:int { 2008 } + } //Z#203 + /* America/St_Barthelemy */ :int { 185 } //Z#204 + /* America/St_Johns */ :table { + trans:intvector { -1664130548, -1650137348, -1632076148, -1615145348, -1598650148, -1590100148, -1567286948, -1551565748, -1535837348, -1520116148, -1503782948, -1488666548, -1472333348, -1457216948, -1440883748, -1425767348, -1409434148, -1394317748, -1377984548, -1362263348, -1346534948, -1330813748, -1314480548, -1299364148, -1283030948, -1267914548, -1251581348, -1236464948, -1220131748, -1205015348, -1188682148, -1172960948, -1156627748, -1141511348, -1125178148, -1110061748, -1096921748, -1093728600, -1078612200, -1061670600, -1048973400, -1030221000, -1017523800, -998771400, -986074200, -966717000, -954624600, -935267400, -922570200, -903817800, -891120600, -872368200, -765401400, -746044200, -733347000, -714594600, -701897400, -683145000, -670447800, -651695400, -638998200, -619641000, -606943800, -589401000, -576099000, -557951400, -544649400, -526501800, -513199800, -495052200, -481750200, -463602600, -450300600, -431548200, -418246200, -400098600, -386796600, -368649000, -355347000, -337199400, -323897400, -305749800, -289423800, -273695400, -257974200, -242245800, -226524600, -210796200, -195075000, -179346600, -163625400, -147897000, -131571000, -116447400, -100121400, -84393000, -68671800, -52943400, -37222200, -21493800, -5772600, 9955800, 25677000, 41405400, 57731400, 73459800, 89181000, 104909400, 120630600, 136359000, 152080200, 167808600, 183529800, 199258200, 215584200, 230707800, 247033800, 262762200, 278483400, 294211800, 309933000, 325661400, 341382600, 357111000, 372832200, 388560600, 404886600, 420010200, 436336200, 452064600, 467785800, 483514200, 499235400, 514963800, 530685000, 544591860, 562127460, 576041460, 594178260, 607491060, 625631460, 638940660, 657081060, 670995060, 688530660, 702444660, 719980260, 733894260, 752034660, 765343860, 783484260, 796793460, 814933860, 828847860, 846383460, 860297460, 877833060, 891747060, 909282660, 923196660, 941337060, 954646260, 972786660, 986095860, 1004236260, 1018150260, 1035685860, 1049599860, 1067135460, 1081049460, 1099189860, 1112499060, 1130639460, 1143948660, 1162089060, 1173583860, 1194143460, 1205033460, 1225593060, 1236483060, 1257042660, 1268537460, 1289097060, 1299987060, 1320553800, 1331443800, 1352003400 } + typeOffsets:intvector { -12652, 0, -12652, 3600, -12600, 0, -12600, 3600, -12600, 7200 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010002030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020402030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Canada" } + finalRaw:int { -12600 } + finalYear:int { 2013 } + links:intvector { 205, 372, 381 } + } //Z#205 + /* America/St_Kitts */ :int { 185 } //Z#206 + /* America/St_Lucia */ :int { 185 } //Z#207 + /* America/St_Thomas */ :int { 185 } //Z#208 + /* America/St_Vincent */ :int { 185 } //Z#209 + /* America/Swift_Current */ :table { + trans:intvector { -2030201320, -1632063600, -1615132800, -880210800, -765388800, -747241200, -732729600, -715791600, -702489600, -684342000, -671040000, -652892400, -639590400, -400086000, -384364800, -337186800, -321465600, -305737200, -292435200, -273682800, -260985600, 73472400 } + typeOffsets:intvector { -25880, 0, -25200, 0, -25200, 3600, -21600, 0 } + typeMap:bin { "01020102010201020102010201020102010201020103" } + } //Z#210 + /* America/Tegucigalpa */ :table { + trans:intvector { -1538503868, 547020000, 559717200, 578469600, 591166800, 1146981600, 1154926800 } + typeOffsets:intvector { -20932, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "01020102010201" } + } //Z#211 + /* America/Thule */ :table { + trans:intvector { -1686079492, 670399200, 686120400, 701848800, 717570000, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } + typeOffsets:intvector { -16508, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Thule" } + finalRaw:int { -14400 } + finalYear:int { 2008 } + } //Z#212 + /* America/Thunder_Bay */ :table { + transPre32:intvector { -1, 1928233516 } + trans:intvector { -1893434400, -880218000, -765396000, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -21420, 0, -21600, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Canada" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#213 + /* America/Tijuana */ :table { + trans:intvector { -1514736000, -1451667600, -1343062800, -1234803600, -1222963200, -1207242000, -873820800, -761677200, -686073600, -661539600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1175421600, 1193562000, 1207476000, 1225011600, 1238925600, 1256461200, 1268560800, 1289120400 } + typeOffsets:intvector { -28084, 0, -28800, 0, -28800, 3600, -25200, 0 } + typeMap:bin { "03010301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -28800 } + finalYear:int { 2011 } + links:intvector { 115, 214, 525 } + } //Z#214 + /* America/Toronto */ :table { + transPre32:intvector { -1, 1928231148 } + trans:intvector { -1632070800, -1615140000, -1601753400, -1583697600, -1567357200, -1554667200, -1534698000, -1524074400, -1503248400, -1492365600, -1471798800, -1460916000, -1440954000, -1428861600, -1409504400, -1397412000, -1378054800, -1365962400, -1346605200, -1333908000, -1315155600, -1301853600, -1283706000, -1270404000, -1252256400, -1238954400, -1220806800, -1207504800, -1188752400, -1176055200, -1157302800, -1144000800, -1125853200, -1112551200, -1094403600, -1081101600, -1062954000, -1049652000, -1031504400, -1018202400, -1000054800, -986752800, -968000400, -955303200, -936550800, -765396000, -747248400, -733946400, -715806000, -702504000, -684356400, -671054400, -652906800, -634161600, -620845200, -602704800, -589395600, -576093600, -557946000, -544644000, -526496400, -513194400, -495046800, -481744800, -463597200, -450295200, -431542800, -418240800, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 136364400, 152085600, 167814000, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -19052, 0, -18000, 0, -18000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + links:intvector { 169, 215, 379 } + } //Z#215 + /* America/Tortola */ :int { 185 } //Z#216 + /* America/Vancouver */ :table { + transPre32:intvector { -1, 1581086444 } + trans:intvector { -1632060000, -1615129200, -880207200, -765385200, -747237600, -732726000, -715788000, -702486000, -684338400, -671036400, -652888800, -639586800, -620834400, -608137200, -589384800, -576082800, -557935200, -544633200, -526485600, -513183600, -495036000, -481734000, -463586400, -450284400, -431532000, -418230000, -400082400, -386780400, -368632800, -355330800, -337183200, -323881200, -305733600, -292431600, -273679200, -260982000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 136375200, 152096400, 167824800, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } + typeOffsets:intvector { -29548, 0, -28800, 0, -28800, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -28800 } + finalYear:int { 2008 } + links:intvector { 217, 382 } + } //Z#217 + /* America/Virgin */ :int { 185 } //Z#218 + /* America/Whitehorse */ :table { + transPre32:intvector { -1, 2105969308 } + trans:intvector { -1632056400, -1615125600, -1596978000, -1583164800, -880203600, -765381600, -147884400, -131554800, -81961200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } + typeOffsets:intvector { -32412, 0, -32400, 0, -32400, 3600, -32400, 7200, -28800, 0, -28800, 3600 } + typeMap:bin { "010201020102010301040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "Canada" } + finalRaw:int { -28800 } + finalYear:int { 2008 } + links:intvector { 219, 384 } + } //Z#219 + /* America/Winnipeg */ :table { + transPre32:intvector { -1, 1692709012 } + trans:intvector { -1694368800, -1681671600, -1632067200, -1615136400, -1029686400, -1018198800, -880214400, -765392400, -746035200, -732733200, -715795200, -702493200, -684345600, -671043600, -652896000, -639594000, -620755200, -607626000, -589392000, -576090000, -557942400, -544640400, -526492800, -513190800, -495043200, -481741200, -463593600, -450291600, -431539200, -418237200, -400089600, -386787600, -368640000, -355338000, -337190400, -321469200, -305740800, -292438800, -210787200, -198090000, -116438400, -100108800, -84384000, -68659200, -52934400, -37209600, -21484800, -5760000, 9964800, 25689600, 41414400, 57744000, 73468800, 89193600, 104918400, 120643200, 136368000, 152092800, 167817600, 183542400, 199267200, 215596800, 230716800, 247046400, 262771200, 278496000, 294220800, 309945600, 325670400, 341395200, 357120000, 372844800, 388569600, 404899200, 420019200, 436348800, 452073600, 467798400, 483523200, 499248000, 514972800, 530697600, 544608000, 562147200, 576057600, 594201600, 607507200, 625651200, 638956800, 657100800, 671011200, 688550400, 702460800, 720000000, 733910400, 752054400, 765360000, 783504000, 796809600, 814953600, 828864000, 846403200, 860313600, 877852800, 891763200, 909302400, 923212800, 941356800, 954662400, 972806400, 986112000, 1004256000, 1018166400, 1035705600, 1049616000, 1067155200, 1081065600, 1099209600, 1112515200, 1130659200, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -23316, 0, -21600, 0, -21600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + links:intvector { 220, 377 } + } //Z#220 + /* America/Yakutat */ :table { + transPre32:intvector { -1, 1069602431, -1, 2106013631 } + trans:intvector { -880203600, -765381600, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 152100000, 162385200, 183549600, 199278000, 215604000, 230727600, 247053600, 262782000, 278503200, 294231600, 309952800, 325681200, 341402400, 357130800, 372852000, 388580400, 404906400, 420030000, 436356000, 452084400, 467805600, 483534000, 499255200, 514983600, 530704800, 544618800, 562154400, 576068400, 594208800, 607518000, 625658400, 638967600, 657108000, 671022000, 688557600, 702471600, 720007200, 733921200, 752061600, 765370800, 783511200, 796820400, 814960800, 828874800, 846410400, 860324400, 877860000, 891774000, 909309600, 923223600, 941364000, 954673200, 972813600, 986122800, 1004263200, 1018177200, 1035712800, 1049626800, 1067162400, 1081076400, 1099216800, 1112526000, 1130666400, 1143975600, 1162116000, 1173610800, 1194170400 } + typeOffsets:intvector { 52865, 0, -33535, 0, -32400, 0, -32400, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "US" } + finalRaw:int { -32400 } + finalYear:int { 2008 } + } //Z#221 + /* America/Yellowknife */ :table { + trans:intvector { -1104537600, -880210800, -765388800, -147891600, -131562000, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { 0, 0, -25200, 0, -25200, 3600, -25200, 7200 } + typeMap:bin { "01020103010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Canada" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + } //Z#222 + /* Antarctica/Casey */ :table { + trans:intvector { -31536000, 1255802400, 1267714800, 1319738400, 1329843600 } + typeOffsets:intvector { 0, 0, 28800, 0, 39600, 0 } + typeMap:bin { "0102010201" } + } //Z#223 + /* Antarctica/Davis */ :table { + trans:intvector { -409190400, -163062000, -28857600, 1255806000, 1268251200, 1319742000, 1329854400 } + typeOffsets:intvector { 0, 0, 18000, 0, 25200, 0 } + typeMap:bin { "02000201020102" } + } //Z#224 + /* Antarctica/DumontDUrville */ :table { + trans:intvector { -725846400, -566992800, -415497600 } + typeOffsets:intvector { 0, 0, 36000, 0 } + typeMap:bin { "010001" } + } //Z#225 + /* Antarctica/Macquarie */ :table { + transPre32:intvector { -1, 2080708096 } + trans:intvector { -1680508800, -1665392400, -1601719200, -687052800, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000, 1238860800, 1254585600, 1270310400 } + typeOffsets:intvector { 0, 0, 36000, 0, 36000, 3600, 39600, 0 } + typeMap:bin { "01020100010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } + } //Z#226 + /* Antarctica/Mawson */ :table { + trans:intvector { -501206400, 1255809600 } + typeOffsets:intvector { 0, 0, 18000, 0, 21600, 0 } + typeMap:bin { "0201" } + } //Z#227 + /* Antarctica/McMurdo */ :int { 540 } //Z#228 + /* Antarctica/Palmer */ :table { + trans:intvector { -157766400, -152658000, -132955200, -121122000, -101419200, -86821200, -71092800, -54766800, -39038400, -23317200, -7588800, 128142000, 136605600, 389070000, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1430017200 } + typeOffsets:intvector { 0, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "0201020102010201020103040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203" } + } //Z#229 + /* Antarctica/Rothera */ :table { + trans:intvector { 218246400 } + typeOffsets:intvector { 0, 0, -10800, 0 } + typeMap:bin { "01" } + } //Z#230 + /* Antarctica/South_Pole */ :int { 540 } //Z#231 + /* Antarctica/Syowa */ :table { + trans:intvector { -407808000 } + typeOffsets:intvector { 0, 0, 10800, 0 } + typeMap:bin { "01" } + } //Z#232 + /* Antarctica/Troll */ :table { + trans:intvector { 1111885200, 1130634000 } + typeOffsets:intvector { 0, 0, 0, 7200 } + typeMap:bin { "0100" } + finalRule { "Troll" } + finalRaw:int { 0 } + finalYear:int { 2006 } + } //Z#233 + /* Antarctica/Vostok */ :table { + trans:intvector { -380073600 } + typeOffsets:intvector { 0, 0, 21600, 0 } + typeMap:bin { "01" } + } //Z#234 + /* Arctic/Longyearbyen */ :int { 464 } //Z#235 + /* Asia/Aden */ :int { 303 } //Z#236 + /* Asia/Almaty */ :table { + trans:intvector { -1441170468, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400 } + typeOffsets:intvector { 18468, 0, 18000, 0, 21600, 0, 21600, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + } //Z#237 + /* Asia/Amman */ :table { + trans:intvector { -1230776624, 108165600, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 215643600, 231285600, 244501200, 262735200, 275950800, 481154400, 496962000, 512949600, 528670800, 544399200, 560120400, 575848800, 592174800, 610581600, 623624400, 641167200, 655074000, 671839200, 685918800, 702856800, 717973200, 733701600, 749422800, 765151200, 779662800, 797205600, 811116000, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 930780000, 938124000, 954367200, 970178400, 985816800, 1001628000, 1017352800, 1033077600, 1048802400, 1066946400, 1080252000, 1097791200, 1112306400, 1128031200, 1143756000, 1161900000, 1175205600, 1193349600, 1206655200, 1225404000, 1238104800, 1256853600, 1269554400, 1288303200, 1301608800, 1319752800, 1333058400, 1387486800, 1395957600, 1414706400 } + typeOffsets:intvector { 8624, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Jordan" } + finalRaw:int { 7200 } + finalYear:int { 2015 } + } //Z#238 + /* Asia/Anadyr */ :table { + trans:intvector { -1441194596, -1247572800, 354884400, 370692000, 386420400, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } + typeOffsets:intvector { 42596, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600, 46800, 0, 46800, 3600 } + typeMap:bin { "03050605040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } + } //Z#239 + /* Asia/Aqtau */ :table { + trans:intvector { -1441164064, -1247544000, 370724400, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1110830400 } + typeOffsets:intvector { 12064, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "010305040304030403040304030403040304030403040304030403020102010201020102010201020102010201020103" } + } //Z#240 + /* Asia/Aqtobe */ :table { + trans:intvector { -1441165720, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000 } + typeOffsets:intvector { 13720, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "010203040302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + } //Z#241 + /* Asia/Ashgabat */ :table { + trans:intvector { -1441166012, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000 } + typeOffsets:intvector { 14012, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600 } + typeMap:bin { "01030403040304030403040304030403040304030403020103" } + links:intvector { 242, 243 } + } //Z#242 + /* Asia/Ashkhabad */ :int { 242 } //Z#243 + /* Asia/Baghdad */ :table { + transPre32:intvector { -1, 1770435036 } + trans:intvector { -1641005856, 389048400, 402264000, 417906000, 433800000, 449614800, 465422400, 481150800, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670464000, 686275200, 702086400, 717897600, 733622400, 749433600, 765158400, 780969600, 796694400, 812505600, 828316800, 844128000, 859852800, 875664000, 891388800, 907200000, 922924800, 938736000, 954547200, 970358400, 986083200, 1001894400, 1017619200, 1033430400, 1049155200, 1064966400, 1080777600, 1096588800, 1112313600, 1128124800, 1143849600, 1159660800, 1175385600, 1191196800 } + typeOffsets:intvector { 10660, 0, 10656, 0, 10800, 0, 10800, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + } //Z#244 + /* Asia/Bahrain */ :int { 300 } //Z#245 + /* Asia/Baku */ :table { + trans:intvector { -1441163964, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701812800, 717534000, 828234000, 846378000, 859680000, 877824000 } + typeOffsets:intvector { 11964, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "010304030403040304030403040304030403040304030201020304030403" } + finalRule { "Azer" } + finalRaw:int { 14400 } + finalYear:int { 1998 } + } //Z#246 + /* Asia/Bangkok */ :table { + trans:intvector { -1570084924 } + typeOffsets:intvector { 24124, 0, 25200, 0 } + typeMap:bin { "01" } + links:intvector { 247, 297, 324 } + } //Z#247 + /* Asia/Beirut */ :table { + transPre32:intvector { -1, 1454817976 } + trans:intvector { -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1473645600, -1460948400, -399866400, -386650800, -368330400, -355114800, -336794400, -323578800, -305172000, -291956400, -273636000, -260420400, 78012000, 86734800, 105055200, 118270800, 136591200, 149806800, 168127200, 181342800, 199749600, 212965200, 231285600, 244501200, 262735200, 275950800, 452210400, 466722000, 483746400, 498258000, 515282400, 529794000, 546818400, 561330000, 581119200, 592952400, 610754400, 624488400, 641512800, 656024400, 673048800, 687560400, 704671200, 718146000, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 906843600, 922572000, 941317200 } + typeOffsets:intvector { 8520, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Lebanon" } + finalRaw:int { 7200 } + finalYear:int { 2000 } + } //Z#248 + /* Asia/Bishkek */ :table { + trans:intvector { -1441169904, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 683582400, 703018800, 717530400, 734468400, 748980000, 765918000, 780429600, 797367600, 811879200, 828817200, 843933600, 859671000, 877811400, 891120600, 909261000, 922570200, 941315400, 954019800, 972765000, 985469400, 1004214600, 1017523800, 1035664200, 1048973400, 1067113800, 1080423000, 1099168200, 1111872600, 1123783200 } + typeOffsets:intvector { 17904, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + typeMap:bin { "01030403040304030403040304030403040304030403020102010201020102010201020102010201020102010201020102010203" } + } //Z#249 + /* Asia/Brunei */ :table { + trans:intvector { -1383464380, -1167636600 } + typeOffsets:intvector { 27580, 0, 27000, 0, 28800, 0 } + typeMap:bin { "0102" } + } //Z#250 + /* Asia/Calcutta */ :int { 281 } //Z#251 + /* Asia/Chita */ :table { + trans:intvector { -1579419232, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701791200, 717512400, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } + typeOffsets:intvector { 27232, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030501" } + } //Z#252 + /* Asia/Choibalsan */ :table { + trans:intvector { -2032933080, 252435600, 417974400, 433778400, 449593200, 465314400, 481042800, 496764000, 512492400, 528213600, 543942000, 559663200, 575391600, 591112800, 606841200, 622562400, 638290800, 654616800, 670345200, 686066400, 701794800, 717516000, 733244400, 748965600, 764694000, 780415200, 796143600, 811864800, 828198000, 843919200, 859647600, 875368800, 891097200, 906818400, 988390800, 1001692800, 1017421200, 1033142400, 1048870800, 1064592000, 1080320400, 1096041600, 1111770000, 1127491200, 1143219600, 1159545600, 1206889200, 1427479200, 1443193200 } + typeOffsets:intvector { 27480, 0, 25200, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600 } + typeMap:bin { "01020504050405040504050405040504050405040504050405040504050405040504050405040504050405040504020302" } + finalRule { "Mongol" } + finalRaw:int { 28800 } + finalYear:int { 2016 } + } //Z#253 + /* Asia/Chongqing */ :int { 308 } //Z#254 + /* Asia/Chungking */ :int { 308 } //Z#255 + /* Asia/Colombo */ :table { + transPre32:intvector { -1, 1454807332 } + trans:intvector { -2019705572, -883287000, -862639200, -764051400, 832962600, 846266400, 1145039400 } + typeOffsets:intvector { 19164, 0, 19172, 0, 19800, 0, 19800, 1800, 19800, 3600, 21600, 0, 23400, 0 } + typeMap:bin { "0102030402060502" } + } //Z#256 + /* Asia/Dacca */ :int { 259 } //Z#257 + /* Asia/Damascus */ :table { + trans:intvector { -1577931912, -1568592000, -1554080400, -1537142400, -1522630800, -1505692800, -1491181200, -1474243200, -1459126800, -242265600, -228877200, -210556800, -197427600, -178934400, -165718800, -147398400, -134269200, -116467200, -102646800, -84326400, -71110800, -52704000, -39488400, -21168000, -7952400, 10368000, 23583600, 41904000, 55119600, 73526400, 86742000, 105062400, 118278000, 136598400, 149814000, 168134400, 181350000, 199756800, 212972400, 231292800, 241916400, 262828800, 273452400, 418694400, 433810800, 450316800, 465433200, 508896000, 529196400, 541555200, 562633200, 574387200, 594255600, 607305600, 623199600, 638928000, 654649200, 670456800, 686264400, 702684000, 717886800, 733096800, 748904400, 765151200, 780958800, 796687200, 812494800, 828309600, 844117200, 859759200, 875653200, 891208800, 907189200, 922917600, 938725200, 954540000, 970347600, 986076000, 1001883600, 1017612000, 1033419600, 1049148000, 1064955600, 1080770400, 1096578000, 1112306400, 1128114000, 1143842400, 1158872400, 1175205600, 1193950800, 1207260000, 1225486800, 1238104800, 1256850000, 1270159200, 1288299600, 1301608800, 1319749200, 1333058400, 1351198800 } + typeOffsets:intvector { 8712, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Syria" } + finalRaw:int { 7200 } + finalYear:int { 2013 } + } //Z#258 + /* Asia/Dhaka */ :table { + transPre32:intvector { -1, 1770423996 } + trans:intvector { -891582800, -872058600, -862637400, -576138600, 1245430800, 1262278800 } + typeOffsets:intvector { 21700, 0, 19800, 0, 21200, 0, 21600, 0, 21600, 3600, 23400, 0 } + typeMap:bin { "02050105030403" } + links:intvector { 257, 259, 365 } + } //Z#259 + /* Asia/Dili */ :table { + trans:intvector { -1830414140, -879152400, 199897200, 969120000 } + typeOffsets:intvector { 30140, 0, 28800, 0, 32400, 0 } + typeMap:bin { "01020102" } + } //Z#260 + /* Asia/Dubai */ :table { + trans:intvector { -1577936472 } + typeOffsets:intvector { 13272, 0, 14400, 0 } + typeMap:bin { "01" } + links:intvector { 261, 291 } + } //Z#261 + /* Asia/Dushanbe */ :table { + trans:intvector { -1441168512, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 684363600 } + typeOffsets:intvector { 16512, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + typeMap:bin { "010304030403040304030403040304030403040304030201" } + } //Z#262 + /* Asia/Gaza */ :table { + transPre32:intvector { -1, 2109557424 } + trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1219957200, 1238104800, 1252015200, 1269640860, 1281474000, 1301608860, 1312146000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600 } + typeOffsets:intvector { 8272, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Palestine" } + finalRaw:int { 7200 } + finalYear:int { 2016 } + } //Z#263 + /* Asia/Harbin */ :int { 308 } //Z#264 + /* Asia/Hebron */ :table { + transPre32:intvector { -1, 2109557273 } + trans:intvector { -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -399088800, -386650800, -368330400, -355114800, -336790800, -323654400, -305168400, -292032000, -273632400, -260496000, -242096400, -228960000, -210560400, -197424000, -178938000, -165801600, -147402000, -134265600, -115866000, -102643200, -84330000, -81313200, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 828655200, 843170400, 860104800, 874620000, 891554400, 906069600, 924213600, 939934800, 956268000, 971989200, 987717600, 1003438800, 1019167200, 1034888400, 1050616800, 1066338000, 1082066400, 1096581600, 1113516000, 1128380400, 1143842400, 1158872400, 1175378400, 1189638000, 1206655200, 1220216400, 1238104800, 1252015200, 1269554400, 1281474000, 1301608860, 1312146000, 1314655200, 1317330000, 1333058400, 1348178400, 1364508000, 1380229200, 1395957600, 1414098000, 1427493600, 1445547600 } + typeOffsets:intvector { 8423, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Palestine" } + finalRaw:int { 7200 } + finalYear:int { 2016 } + } //Z#265 + /* Asia/Ho_Chi_Minh */ :table { + trans:intvector { -2004073600, -1851577590, -852105600, -782643600, -767869200, -718095600, -457776000, -315648000, 171820800 } + typeOffsets:intvector { 25600, 0, 25200, 0, 25590, 0, 28800, 0, 32400, 0 } + typeMap:bin { "020103040103010301" } + links:intvector { 266, 304, 618 } + } //Z#266 + /* Asia/Hong_Kong */ :table { + trans:intvector { -2056693002, -907389000, -891667800, -884246400, -766746000, -747981000, -728544600, -717049800, -694503000, -683785800, -668064600, -654755400, -636615000, -623305800, -605165400, -591856200, -573715800, -559801800, -542352600, -528352200, -510211800, -498112200, -478762200, -466662600, -446707800, -435213000, -415258200, -403158600, -383808600, -371709000, -352359000, -340259400, -320909400, -308809800, -288855000, -277360200, -257405400, -245910600, -225955800, -213856200, -194506200, -182406600, -163056600, -148537800, -132816600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72214200, 88540200, 104268600, 119989800, 126041400, 151439400, 167167800, 182889000, 198617400, 214338600, 295385400, 309292200 } + typeOffsets:intvector { 27402, 0, 28800, 0, 28800, 3600, 32400, 0 } + typeMap:bin { "010201030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 267, 499 } + } //Z#267 + /* Asia/Hovd */ :table { + trans:intvector { -2032927596, 252439200, 417978000, 433785600, 449600400, 465321600, 481050000, 496771200, 512499600, 528220800, 543949200, 559670400, 575398800, 591120000, 606848400, 622569600, 638298000, 654624000, 670352400, 686073600, 701802000, 717523200, 733251600, 748972800, 764701200, 780422400, 796150800, 811872000, 828205200, 843926400, 859654800, 875376000, 891104400, 906825600, 988398000, 1001700000, 1017428400, 1033149600, 1048878000, 1064599200, 1080327600, 1096048800, 1111777200, 1127498400, 1143226800, 1159552800, 1427482800, 1443196800 } + typeOffsets:intvector { 21996, 0, 21600, 0, 25200, 0, 25200, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Mongol" } + finalRaw:int { 25200 } + finalYear:int { 2016 } + } //Z#268 + /* Asia/Irkutsk */ :table { + trans:intvector { -1575874625, -1247554800, 354902400, 370710000, 386438400, 402246000, 417974400, 433782000, 449596800, 465328800, 481053600, 496778400, 512503200, 528228000, 543952800, 559677600, 575402400, 591127200, 606852000, 622576800, 638301600, 654631200, 670356000, 686084400, 695761200, 701794800, 717516000, 733255200, 748980000, 764704800, 780429600, 796154400, 811879200, 828208800, 846352800, 859658400, 877802400, 891108000, 909252000, 922557600, 941306400, 954007200, 972756000, 985456800, 1004205600, 1017511200, 1035655200, 1048960800, 1067104800, 1080410400, 1099159200, 1111860000, 1130608800, 1143309600, 1162058400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200, 1256407200, 1269712800, 1288461600, 1301162400, 1414256400 } + typeOffsets:intvector { 25025, 0, 25200, 0, 25200, 3600, 28800, 0, 28800, 3600, 32400, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#269 + /* Asia/Istanbul */ :int { 449 } //Z#270 + /* Asia/Jakarta */ :table { + trans:intvector { -1451719200, -1172906400, -876641400, -766054800, -683883000, -620812800, -189415800 } + typeOffsets:intvector { 25632, 0, 25200, 0, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + typeMap:bin { "02030503040301" } + } //Z#271 + /* Asia/Jayapura */ :table { + trans:intvector { -1172913768, -799491600, -189423000 } + typeOffsets:intvector { 33768, 0, 32400, 0, 34200, 0 } + typeMap:bin { "010201" } + } //Z#272 + /* Asia/Jerusalem */ :table { + transPre32:intvector { -1, 1454818042 } + trans:intvector { -1641003640, -933645600, -857358000, -844300800, -825822000, -812685600, -794199600, -779853600, -762656400, -748310400, -731127600, -681962400, -673243200, -667962000, -652327200, -636426000, -622087200, -608947200, -591847200, -572486400, -558576000, -542851200, -527731200, -514425600, -490845600, -482986800, -459475200, -451537200, -428551200, -418262400, -400032000, -387428400, 142380000, 150843600, 167176800, 178664400, 482277600, 495579600, 516751200, 526424400, 545436000, 558478800, 576626400, 589323600, 609890400, 620773200, 638316000, 651618000, 669765600, 683672400, 701820000, 715726800, 733701600, 747176400, 765151200, 778021200, 796600800, 810075600, 826840800, 842821200, 858895200, 874184400, 890344800, 905029200, 923011200, 936313200, 955670400, 970783200, 986770800, 1001282400, 1017356400, 1033941600, 1048806000, 1065132000, 1081292400, 1095804000, 1112313600, 1128812400, 1143763200, 1159657200, 1175212800, 1189897200, 1206662400, 1223161200, 1238112000, 1254006000, 1269561600, 1284246000, 1301616000, 1317510000, 1333065600, 1348354800, 1364515200, 1382828400 } + typeOffsets:intvector { 8454, 0, 7200, 0, 7200, 3600, 7200, 7200, 8440, 0 } + typeMap:bin { "0401020102010201020102010302010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "Zion" } + finalRaw:int { 7200 } + finalYear:int { 2014 } + links:intvector { 273, 315, 515 } + } //Z#273 + /* Asia/Kabul */ :table { + transPre32:intvector { -1, 1770429088 } + trans:intvector { -788932800 } + typeOffsets:intvector { 16608, 0, 14400, 0, 16200, 0 } + typeMap:bin { "0102" } + } //Z#274 + /* Asia/Kamchatka */ :table { + trans:intvector { -1487759676, -1247569200, 354888000, 370695600, 386424000, 402231600, 417960000, 433767600, 449582400, 465314400, 481039200, 496764000, 512488800, 528213600, 543938400, 559663200, 575388000, 591112800, 606837600, 622562400, 638287200, 654616800, 670341600, 686070000, 695746800, 701780400, 717501600, 733240800, 748965600, 764690400, 780415200, 796140000, 811864800, 828194400, 846338400, 859644000, 877788000, 891093600, 909237600, 922543200, 941292000, 953992800, 972741600, 985442400, 1004191200, 1017496800, 1035640800, 1048946400, 1067090400, 1080396000, 1099144800, 1111845600, 1130594400, 1143295200, 1162044000, 1174744800, 1193493600, 1206799200, 1224943200, 1238248800, 1256392800, 1269698400, 1288450800, 1301151600 } + typeOffsets:intvector { 38076, 0, 39600, 0, 39600, 3600, 43200, 0, 43200, 3600 } + typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } + } //Z#275 + /* Asia/Karachi */ :table { + trans:intvector { -1988166492, -862637400, -764145000, -576135000, 1018119660, 1033840860, 1212260400, 1225476000, 1239735600, 1257012000 } + typeOffsets:intvector { 16092, 0, 18000, 0, 18000, 3600, 19800, 0, 19800, 3600 } + typeMap:bin { "03040301020102010201" } + links:intvector { 276, 533 } + } //Z#276 + /* Asia/Kashgar */ :int { 322 } //Z#277 + /* Asia/Kathmandu */ :table { + trans:intvector { -1577943676, 504901800 } + typeOffsets:intvector { 20476, 0, 19800, 0, 20700, 0 } + typeMap:bin { "0102" } + links:intvector { 278, 279 } + } //Z#278 + /* Asia/Katmandu */ :int { 278 } //Z#279 + /* Asia/Khandyga */ :table { + trans:intvector { -1579424533, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701791200, 717512400, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1072882800, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1315832400, 1414252800 } + typeOffsets:intvector { 32533, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } + typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403050605060506050605060506050605070503" } + } //Z#280 + /* Asia/Kolkata */ :table { + transPre32:intvector { -1, 1454805288 } + trans:intvector { -891582800, -872058600, -862637400, -764145000 } + typeOffsets:intvector { 21208, 0, 19800, 0, 19800, 3600, 21200, 0, 23400, 0 } + typeMap:bin { "0304010201" } + links:intvector { 251, 281, 501 } + } //Z#281 + /* Asia/Krasnoyarsk */ :table { + trans:intvector { -1577513486, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288465200, 1301166000, 1414260000 } + typeOffsets:intvector { 22286, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600, 28800, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#282 + /* Asia/Kuala_Lumpur */ :table { + transPre32:intvector { -1, 2117490090 } + trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } + typeOffsets:intvector { 24406, 0, 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + typeMap:bin { "0102030405070506" } + } //Z#283 + /* Asia/Kuching */ :table { + trans:intvector { -1383463280, -1167636600, -1082448000, -1074586800, -1050825600, -1042964400, -1019289600, -1011428400, -987753600, -979892400, -956217600, -948356400, -924595200, -916734000, -893059200, -885198000, -879667200, -767005200 } + typeOffsets:intvector { 26480, 0, 27000, 0, 28800, 0, 28800, 1200, 32400, 0 } + typeMap:bin { "010203020302030203020302030203020402" } + } //Z#284 + /* Asia/Kuwait */ :int { 303 } //Z#285 + /* Asia/Macao */ :int { 287 } //Z#286 + /* Asia/Macau */ :table { + trans:intvector { -1830411260, -277360200, -257405400, -245910600, -225955800, -214473600, -194506200, -182406600, -163056600, -150969600, -131619600, -117088200, -101367000, -85638600, -69312600, -53584200, -37863000, -22134600, -6413400, 9315000, 25036200, 40764600, 56485800, 72201600, 87922800, 103651200, 119977200, 135705600, 151439400, 167167800, 182889000, 198617400, 214338600, 230067000, 245788200, 261504000, 277225200, 292953600, 309279600, 325008000, 340729200 } + typeOffsets:intvector { 27260, 0, 28800, 0, 28800, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 286, 287 } + } //Z#287 + /* Asia/Magadan */ :table { + trans:intvector { -1441188192, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } + typeOffsets:intvector { 36192, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030501" } + } //Z#288 + /* Asia/Makassar */ :table { + trans:intvector { -1172908656, -880272000, -766054800 } + typeOffsets:intvector { 28656, 0, 28800, 0, 32400, 0 } + typeMap:bin { "010201" } + links:intvector { 289, 319 } + } //Z#289 + /* Asia/Manila */ :table { + transPre32:intvector { -1, 350346256, -1, 2065645456 } + trans:intvector { -1046678400, -1038733200, -873273600, -794221200, -496224000, -489315600, 259344000, 275151600 } + typeOffsets:intvector { -57360, 0, 28800, 0, 28800, 3600, 29040, 0, 32400, 0 } + typeMap:bin { "03010201040102010201" } + } //Z#290 + /* Asia/Muscat */ :int { 261 } //Z#291 + /* Asia/Nicosia */ :table { + trans:intvector { -1518920008, 166572000, 182293200, 200959200, 213829200, 228866400, 243982800, 260316000, 276123600, 291765600, 307486800, 323820000, 338936400, 354664800, 370386000, 386114400, 401835600, 417564000, 433285200, 449013600, 465339600, 481068000, 496789200, 512517600, 528238800, 543967200, 559688400, 575416800, 591138000, 606866400, 622587600, 638316000, 654642000, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 843944400, 859672800, 875394000, 891122400, 909277200, 922582800, 941331600 } + typeOffsets:intvector { 8008, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EUAsia" } + finalRaw:int { 7200 } + finalYear:int { 2000 } + links:intvector { 292, 463 } + } //Z#292 + /* Asia/Novokuznetsk */ :table { + trans:intvector { -1441259328, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 748983600, 764708400, 780433200, 796158000, 811882800, 828212400, 846356400, 859662000, 877806000, 891111600, 909255600, 922561200, 941310000, 954010800, 972759600, 985460400, 1004209200, 1017514800, 1035658800, 1048964400, 1067108400, 1080414000, 1099162800, 1111863600, 1130612400, 1143313200, 1162062000, 1174762800, 1193511600, 1206817200, 1224961200, 1238266800, 1256410800, 1269716400, 1288468800, 1301169600 } + typeOffsets:intvector { 20928, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } + typeMap:bin { "01030403040304030403040304030403040304030403020103040304030403040304030403040304030403040304030403040304030403040304030403020103" } + } //Z#293 + /* Asia/Novosibirsk */ :table { + trans:intvector { -1579476700, -1247551200, 354906000, 370713600, 386442000, 402249600, 417978000, 433785600, 449600400, 465332400, 481057200, 496782000, 512506800, 528231600, 543956400, 559681200, 575406000, 591130800, 606855600, 622580400, 638305200, 654634800, 670359600, 686088000, 695764800, 701798400, 717519600, 733258800, 738086400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600 } + typeOffsets:intvector { 19900, 0, 21600, 0, 21600, 3600, 25200, 0, 25200, 3600 } + typeMap:bin { "010304030403040304030403040304030403040304030201030403040201020102010201020102010201020102010201020102010201020102010201020102010301" } + } //Z#294 + /* Asia/Omsk */ :table { + trans:intvector { -1582088010, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400, 1111867200, 1130616000, 1143316800, 1162065600, 1174766400, 1193515200, 1206820800, 1224964800, 1238270400, 1256414400, 1269720000, 1288468800, 1301169600, 1414263600 } + typeOffsets:intvector { 17610, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600, 25200, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#295 + /* Asia/Oral */ :table { + trans:intvector { -1441164324, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622591200, 638316000, 654645600, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1110830400 } + typeOffsets:intvector { 12324, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "01030405040304030403040304030403040302010201020102010201020102010201020102010201020102010201020103" } + } //Z#296 + /* Asia/Phnom_Penh */ :int { 247 } //Z#297 + /* Asia/Pontianak */ :table { + trans:intvector { -1172906240, -881220600, -766054800, -683883000, -620812800, -189415800, 567964800 } + typeOffsets:intvector { 26240, 0, 25200, 0, 27000, 0, 28800, 0, 32400, 0 } + typeMap:bin { "02040203020301" } + } //Z#298 + /* Asia/Pyongyang */ :table { + trans:intvector { -1948782180, -1830414600, 1439564400 } + typeOffsets:intvector { 30180, 0, 30600, 0, 32400, 0 } + typeMap:bin { "010201" } + } //Z#299 + /* Asia/Qatar */ :table { + trans:intvector { -1577935568, 76190400 } + typeOffsets:intvector { 12368, 0, 10800, 0, 14400, 0 } + typeMap:bin { "0201" } + links:intvector { 245, 300 } + } //Z#300 + /* Asia/Qyzylorda */ :table { + trans:intvector { -1441167712, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 695768400, 701802000, 717523200, 733262400, 748987200, 764712000, 780436800, 796161600, 811886400, 828216000, 846360000, 859665600, 877809600, 891115200, 909259200, 922564800, 941313600, 954014400, 972763200, 985464000, 1004212800, 1017518400, 1035662400, 1048968000, 1067112000, 1080417600, 1099166400 } + typeOffsets:intvector { 15712, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + typeMap:bin { "01020304030203020302030203020302030203020302040504050405040504050405040504050405040504050405040504" } + } //Z#301 + /* Asia/Rangoon */ :table { + trans:intvector { -1577946280, -873268200, -778410000 } + typeOffsets:intvector { 23080, 0, 23400, 0, 32400, 0 } + typeMap:bin { "010201" } + } //Z#302 + /* Asia/Riyadh */ :table { + trans:intvector { -719636812 } + typeOffsets:intvector { 11212, 0, 10800, 0 } + typeMap:bin { "01" } + links:intvector { 236, 285, 303 } + } //Z#303 + /* Asia/Saigon */ :int { 266 } //Z#304 + /* Asia/Sakhalin */ :table { + trans:intvector { -2031039048, -768560400, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } + typeOffsets:intvector { 34248, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600 } + typeMap:bin { "0104050405040504050405040504050405040504050403020405040504050405040504030203020302030203020302030203020302030203020302030203020402" } + } //Z#305 + /* Asia/Samarkand */ :table { + trans:intvector { -1441168073, -1247544000, 354913200, 370720800, 386445600, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686091600 } + typeOffsets:intvector { 16073, 0, 14400, 0, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "010203040302030203020302030203020302030203020302" } + } //Z#306 + /* Asia/Seoul */ :table { + trans:intvector { -1948782472, -1830414600, -498128400, -462702600, -451733400, -429784200, -418296600, -399544200, -387451800, -368094600, -356002200, -336645000, -324552600, -305195400, -293103000, -264933000, 547578000, 560883600, 579027600, 592333200 } + typeOffsets:intvector { 30472, 0, 30600, 0, 30600, 3600, 32400, 0, 32400, 3600 } + typeMap:bin { "0103010201020102010201020102010304030403" } + links:intvector { 307, 585 } + } //Z#307 + /* Asia/Shanghai */ :table { + transPre32:intvector { -1, 2117485353 } + trans:intvector { -933494400, -923130000, -908784000, -891594000, 515520000, 527007600, 545155200, 558457200, 576604800, 589906800, 608659200, 621961200, 640108800, 653410800, 671558400, 684860400 } + typeOffsets:intvector { 29143, 0, 28800, 0, 28800, 3600 } + typeMap:bin { "0102010201020102010201020102010201" } + links:intvector { 254, 255, 264, 308, 375, 535 } + } //Z#308 + /* Asia/Singapore */ :table { + trans:intvector { -2038200925, -1167634800, -1073028000, -894180000, -879665400, -767005200, 378664200 } + typeOffsets:intvector { 24925, 0, 25200, 0, 25200, 1200, 26400, 0, 27000, 0, 28800, 0, 32400, 0 } + typeMap:bin { "01020304060405" } + links:intvector { 309, 587 } + } //Z#309 + /* Asia/Srednekolymsk */ :table { + trans:intvector { -1441188892, -1247565600, 354891600, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1414245600 } + typeOffsets:intvector { 36892, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#310 + /* Asia/Taipei */ :table { + transPre32:intvector { -1, 1959718936 } + trans:intvector { -1017820800, -766224000, -745833600, -733827600, -716889600, -699613200, -683884800, -670669200, -652348800, -639133200, -620812800, -607597200, -589276800, -576061200, -562924800, -541760400, -528710400, -510224400, -497174400, -478688400, -465638400, -449830800, -434016000, -418208400, -402480000, -386672400, -370944000, -355136400, -339408000, -323600400, -302515200, -291978000, -270979200, -260442000, 133977600, 149785200, 165513600, 181321200, 299606400, 307551600 } + typeOffsets:intvector { 29160, 0, 28800, 0, 28800, 3600, 32400, 0 } + typeMap:bin { "0103010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 311, 584 } + } //Z#311 + /* Asia/Tashkent */ :table { + trans:intvector { -1441168631, -1247547600, 354909600, 370717200, 386445600, 402253200, 417981600, 433789200, 449604000, 465336000, 481060800, 496785600, 512510400, 528235200, 543960000, 559684800, 575409600, 591134400, 606859200, 622584000, 638308800, 654638400, 670363200, 686091600 } + typeOffsets:intvector { 16631, 0, 18000, 0, 18000, 3600, 21600, 0, 21600, 3600 } + typeMap:bin { "010304030403040304030403040304030403040304030201" } + } //Z#312 + /* Asia/Tbilisi */ :table { + trans:intvector { -1441162751, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701816400, 717537600, 733266000, 748987200, 764715600, 780436800, 796161600, 811882800, 828216000, 877806000, 891115200, 909255600, 922564800, 941310000, 954014400, 972759600, 985464000, 1004209200, 1017518400, 1035658800, 1048968000, 1067108400, 1080417600, 1088276400, 1099177200, 1111878000 } + typeOffsets:intvector { 10751, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "0103040304030403040304030403040304030403040302010201020102030403040304030403040304030403040304020103" } + } //Z#313 + /* Asia/Tehran */ :table { + trans:intvector { -757394744, 247177800, 259272000, 277758000, 283982400, 290809800, 306531000, 322432200, 338499000, 673216200, 685481400, 701209800, 717103800, 732745800, 748639800, 764281800, 780175800, 795817800, 811711800, 827353800, 843247800, 858976200, 874870200, 890512200, 906406200, 922048200, 937942200, 953584200, 969478200, 985206600, 1001100600, 1016742600, 1032636600, 1048278600, 1064172600, 1079814600, 1095708600, 1111437000, 1127331000, 1206045000, 1221939000, 1237667400, 1253561400, 1269203400, 1285097400, 1300739400, 1316633400, 1332275400, 1348169400, 1363897800, 1379791800, 1395433800, 1411327800, 1426969800, 1442863800, 1458505800, 1474399800, 1490128200, 1506022200, 1521664200, 1537558200, 1553200200, 1569094200, 1584736200, 1600630200, 1616358600, 1632252600, 1647894600, 1663788600, 1679430600, 1695324600, 1710966600, 1726860600, 1742589000, 1758483000, 1774125000, 1790019000, 1805661000, 1821555000, 1837197000, 1853091000, 1868733000, 1884627000, 1900355400, 1916249400, 1931891400, 1947785400, 1963427400, 1979321400, 1994963400, 2010857400, 2026585800, 2042479800, 2058121800, 2074015800, 2089657800, 2105551800, 2121193800, 2137087800 } + typeOffsets:intvector { 12344, 0, 12600, 0, 12600, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "010304030102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + links:intvector { 314, 514 } + } //Z#314 + /* Asia/Tel_Aviv */ :int { 273 } //Z#315 + /* Asia/Thimbu */ :int { 317 } //Z#316 + /* Asia/Thimphu */ :table { + trans:intvector { -706341516, 560025000 } + typeOffsets:intvector { 21516, 0, 19800, 0, 21600, 0 } + typeMap:bin { "0102" } + links:intvector { 316, 317 } + } //Z#317 + /* Asia/Tokyo */ :table { + transPre32:intvector { -1, 1707254896 } + trans:intvector { -683794800, -672393600, -654764400, -640944000, -620290800, -609494400, -588841200, -578044800 } + typeOffsets:intvector { 33539, 0, 32400, 0, 32400, 3600 } + typeMap:bin { "010201020102010201" } + links:intvector { 318, 516, 518 } + } //Z#318 + /* Asia/Ujung_Pandang */ :int { 289 } //Z#319 + /* Asia/Ulaanbaatar */ :table { + trans:intvector { -2032931252, 252435600, 417974400, 433782000, 449596800, 465318000, 481046400, 496767600, 512496000, 528217200, 543945600, 559666800, 575395200, 591116400, 606844800, 622566000, 638294400, 654620400, 670348800, 686070000, 701798400, 717519600, 733248000, 748969200, 764697600, 780418800, 796147200, 811868400, 828201600, 843922800, 859651200, 875372400, 891100800, 906822000, 988394400, 1001696400, 1017424800, 1033146000, 1048874400, 1064595600, 1080324000, 1096045200, 1111773600, 1127494800, 1143223200, 1159549200, 1427479200, 1443193200 } + typeOffsets:intvector { 25652, 0, 25200, 0, 28800, 0, 28800, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "Mongol" } + finalRaw:int { 28800 } + finalYear:int { 2016 } + links:intvector { 320, 321 } + } //Z#320 + /* Asia/Ulan_Bator */ :int { 320 } //Z#321 + /* Asia/Urumqi */ :table { + trans:intvector { -1325483420 } + typeOffsets:intvector { 21020, 0, 21600, 0 } + typeMap:bin { "01" } + links:intvector { 277, 322 } + } //Z#322 + /* Asia/Ust-Nera */ :table { + trans:intvector { -1579426374, -1247558400, 354898800, 370699200, 386427600, 402235200, 417963600, 433771200, 449586000, 465318000, 481042800, 496767600, 512492400, 528217200, 543942000, 559666800, 575391600, 591116400, 606841200, 622566000, 638290800, 654620400, 670345200, 686073600, 695750400, 701784000, 717505200, 733244400, 748969200, 764694000, 780418800, 796143600, 811868400, 828198000, 846342000, 859647600, 877791600, 891097200, 909241200, 922546800, 941295600, 953996400, 972745200, 985446000, 1004194800, 1017500400, 1035644400, 1048950000, 1067094000, 1080399600, 1099148400, 1111849200, 1130598000, 1143298800, 1162047600, 1174748400, 1193497200, 1206802800, 1224946800, 1238252400, 1256396400, 1269702000, 1288450800, 1301151600, 1315828800, 1414249200 } + typeOffsets:intvector { 34374, 0, 28800, 0, 32400, 0, 36000, 0, 36000, 3600, 39600, 0, 39600, 3600, 43200, 0 } + typeMap:bin { "010206050605060506050605060506050605060506050403050605060506050605060506050605060506050605060506050605060506050605060506050605070503" } + } //Z#323 + /* Asia/Vientiane */ :int { 247 } //Z#324 + /* Asia/Vladivostok */ :table { + trans:intvector { -1487321251, -1247562000, 354895200, 370702800, 386431200, 402238800, 417967200, 433774800, 449589600, 465321600, 481046400, 496771200, 512496000, 528220800, 543945600, 559670400, 575395200, 591120000, 606844800, 622569600, 638294400, 654624000, 670348800, 686077200, 695754000, 701787600, 717508800, 733248000, 748972800, 764697600, 780422400, 796147200, 811872000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 972748800, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143302400, 1162051200, 1174752000, 1193500800, 1206806400, 1224950400, 1238256000, 1256400000, 1269705600, 1288454400, 1301155200, 1414249200 } + typeOffsets:intvector { 31651, 0, 32400, 0, 32400, 3600, 36000, 0, 36000, 3600, 39600, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#325 + /* Asia/Yakutsk */ :table { + trans:intvector { -1579423138, -1247558400, 354898800, 370706400, 386434800, 402242400, 417970800, 433778400, 449593200, 465325200, 481050000, 496774800, 512499600, 528224400, 543949200, 559674000, 575398800, 591123600, 606848400, 622573200, 638298000, 654627600, 670352400, 686080800, 695757600, 701791200, 717512400, 733251600, 748976400, 764701200, 780426000, 796150800, 811875600, 828205200, 846349200, 859654800, 877798800, 891104400, 909248400, 922554000, 941302800, 954003600, 972752400, 985453200, 1004202000, 1017507600, 1035651600, 1048957200, 1067101200, 1080406800, 1099155600, 1111856400, 1130605200, 1143306000, 1162054800, 1174755600, 1193504400, 1206810000, 1224954000, 1238259600, 1256403600, 1269709200, 1288458000, 1301158800, 1414252800 } + typeOffsets:intvector { 31138, 0, 28800, 0, 28800, 3600, 32400, 0, 32400, 3600, 36000, 0 } + typeMap:bin { "0103040304030403040304030403040304030403040302010304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#326 + /* Asia/Yekaterinburg */ :table { + trans:intvector { -1688270553, -1592610305, -1247544000, 354913200, 370720800, 386449200, 402256800, 417985200, 433792800, 449607600, 465339600, 481064400, 496789200, 512514000, 528238800, 543963600, 559688400, 575413200, 591138000, 606862800, 622587600, 638312400, 654642000, 670366800, 686095200, 695772000, 701805600, 717526800, 733266000, 748990800, 764715600, 780440400, 796165200, 811890000, 828219600, 846363600, 859669200, 877813200, 891118800, 909262800, 922568400, 941317200, 954018000, 972766800, 985467600, 1004216400, 1017522000, 1035666000, 1048971600, 1067115600, 1080421200, 1099170000, 1111870800, 1130619600, 1143320400, 1162069200, 1174770000, 1193518800, 1206824400, 1224968400, 1238274000, 1256418000, 1269723600, 1288472400, 1301173200, 1414267200 } + typeOffsets:intvector { 14553, 0, 13505, 0, 14400, 0, 14400, 3600, 18000, 0, 18000, 3600, 21600, 0 } + typeMap:bin { "010204050405040504050405040504050405040504050403020405040504050405040504050405040504050405040504050405040504050405040504050405040604" } + } //Z#327 + /* Asia/Yerevan */ :table { + trans:intvector { -1441162680, -405140400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622591200, 638316000, 654645600, 670370400, 686098800, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288476000, 1301176800, 1319925600 } + typeOffsets:intvector { 10680, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "0103040304030403040304030403040304030403040302010201020102010203040304030403040304030403040304030403040304030403040304030403" } + links:intvector { 328, 528 } + } //Z#328 + /* Atlantic/Azores */ :table { + transPre32:intvector { -1, 1581063056 } + trans:intvector { -1830377128, -1689548400, -1677794400, -1667430000, -1647730800, -1635807600, -1616194800, -1604358000, -1584658800, -1572735600, -1553036400, -1541199600, -1521500400, -1442444400, -1426806000, -1379286000, -1364770800, -1348441200, -1333321200, -1316386800, -1301266800, -1284332400, -1269817200, -1221433200, -1206918000, -1191193200, -1175468400, -1127689200, -1111964400, -1096844400, -1080514800, -1063580400, -1049065200, -1033340400, -1017615600, -1002495600, -986166000, -969231600, -950482800, -942015600, -922662000, -906937200, -891126000, -877302000, -873676800, -864000000, -857948400, -845852400, -842832000, -831340800, -825894000, -814402800, -810777600, -799891200, -794444400, -782953200, -779328000, -768441600, -762994800, -749084400, -733359600, -717624000, -701899200, -686174400, -670449600, -654724800, -639000000, -591825600, -575496000, -559771200, -544046400, -528321600, -512596800, -496872000, -481147200, -465422400, -449697600, -433972800, -417643200, -401918400, -386193600, -370468800, -354744000, -339019200, -323294400, -307569600, -291844800, -276120000, -260395200, -244670400, -228340800, -212616000, -196891200, -181166400, -165441600, -149716800, -133992000, -118267200, 228272400, 243997200, 260326800, 276051600, 291776400, 307504800, 323226000, 338954400, 354679200, 370404000, 386128800, 401853600, 417582000, 433303200, 449028000, 465357600, 481082400, 496807200, 512532000, 528256800, 543981600, 559706400, 575431200, 591156000, 606880800, 622605600, 638330400, 654660000, 670384800, 686109600, 701834400, 717559200, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -6160, 0, -7200, 0, -7200, 3600, -7200, 7200, -6872, 0, -3600, 0, -3600, 3600, 0, 0 } + typeMap:bin { "04010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020102030201020302010203020102010201020102010201020102010201020102010201020102010201020102010201020102010506050605060506050605060506050605060506050605060506050605060506070605060506050605" } + finalRule { "EU" } + finalRaw:int { -3600 } + finalYear:int { 1997 } + } //Z#329 + /* Atlantic/Bermuda */ :table { + trans:intvector { -1262281242, 136360800, 152082000, 167810400, 183531600, 199260000, 215586000, 230709600, 247035600, 262764000, 278485200, 294213600, 309934800, 325663200, 341384400, 357112800, 372834000, 388562400, 404888400, 420012000, 436338000, 452066400, 467787600, 483516000, 499237200, 514965600, 530686800, 544600800, 562136400, 576050400, 594190800, 607500000, 625640400, 638949600, 657090000, 671004000, 688539600, 702453600, 719989200, 733903200, 752043600, 765352800, 783493200, 796802400, 814942800, 828856800, 846392400, 860306400, 877842000, 891756000, 909291600, 923205600, 941346000, 954655200, 972795600, 986104800, 1004245200, 1018159200, 1035694800, 1049608800, 1067144400, 1081058400, 1099198800, 1112508000, 1130648400, 1143957600, 1162098000, 1173592800, 1194152400 } + typeOffsets:intvector { -15558, 0, -14400, 0, -14400, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "US" } + finalRaw:int { -14400 } + finalYear:int { 2008 } + } //Z#330 + /* Atlantic/Canary */ :table { + trans:intvector { -1509663504, -733874400, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -3696, 0, -3600, 0, 0, 0, 0, 3600 } + typeMap:bin { "010203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + } //Z#331 + /* Atlantic/Cape_Verde */ :table { + trans:intvector { -1988144756, -862610400, -764118000, 186120000 } + typeOffsets:intvector { -5644, 0, -7200, 0, -7200, 3600, -3600, 0 } + typeMap:bin { "01020103" } + } //Z#332 + /* Atlantic/Faeroe */ :int { 334 } //Z#333 + /* Atlantic/Faroe */ :table { + trans:intvector { -1955748776, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -1624, 0, 0, 0, 0, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + links:intvector { 333, 334 } + } //Z#334 + /* Atlantic/Jan_Mayen */ :int { 464 } //Z#335 + /* Atlantic/Madeira */ :table { + trans:intvector { -1830379944, -1689552000, -1677798000, -1667433600, -1647734400, -1635811200, -1616198400, -1604361600, -1584662400, -1572739200, -1553040000, -1541203200, -1521504000, -1442448000, -1426809600, -1379289600, -1364774400, -1348444800, -1333324800, -1316390400, -1301270400, -1284336000, -1269820800, -1221436800, -1206921600, -1191196800, -1175472000, -1127692800, -1111968000, -1096848000, -1080518400, -1063584000, -1049068800, -1033344000, -1017619200, -1002499200, -986169600, -969235200, -950486400, -942019200, -922665600, -906940800, -891129600, -877305600, -873680400, -864003600, -857952000, -845856000, -842835600, -831344400, -825897600, -814406400, -810781200, -799894800, -794448000, -782956800, -779331600, -768445200, -762998400, -749088000, -733363200, -717627600, -701902800, -686178000, -670453200, -654728400, -639003600, -591829200, -575499600, -559774800, -544050000, -528325200, -512600400, -496875600, -481150800, -465426000, -449701200, -433976400, -417646800, -401922000, -386197200, -370472400, -354747600, -339022800, -323298000, -307573200, -291848400, -276123600, -260398800, -244674000, -228344400, -212619600, -196894800, -181170000, -165445200, -149720400, -133995600, -118270800, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -4056, 0, -3600, 0, -3600, 3600, -3600, 7200, 0, 0, 0, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020102030201020302010203020102010201020102010201020102010201020102010201020102010201020102010201020102010405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + } //Z#336 + /* Atlantic/Reykjavik */ :table { + trans:intvector { -1956609120, -1668211200, -1647212400, -1636675200, -1613430000, -1605139200, -1581894000, -1539561600, -1531350000, -968025600, -952293600, -942008400, -920239200, -909957600, -888789600, -877903200, -857944800, -846453600, -826495200, -815004000, -795045600, -783554400, -762991200, -752104800, -731541600, -717631200, -700092000, -686181600, -668642400, -654732000, -636588000, -623282400, -605743200, -591832800, -573688800, -559778400, -542239200, -528328800, -510789600, -496879200, -479340000, -465429600, -447890400, -433980000, -415836000, -401925600, -384386400, -370476000, -352936800, -339026400, -321487200, -307576800, -290037600, -276127200, -258588000, -244677600, -226533600, -212623200, -195084000, -181173600, -163634400, -149724000, -132184800, -118274400, -100735200, -86824800, -68680800, -54770400 } + typeOffsets:intvector { -5280, 0, -3600, 0, -3600, 3600, 0, 0 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } + links:intvector { 337, 502 } + } //Z#337 + /* Atlantic/South_Georgia */ :table { + transPre32:intvector { -1, 1770454464 } + typeOffsets:intvector { -8768, 0, -7200, 0 } + typeMap:bin { "01" } + } //Z#338 + /* Atlantic/St_Helena */ :int { 5 } //Z#339 + /* Atlantic/Stanley */ :table { + trans:intvector { -1824235716, -1018209600, -1003093200, -986760000, -971643600, -954705600, -939589200, -923256000, -908139600, -891806400, -876690000, -860356800, -852066000, 420609600, 433306800, 452052000, 464151600, 483501600, 495601200, 514350000, 527054400, 545799600, 558504000, 577249200, 589953600, 608698800, 621403200, 640753200, 652852800, 672202800, 684907200, 703652400, 716356800, 735102000, 747806400, 766551600, 779256000, 798001200, 810705600, 830055600, 842760000, 861505200, 874209600, 892954800, 905659200, 924404400, 937108800, 955854000, 968558400, 987310800, 999410400, 1019365200, 1030860000, 1050814800, 1062914400, 1082264400, 1094364000, 1113714000, 1125813600, 1145163600, 1157263200, 1176613200, 1188712800, 1208667600, 1220767200, 1240117200, 1252216800, 1271566800, 1283666400 } + typeOffsets:intvector { -13884, 0, -14400, 0, -14400, 3600, -10800, 0, -10800, 3600 } + typeMap:bin { "010201020102010201020102010304030403020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020103" } + } //Z#340 + /* Australia/ACT */ :int { 359 } //Z#341 + /* Australia/Adelaide */ :table { + transPre32:intvector { -1, 1930857236, -1, 2064778096 } + trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 384280200, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 637691400, 657045000, 667931400, 688494600, 701195400, 719944200, 731435400, 751998600, 764094600, 783448200, 796149000, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } + typeOffsets:intvector { 33260, 0, 32400, 0, 34200, 0, 34200, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } + finalRule { "AS" } + finalRaw:int { 34200 } + finalYear:int { 2009 } + links:intvector { 342, 358 } + } //Z#342 + /* Australia/Brisbane */ :table { + transPre32:intvector { -1, 1928175368 } + trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200 } + typeOffsets:intvector { 36728, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "0102010201020102010201020102010201" } + links:intvector { 343, 357 } + } //Z#343 + /* Australia/Broken_Hill */ :table { + transPre32:intvector { -1, 1930856548, -1, 1980016096, -1, 2064778096 } + trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400, 57688200, 67969800, 89137800, 100024200, 120587400, 131473800, 152037000, 162923400, 183486600, 194977800, 215541000, 226427400, 246990600, 257877000, 278440200, 289326600, 309889800, 320776200, 341339400, 352225800, 372789000, 386699400, 404843400, 415729800, 436293000, 447179400, 467742600, 478629000, 499192200, 511288200, 530037000, 542737800, 562091400, 574792200, 594145800, 606241800, 625595400, 636481800, 657045000, 667931400, 688494600, 699381000, 719944200, 731435400, 751998600, 762885000, 783448200, 794334600, 814897800, 828203400, 846347400, 859653000, 877797000, 891102600, 909246600, 922552200, 941301000, 954001800, 972750600, 985451400, 1004200200, 1017505800, 1035649800, 1048955400, 1067099400, 1080405000, 1099153800, 1111854600, 1130603400, 1143909000, 1162053000, 1174753800, 1193502600, 1207413000, 1223137800 } + typeOffsets:intvector { 33948, 0, 32400, 0, 34200, 0, 34200, 3600, 36000, 0 } + typeMap:bin { "0401020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } + finalRule { "AS" } + finalRaw:int { 34200 } + finalYear:int { 2009 } + links:intvector { 344, 363 } + } //Z#344 + /* Australia/Canberra */ :int { 359 } //Z#345 + /* Australia/Currie */ :table { + transPre32:intvector { -1, 1949172768 } + trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } + typeOffsets:intvector { 34528, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "AT" } + finalRaw:int { 36000 } + finalYear:int { 2009 } + } //Z#346 + /* Australia/Darwin */ :table { + transPre32:intvector { -1, 1930859096, -1, 2064778096 } + trans:intvector { -1672565340, -1665390600, -883639800, -876126600, -860398200, -844677000, -828343800, -813227400 } + typeOffsets:intvector { 31400, 0, 32400, 0, 34200, 0, 34200, 3600 } + typeMap:bin { "01020302030203020302" } + links:intvector { 0, 347, 355 } + } //Z#347 + /* Australia/Eucla */ :table { + transPre32:intvector { -1, 1957038768 } + trans:intvector { -1672562640, -1665387900, -883637100, -876123900, -860395500, -844674300, 152039700, 162926100, 436295700, 447182100, 690311700, 699383700, 1165079700, 1174756500, 1193505300, 1206810900, 1224954900, 1238260500 } + typeOffsets:intvector { 30928, 0, 31500, 0, 31500, 3600 } + typeMap:bin { "01020102010201020102010201020102010201" } + } //Z#348 + /* Australia/Hobart */ :table { + transPre32:intvector { -1, 1949171940 } + trans:intvector { -1680508800, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, -71136000, -55411200, -37267200, -25776000, -5817600, 5673600, 25632000, 37728000, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386092800, 404841600, 417542400, 436291200, 447177600, 467740800, 478627200, 499190400, 510076800, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 670348800, 686678400, 701798400, 718128000, 733248000, 749577600, 764697600, 781027200, 796147200, 812476800, 828201600, 844531200, 859651200, 875980800, 891100800, 907430400, 922550400, 938880000, 954000000, 967305600, 985449600, 1002384000, 1017504000, 1033833600, 1048953600, 1065283200, 1080403200, 1096732800, 1111852800, 1128182400, 1143907200, 1159632000, 1174752000, 1191686400, 1207411200, 1223136000 } + typeOffsets:intvector { 35356, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "AT" } + finalRaw:int { 36000 } + finalYear:int { 2009 } + links:intvector { 349, 360 } + } //Z#349 + /* Australia/LHI */ :int { 352 } //Z#350 + /* Australia/Lindeman */ :table { + transPre32:intvector { -1, 1928176340 } + trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200 } + typeOffsets:intvector { 35756, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201" } + } //Z#351 + /* Australia/Lord_Howe */ :table { + transPre32:intvector { -1, 1930852316 } + trans:intvector { 352216800, 372785400, 384273000, 404839800, 415722600, 436289400, 447172200, 467739000, 478621800, 499188600, 511282800, 530033400, 542732400, 562087800, 574786800, 594142200, 606236400, 625591800, 636476400, 657041400, 667926000, 688491000, 699375600, 719940600, 731430000, 751995000, 762879600, 783444600, 794329200, 814894200, 828198000, 846343800, 859647600, 877793400, 891097200, 909243000, 922546800, 941297400, 953996400, 967303800, 985446000, 1004196600, 1017500400, 1035646200, 1048950000, 1067095800, 1080399600, 1099150200, 1111849200, 1130599800, 1143903600, 1162049400, 1174748400, 1193499000, 1207407600, 1223134200 } + typeOffsets:intvector { 38180, 0, 36000, 0, 37800, 0, 37800, 1800, 37800, 3600 } + typeMap:bin { "010204020402040204020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } + finalRule { "LH" } + finalRaw:int { 37800 } + finalYear:int { 2009 } + links:intvector { 350, 352 } + } //Z#352 + /* Australia/Melbourne */ :table { + transPre32:intvector { -1, 1930855704 } + trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 384278400, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 561484800, 574790400, 594144000, 606240000, 625593600, 637689600, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 796147200, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } + typeOffsets:intvector { 34792, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "AV" } + finalRaw:int { 36000 } + finalYear:int { 2009 } + links:intvector { 353, 361 } + } //Z#353 + /* Australia/NSW */ :int { 359 } //Z#354 + /* Australia/North */ :int { 347 } //Z#355 + /* Australia/Perth */ :table { + transPre32:intvector { -1, 1957041892 } + trans:intvector { -1672559940, -1665385200, -883634400, -876121200, -860392800, -844671600, 152042400, 162928800, 436298400, 447184800, 690314400, 699386400, 1165082400, 1174759200, 1193508000, 1206813600, 1224957600, 1238263200 } + typeOffsets:intvector { 27804, 0, 28800, 0, 28800, 3600 } + typeMap:bin { "01020102010201020102010201020102010201" } + links:intvector { 356, 362 } + } //Z#356 + /* Australia/Queensland */ :int { 343 } //Z#357 + /* Australia/South */ :int { 342 } //Z#358 + /* Australia/Sydney */ :table { + transPre32:intvector { -1, 1930854204 } + trans:intvector { -1672567140, -1665392400, -883641600, -876128400, -860400000, -844678800, -828345600, -813229200, 57686400, 67968000, 89136000, 100022400, 120585600, 131472000, 152035200, 162921600, 183484800, 194976000, 215539200, 226425600, 246988800, 257875200, 278438400, 289324800, 309888000, 320774400, 341337600, 352224000, 372787200, 386697600, 404841600, 415728000, 436291200, 447177600, 467740800, 478627200, 499190400, 511286400, 530035200, 542736000, 562089600, 574790400, 594144000, 606240000, 625593600, 636480000, 657043200, 667929600, 688492800, 699379200, 719942400, 731433600, 751996800, 762883200, 783446400, 794332800, 814896000, 828201600, 846345600, 859651200, 877795200, 891100800, 909244800, 922550400, 941299200, 954000000, 967305600, 985449600, 1004198400, 1017504000, 1035648000, 1048953600, 1067097600, 1080403200, 1099152000, 1111852800, 1130601600, 1143907200, 1162051200, 1174752000, 1193500800, 1207411200, 1223136000 } + typeOffsets:intvector { 36292, 0, 36000, 0, 36000, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102" } + finalRule { "AN" } + finalRaw:int { 36000 } + finalYear:int { 2009 } + links:intvector { 1, 341, 345, 354, 359 } + } //Z#359 + /* Australia/Tasmania */ :int { 349 } //Z#360 + /* Australia/Victoria */ :int { 353 } //Z#361 + /* Australia/West */ :int { 356 } //Z#362 + /* Australia/Yancowinna */ :int { 344 } //Z#363 + /* BET */ :int { 200 } //Z#364 + /* BST */ :int { 259 } //Z#365 + /* Brazil/Acre */ :int { 194 } //Z#366 + /* Brazil/DeNoronha */ :int { 175 } //Z#367 + /* Brazil/East */ :int { 200 } //Z#368 + /* Brazil/West */ :int { 155 } //Z#369 + /* CAT */ :int { 43 } //Z#370 + /* CET */ :table { + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3600, 0, 3600, 3600 } + typeMap:bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "C-Eur" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#371 + /* CNT */ :int { 205 } //Z#372 + /* CST */ :int { 98 } //Z#373 + /* CST6CDT */ :table { + trans:intvector { -1633276800, -1615136400, -1601827200, -1583686800, -880214400, -765392400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 152089200, 162374400, 183538800, 199267200, 215593200, 230716800, 247042800, 262771200, 278492400, 294220800, 309942000, 325670400, 341391600, 357120000, 372841200, 388569600, 404895600, 420019200, 436345200, 452073600, 467794800, 483523200, 499244400, 514972800, 530694000, 544608000, 562143600, 576057600, 594198000, 607507200, 625647600, 638956800, 657097200, 671011200, 688546800, 702460800, 719996400, 733910400, 752050800, 765360000, 783500400, 796809600, 814950000, 828864000, 846399600, 860313600, 877849200, 891763200, 909298800, 923212800, 941353200, 954662400, 972802800, 986112000, 1004252400, 1018166400, 1035702000, 1049616000, 1067151600, 1081065600, 1099206000, 1112515200, 1130655600, 1143964800, 1162105200, 1173600000, 1194159600 } + typeOffsets:intvector { -21600, 0, -21600, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "US" } + finalRaw:int { -21600 } + finalYear:int { 2008 } + } //Z#374 + /* CTT */ :int { 308 } //Z#375 + /* Canada/Atlantic */ :int { 127 } //Z#376 + /* Canada/Central */ :int { 220 } //Z#377 + /* Canada/East-Saskatchewan */ :int { 192 } //Z#378 + /* Canada/Eastern */ :int { 215 } //Z#379 + /* Canada/Mountain */ :int { 112 } //Z#380 + /* Canada/Newfoundland */ :int { 205 } //Z#381 + /* Canada/Pacific */ :int { 217 } //Z#382 + /* Canada/Saskatchewan */ :int { 192 } //Z#383 + /* Canada/Yukon */ :int { 219 } //Z#384 + /* Chile/Continental */ :int { 198 } //Z#385 + /* Chile/EasterIsland */ :int { 544 } //Z#386 + /* Cuba */ :int { 128 } //Z#387 + /* EAT */ :int { 48 } //Z#388 + /* ECT */ :int { 465 } //Z#389 + /* EET */ :table { + trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 7200, 0, 7200, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + } //Z#390 + /* EST */ :table { + typeOffsets:intvector { -18000, 0 } + } //Z#391 + /* EST5EDT */ :table { + trans:intvector { -1633280400, -1615140000, -1601830800, -1583690400, -880218000, -765396000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 152085600, 162370800, 183535200, 199263600, 215589600, 230713200, 247039200, 262767600, 278488800, 294217200, 309938400, 325666800, 341388000, 357116400, 372837600, 388566000, 404892000, 420015600, 436341600, 452070000, 467791200, 483519600, 499240800, 514969200, 530690400, 544604400, 562140000, 576054000, 594194400, 607503600, 625644000, 638953200, 657093600, 671007600, 688543200, 702457200, 719992800, 733906800, 752047200, 765356400, 783496800, 796806000, 814946400, 828860400, 846396000, 860310000, 877845600, 891759600, 909295200, 923209200, 941349600, 954658800, 972799200, 986108400, 1004248800, 1018162800, 1035698400, 1049612400, 1067148000, 1081062000, 1099202400, 1112511600, 1130652000, 1143961200, 1162101600, 1173596400, 1194156000 } + typeOffsets:intvector { -18000, 0, -18000, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "US" } + finalRaw:int { -18000 } + finalYear:int { 2008 } + } //Z#392 + /* Egypt */ :int { 18 } //Z#393 + /* Eire */ :int { 444 } //Z#394 + /* Etc/GMT */ :table { + typeOffsets:intvector { 0, 0 } + links:intvector { 395, 396, 409, 424, 425, 493, 494, 495, 496, 497 } + } //Z#395 + /* Etc/GMT+0 */ :int { 395 } //Z#396 + /* Etc/GMT+1 */ :table { + typeOffsets:intvector { -3600, 0 } + } //Z#397 + /* Etc/GMT+10 */ :table { + typeOffsets:intvector { -36000, 0 } + } //Z#398 + /* Etc/GMT+11 */ :table { + typeOffsets:intvector { -39600, 0 } + } //Z#399 + /* Etc/GMT+12 */ :table { + typeOffsets:intvector { -43200, 0 } + } //Z#400 + /* Etc/GMT+2 */ :table { + typeOffsets:intvector { -7200, 0 } + } //Z#401 + /* Etc/GMT+3 */ :table { + typeOffsets:intvector { -10800, 0 } + } //Z#402 + /* Etc/GMT+4 */ :table { + typeOffsets:intvector { -14400, 0 } + } //Z#403 + /* Etc/GMT+5 */ :table { + typeOffsets:intvector { -18000, 0 } + } //Z#404 + /* Etc/GMT+6 */ :table { + typeOffsets:intvector { -21600, 0 } + } //Z#405 + /* Etc/GMT+7 */ :table { + typeOffsets:intvector { -25200, 0 } + } //Z#406 + /* Etc/GMT+8 */ :table { + typeOffsets:intvector { -28800, 0 } + } //Z#407 + /* Etc/GMT+9 */ :table { + typeOffsets:intvector { -32400, 0 } + } //Z#408 + /* Etc/GMT-0 */ :int { 395 } //Z#409 + /* Etc/GMT-1 */ :table { + typeOffsets:intvector { 3600, 0 } + } //Z#410 + /* Etc/GMT-10 */ :table { + typeOffsets:intvector { 36000, 0 } + } //Z#411 + /* Etc/GMT-11 */ :table { + typeOffsets:intvector { 39600, 0 } + } //Z#412 + /* Etc/GMT-12 */ :table { + typeOffsets:intvector { 43200, 0 } + } //Z#413 + /* Etc/GMT-13 */ :table { + typeOffsets:intvector { 46800, 0 } + } //Z#414 + /* Etc/GMT-14 */ :table { + typeOffsets:intvector { 50400, 0 } + } //Z#415 + /* Etc/GMT-2 */ :table { + typeOffsets:intvector { 7200, 0 } + } //Z#416 + /* Etc/GMT-3 */ :table { + typeOffsets:intvector { 10800, 0 } + } //Z#417 + /* Etc/GMT-4 */ :table { + typeOffsets:intvector { 14400, 0 } + } //Z#418 + /* Etc/GMT-5 */ :table { + typeOffsets:intvector { 18000, 0 } + } //Z#419 + /* Etc/GMT-6 */ :table { + typeOffsets:intvector { 21600, 0 } + } //Z#420 + /* Etc/GMT-7 */ :table { + typeOffsets:intvector { 25200, 0 } + } //Z#421 + /* Etc/GMT-8 */ :table { + typeOffsets:intvector { 28800, 0 } + } //Z#422 + /* Etc/GMT-9 */ :table { + typeOffsets:intvector { 32400, 0 } + } //Z#423 + /* Etc/GMT0 */ :int { 395 } //Z#424 + /* Etc/Greenwich */ :int { 395 } //Z#425 + /* Etc/UCT */ :table { + typeOffsets:intvector { 0, 0 } + links:intvector { 426, 602 } + } //Z#426 + /* Etc/UTC */ :table { + typeOffsets:intvector { 0, 0 } + links:intvector { 427, 428, 430, 616, 617, 621 } + } //Z#427 + /* Etc/Universal */ :int { 427 } //Z#428 + /* Etc/Unknown */ :table { + typeOffsets:intvector { 0, 0 } + } //Z#429 + /* Etc/Zulu */ :int { 427 } //Z#430 + /* Europe/Amsterdam */ :table { + trans:intvector { -1693700372, -1680484772, -1663453172, -1650147572, -1633213172, -1617488372, -1601158772, -1586038772, -1569709172, -1554589172, -1538259572, -1523139572, -1507501172, -1490566772, -1470176372, -1459117172, -1443997172, -1427667572, -1406672372, -1396217972, -1376950772, -1364768372, -1345414772, -1333318772, -1313792372, -1301264372, -1282256372, -1269814772, -1250720372, -1238365172, -1219184372, -1206915572, -1186957172, -1175465972, -1156025972, -1143411572, -1124489972, -1111961972, -1092953972, -1080512372, -1061331572, -1049062772, -1029190772, -1025745572, -1017613200, -998259600, -986163600, -966723600, -954109200, -935022000, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 1172, 0, 1172, 3600, 1200, 0, 1200, 3600, 3600, 0, 3600, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001030203020302050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#431 + /* Europe/Andorra */ :table { + transPre32:intvector { -1, 2117514132 } + trans:intvector { -733881600, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 364, 0, 0, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#432 + /* Europe/Athens */ :table { + trans:intvector { -1686101632, -1182996000, -1178161200, -906861600, -904878000, -857257200, -844477200, -828237600, -812422800, -552362400, -541652400, 166485600, 186184800, 198028800, 213753600, 228873600, 244080000, 260323200, 275446800, 291798000, 307407600, 323388000, 338936400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 5692, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + typeMap:bin { "03040304020102010304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + } //Z#433 + /* Europe/Belfast */ :int { 455 } //Z#434 + /* Europe/Belgrade */ :table { + transPre32:intvector { -1, 1581051976 } + trans:intvector { -905824800, -857257200, -844556400, -828226800, -812502000, -796777200, -777942000, -766623600, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 435, 454, 466, 472, 474, 487 } + } //Z#435 + /* Europe/Berlin */ :table { + transPre32:intvector { -1, 1872912888 } + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -776563200, -765936000, -761180400, -748479600, -733273200, -717631200, -714610800, -710380800, -701910000, -684975600, -670460400, -654130800, -639010800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3208, 0, 3600, 0, 3600, 3600, 3600, 7200 } + typeMap:bin { "01020102010201020102010201020302010201020302010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#436 + /* Europe/Bratislava */ :int { 467 } //Z#437 + /* Europe/Brussels */ :table { + transPre32:intvector { -1, 1844014246 } + trans:intvector { -1740355200, -1693702800, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1613826000, -1604278800, -1585530000, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1473642000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -934668000, -857257200, -844556400, -828226800, -812502000, -798073200, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 1050, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + typeMap:bin { "010304030403040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#438 + /* Europe/Bucharest */ :table { + trans:intvector { -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, 296604000, 307486800, 323816400, 338940000, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686095200, 701820000, 717544800, 733269600, 748994400, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } + typeOffsets:intvector { 6264, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1998 } + } //Z#439 + /* Europe/Budapest */ :table { + transPre32:intvector { -1, 1794028316 } + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1633212000, -1618700400, -1600466400, -1581202800, -906771600, -857257200, -844556400, -828226800, -812502000, -796777200, -778471200, -762660000, -749689200, -733359600, -717634800, -701910000, -686185200, -670460400, -654130800, -639010800, -621990000, -605660400, -492656400, -481168800, -461120400, -449632800, -428547600, -418269600, -397094400, -386809200, 323827200, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 4580, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#440 + /* Europe/Busingen */ :int { 489 } //Z#441 + /* Europe/Chisinau */ :table { + transPre32:intvector { -1, 1454819576 } + trans:intvector { -1637114100, -1213148664, -1187056800, -1175479200, -1159754400, -1144029600, -1127700000, -1111975200, -1096250400, -1080525600, -1064800800, -1049076000, -1033351200, -1017626400, -1001901600, -986176800, -970452000, -954727200, -927165600, -898138800, -857257200, -844556400, -828226800, -812502000, -800157600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 641941200, 670377600, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859680000, 877824000 } + typeOffsets:intvector { 6920, 0, 3600, 0, 3600, 3600, 6264, 0, 6900, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "0403050605060506050605060506050605060506020102010207080708070807080708070807080708070807050605060506050605060506050605" } + finalRule { "Moldova" } + finalRaw:int { 7200 } + finalYear:int { 1998 } + links:intvector { 442, 479 } + } //Z#442 + /* Europe/Copenhagen */ :table { + transPre32:intvector { -1, 1896673076 } + trans:intvector { -1692496800, -1680490800, -935110800, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -769388400, -747010800, -736383600, -715215600, -706748400, -683161200, -675298800, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3020, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#443 + /* Europe/Dublin */ :table { + transPre32:intvector { -1, 1473317596 } + trans:intvector { -1691962479, -1680471279, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -733359600, -719445600, -699490800, -684972000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } + typeOffsets:intvector { -1500, 0, -1521, 0, -1521, 3600, 0, 0, 0, 3600, 3600, 0 } + typeMap:bin { "0102030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030405030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + links:intvector { 394, 444 } + } //Z#444 + /* Europe/Gibraltar */ :table { + transPre32:intvector { -1, 1473317380 } + trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -1284, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102030203020302030203020102010203020102010201020102010201020102010201020104050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#445 + /* Europe/Guernsey */ :int { 455 } //Z#446 + /* Europe/Helsinki */ :table { + trans:intvector { -1535938789, -875671200, -859773600, 354672000, 370396800, 386121600, 401846400, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 5989, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + links:intvector { 447, 459 } + } //Z#447 + /* Europe/Isle_of_Man */ :int { 455 } //Z#448 + /* Europe/Istanbul */ :table { + transPre32:intvector { -1, 1454819544 } + trans:intvector { -1869875816, -1693706400, -1680490800, -1570413600, -1552186800, -1538359200, -1522551600, -1507514400, -1490583600, -1440208800, -1428030000, -1409709600, -1396494000, -931140000, -922762800, -917834400, -892436400, -875844000, -857358000, -781063200, -764737200, -744343200, -733806000, -716436000, -701924400, -684986400, -670474800, -654141600, -639025200, -621828000, -606970800, -590032800, -575434800, -235620000, -228279600, -177732000, -165726000, 10533600, 23835600, 41983200, 55285200, 74037600, 87339600, 107910000, 121219200, 133920000, 152676000, 165362400, 183502800, 202428000, 215557200, 228866400, 245797200, 260316000, 277246800, 308779200, 323827200, 340228800, 354672000, 371678400, 386121600, 403128000, 428446800, 433886400, 482792400, 496702800, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670374000, 686098800, 701823600, 717548400, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301274000, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396227600, 1414285200, 1427590800, 1445734800 } + typeOffsets:intvector { 6952, 0, 7016, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "01020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203050405040504050405040302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 2016 } + links:intvector { 270, 449, 601 } + } //Z#449 + /* Europe/Jersey */ :int { 455 } //Z#450 + /* Europe/Kaliningrad */ :table { + transPre32:intvector { -1, 1872911176 } + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -788922000, -778730400, -762663600, -757389600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701816400, 717537600, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000, 1414278000 } + typeOffsets:intvector { 4920, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "01020102010201020102010201030403050605060506050605060506050605060506050605040304030403040304030403040304030403040304030403040304030403040304030403040304030503" } + } //Z#451 + /* Europe/Kiev */ :table { + trans:intvector { -1441159324, -1247536800, -892522800, -857257200, -844556400, -828226800, -825382800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 646783200, 686102400, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 7324, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "0305020102010506050605060506050605060506050605060506040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + } //Z#452 + /* Europe/Lisbon */ :table { + trans:intvector { -1830381795, -1689555600, -1677801600, -1667437200, -1647738000, -1635814800, -1616202000, -1604365200, -1584666000, -1572742800, -1553043600, -1541206800, -1521507600, -1442451600, -1426813200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1221440400, -1206925200, -1191200400, -1175475600, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942022800, -922669200, -906944400, -891133200, -877309200, -873684000, -864007200, -857955600, -845859600, -842839200, -831348000, -825901200, -814410000, -810784800, -799898400, -794451600, -782960400, -779335200, -768448800, -763002000, -749091600, -733366800, -717631200, -701906400, -686181600, -670456800, -654732000, -639007200, -591832800, -575503200, -559778400, -544053600, -528328800, -512604000, -496879200, -481154400, -465429600, -449704800, -433980000, -417650400, -401925600, -386200800, -370476000, -354751200, -339026400, -323301600, -307576800, -291852000, -276127200, -260402400, -244677600, -228348000, -212623200, -196898400, -181173600, -165448800, -149724000, -133999200, -118274400, 212544000, 228268800, 243993600, 260323200, 276048000, 291772800, 307501200, 323222400, 338950800, 354675600, 370400400, 386125200, 401850000, 417578400, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -2205, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302010203020102030201020302010201020102010201020102010201020102010201020102010201020102010201020102010201040102010201020102010201020102010201020102010201020102010201020102040504050405040201" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + links:intvector { 453, 583 } + } //Z#453 + /* Europe/Ljubljana */ :int { 435 } //Z#454 + /* Europe/London */ :table { + transPre32:intvector { -1, 442304971 } + trans:intvector { -1691964000, -1680472800, -1664143200, -1650146400, -1633903200, -1617487200, -1601848800, -1586037600, -1570399200, -1552168800, -1538344800, -1522533600, -1507500000, -1490565600, -1473631200, -1460930400, -1442786400, -1428876000, -1410732000, -1396216800, -1379282400, -1364767200, -1348437600, -1333317600, -1315778400, -1301263200, -1284328800, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1189980000, -1175464800, -1159135200, -1143410400, -1126476000, -1111960800, -1095631200, -1080511200, -1063576800, -1049061600, -1032127200, -1017612000, -1001282400, -986162400, -969228000, -950479200, -942012000, -904518000, -896050800, -875487600, -864601200, -844038000, -832546800, -812588400, -798073200, -781052400, -772066800, -764805600, -748476000, -733356000, -719445600, -717030000, -706748400, -699487200, -687996000, -668037600, -654732000, -636588000, -622072800, -605743200, -590623200, -574293600, -558568800, -542239200, -527119200, -512604000, -496274400, -481154400, -464220000, -449704800, -432165600, -417650400, -401320800, -386200800, -369266400, -354751200, -337816800, -323301600, -306972000, -291852000, -276732000, -257983200, -245282400, -226533600, -213228000, -195084000, -182383200, -163634400, -150933600, -132184800, -119484000, -100735200, -88034400, -68680800, -59004000, -37242000, 57722400, 69818400, 89172000, 101268000, 120621600, 132717600, 152071200, 164167200, 183520800, 196221600, 214970400, 227671200, 246420000, 259120800, 278474400, 290570400, 309924000, 322020000, 341373600, 354675600, 372819600, 386125200, 404269200, 417574800, 435718800, 449024400, 467773200, 481078800, 499222800, 512528400, 530672400, 543978000, 562122000, 575427600, 593571600, 606877200, 625626000, 638326800, 657075600, 670381200, 688525200, 701830800, 719974800, 733280400, 751424400, 764730000, 782874000, 796179600, 814323600, 828234000, 846378000 } + typeOffsets:intvector { -75, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0 } + typeMap:bin { "01020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020302030203020302030201020102030201020102010201020102010201020102010201020102010201020102010201020102010201020102010204010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + links:intvector { 434, 446, 448, 450, 455, 491, 492 } + } //Z#455 + /* Europe/Luxembourg */ :table { + trans:intvector { -2069713476, -1692496800, -1680483600, -1662343200, -1650157200, -1632006000, -1618700400, -1612659600, -1604278800, -1585519200, -1574038800, -1552258800, -1539997200, -1520550000, -1507510800, -1490572800, -1473642000, -1459119600, -1444006800, -1427673600, -1411866000, -1396224000, -1379293200, -1364774400, -1348448400, -1333324800, -1316394000, -1301270400, -1284339600, -1269813600, -1253484000, -1238364000, -1221429600, -1206914400, -1191189600, -1175464800, -1160344800, -1143410400, -1127685600, -1111960800, -1096840800, -1080511200, -1063576800, -1049061600, -1033336800, -1017612000, -1002492000, -986162400, -969228000, -950479200, -942012000, -935186400, -857257200, -844556400, -828226800, -812502000, -797986800, -781052400, -766623600, -745455600, -733273200, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 1476, 0, 0, 0, 0, 3600, 3600, 0, 3600, 3600 } + typeMap:bin { "0304030403040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#456 + /* Europe/Madrid */ :table { + transPre32:intvector { -1, 2117515380 } + trans:intvector { -1661734800, -1648429200, -1631926800, -1616893200, -1601254800, -1585357200, -1442451600, -1427677200, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1029114000, -1017622800, -1002848400, -986173200, -969238800, -954118800, -940208400, -873079200, -862538400, -842839200, -828237600, -811389600, -796010400, -779940000, -765421200, -748490400, -733888800, -652327200, -639190800, 135122400, 150246000, 167176800, 181695600, 196812000, 212540400, 228866400, 243990000, 260402400, 276044400, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { -884, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + typeMap:bin { "01020102010201020102010201020102010201020102010203020302030203020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#457 + /* Europe/Malta */ :table { + transPre32:intvector { -1, 1891488612 } + trans:intvector { -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 102380400, 118105200, 135730800, 148518000, 167187600, 180489600, 198637200, 211939200, 230086800, 243388800, 261536400, 274838400, 292986000, 306288000, 323312400, 338342400, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3484, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#458 + /* Europe/Mariehamn */ :int { 447 } //Z#459 + /* Europe/Minsk */ :table { + transPre32:intvector { -1, 1454819880 } + trans:intvector { -1441158600, -1247536800, -899780400, -857257200, -844556400, -828226800, -812502000, -804650400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 670374000, 686102400, 701820000, 717544800, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909273600, 922579200, 941328000, 954028800, 972777600, 985478400, 1004227200, 1017532800, 1035676800, 1048982400, 1067126400, 1080432000, 1099180800, 1111881600, 1130630400, 1143331200, 1162080000, 1174780800, 1193529600, 1206835200, 1224979200, 1238284800, 1256428800, 1269734400, 1288483200, 1301184000 } + typeOffsets:intvector { 6616, 0, 3600, 0, 3600, 3600, 6600, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "0304060201020102060706070607060706070607060706070607060504050405040504050405040504050405040504050405040504050405040504050405040504050406" } + } //Z#460 + /* Europe/Monaco */ :table { + transPre32:intvector { -1, 1808287124 } + trans:intvector { -1855958961, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -904438800, -891136800, -877827600, -857257200, -844556400, -828226800, -812502000, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 1772, 0, 0, 0, 0, 3600, 0, 7200, 561, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "04010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010203020302030203020305060506050605060506050605060506050605060506050605060506050605060506050605060506050605" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#461 + /* Europe/Moscow */ :table { + trans:intvector { -1688265017, -1656819079, -1641353479, -1627965079, -1618716679, -1596429079, -1593829879, -1589860800, -1542427200, -1539493200, -1525323600, -1522728000, -1491188400, -1247536800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 695779200, 701812800, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } + typeOffsets:intvector { 9017, 0, 7200, 0, 7200, 3600, 9079, 0, 9079, 3600, 9079, 7200, 10800, 0, 10800, 3600, 10800, 7200, 14400, 0 } + typeMap:bin { "0304030504050706070807060106070607060706070607060706070607060706070602010607060706070607060706070607060706070607060706070607060706070607060706070607060906" } + links:intvector { 462, 619 } + } //Z#462 + /* Europe/Nicosia */ :int { 292 } //Z#463 + /* Europe/Oslo */ :table { + transPre32:intvector { -1, 1928209516 } + trans:intvector { -1691884800, -1680573600, -927511200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -765327600, -340844400, -324514800, -308790000, -293065200, -277340400, -261615600, -245890800, -230166000, -214441200, -198716400, -182991600, -166662000, -147913200, -135212400, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 2580, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 235, 335, 464 } + } //Z#464 + /* Europe/Paris */ :table { + trans:intvector { -1855958901, -1689814800, -1680397200, -1665363600, -1648342800, -1635123600, -1616893200, -1604278800, -1585443600, -1574038800, -1552266000, -1539997200, -1520557200, -1507510800, -1490576400, -1470618000, -1459126800, -1444006800, -1427677200, -1411952400, -1396227600, -1379293200, -1364778000, -1348448400, -1333328400, -1316394000, -1301274000, -1284339600, -1269824400, -1253494800, -1238374800, -1221440400, -1206925200, -1191200400, -1175475600, -1160355600, -1143421200, -1127696400, -1111971600, -1096851600, -1080522000, -1063587600, -1049072400, -1033347600, -1017622800, -1002502800, -986173200, -969238800, -950490000, -942012000, -932436000, -857257200, -844556400, -828226800, -812502000, -800071200, -796266000, -781052400, -766623600, 196819200, 212540400, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 561, 0, 0, 0, 0, 3600, 0, 7200, 3600, 0, 3600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102050405040503020304050405040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 389, 465 } + } //Z#465 + /* Europe/Podgorica */ :int { 435 } //Z#466 + /* Europe/Prague */ :table { + transPre32:intvector { -1, 1825565432 } + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -798073200, -780534000, -761180400, -746578800, -733359600, -716425200, -701910000, -684975600, -670460400, -654217200, -639010800, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3464, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 437, 467 } + } //Z#467 + /* Europe/Riga */ :table { + trans:intvector { -1632008194, -1618702594, -1601681794, -1597275394, -1377308194, -928029600, -899521200, -857257200, -844556400, -828226800, -812502000, -796777200, -795834000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 843955200, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 985482000, 1004230800 } + typeOffsets:intvector { 5794, 0, 3600, 0, 3600, 3600, 5794, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "0300030004060201020102010607060706070607060706070607060706050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 2002 } + } //Z#468 + /* Europe/Rome */ :table { + transPre32:intvector { -1, 1891402700 } + trans:intvector { -1690851600, -1680483600, -1664758800, -1649034000, -1635123600, -1616979600, -1604278800, -1585530000, -1571014800, -1555290000, -932432400, -857257200, -844556400, -828226800, -812502000, -798080400, -781052400, -766717200, -750898800, -733359600, -719456400, -701917200, -689209200, -670460400, -114051600, -103168800, -81997200, -71719200, -50547600, -40269600, -18493200, -8215200, 12956400, 23234400, 43801200, 54687600, 75855600, 86738400, 107910000, 118188000, 138754800, 149637600, 170809200, 181090800, 202258800, 212540400, 233103600, 243990000, 265158000, 276044400, 296607600, 307494000, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 2996, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 469, 471, 482 } + } //Z#469 + /* Europe/Samara */ :table { + trans:intvector { -1593825620, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 686102400, 687916800, 701809200, 717530400, 733269600, 748994400, 764719200, 780444000, 796168800, 811893600, 828223200, 846367200, 859672800, 877816800, 891122400, 909266400, 922572000, 941320800, 954021600, 972770400, 985471200, 1004220000, 1017525600, 1035669600, 1048975200, 1067119200, 1080424800, 1099173600, 1111874400, 1130623200, 1143324000, 1162072800, 1174773600, 1193522400, 1206828000, 1224972000, 1238277600, 1256421600, 1269727200, 1288479600, 1301180400 } + typeOffsets:intvector { 12020, 0, 7200, 3600, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "02040504050405040504050405040504050403020302010204050405040504050405040504050405040504050405040504050405040504050405040504030204" } + } //Z#470 + /* Europe/San_Marino */ :int { 469 } //Z#471 + /* Europe/Sarajevo */ :int { 435 } //Z#472 + /* Europe/Simferopol */ :table { + transPre32:intvector { -1, 1454818312 } + trans:intvector { -1441160160, -1247536800, -888894000, -857257200, -844556400, -828226800, -812502000, -811648800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 701820000, 717541200, 733269600, 748990800, 764719200, 767739600, 780436800, 796165200, 811886400, 828219600, 846374400, 859683600, 877827600, 891133200, 909277200, 922582800, 941331600, 954032400, 972781200, 985482000, 1004230800, 1017536400, 1035680400, 1048986000, 1067130000, 1080435600, 1099184400, 1111885200, 1130634000, 1143334800, 1162083600, 1174784400, 1193533200, 1206838800, 1224982800, 1238288400, 1256432400, 1269738000, 1288486800, 1301187600, 1319936400, 1332637200, 1351386000, 1364691600, 1382835600, 1396137600, 1414274400 } + typeOffsets:intvector { 8184, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8160, 0, 10800, 0, 10800, 3600, 14400, 0 } + typeMap:bin { "050306020102010206070607060706070607060706070607060706030403040304070607060706040304030403040304030403040304030403040304030403040304030403040304030806" } + } //Z#473 + /* Europe/Skopje */ :int { 435 } //Z#474 + /* Europe/Sofia */ :table { + transPre32:intvector { -1, 1454820900, -1, 1925440280 } + trans:intvector { -857257200, -844556400, -828226800, -812502000, -796777200, -781048800, 291762000, 307576800, 323816400, 339026400, 355266000, 370393200, 386715600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575424000, 591148800, 606873600, 622598400, 638323200, 654652800, 670370400, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796168800, 811890000, 828223200, 846363600, 859683600, 877827600 } + typeOffsets:intvector { 5596, 0, 3600, 0, 3600, 3600, 7016, 0, 7200, 0, 7200, 3600 } + typeMap:bin { "03040102010201040504050405040504050405040504050405040504050405040504050405040504050405040504" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1998 } + } //Z#475 + /* Europe/Stockholm */ :table { + transPre32:intvector { -1, 1423286164, -1, 2085974882 } + trans:intvector { -1692496800, -1680483600, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 4332, 0, 3600, 0, 3600, 3600, 3614, 0 } + typeMap:bin { "0301020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#476 + /* Europe/Tallinn */ :table { + trans:intvector { -1638322740, -1632006000, -1618700400, -1593824400, -1535938740, -927943200, -892954800, -857257200, -844556400, -828226800, -812502000, -797652000, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622598400, 638323200, 654652800, 670377600, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891129600, 909277200, 922582800, 941331600, 1017536400, 1035680400 } + typeOffsets:intvector { 5940, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "01020100030502010201020506050605060506050605060506050605040304030403040304030403040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 2003 } + } //Z#477 + /* Europe/Tirane */ :table { + trans:intvector { -1767230360, -932346000, -857257200, -844556400, -843519600, 136854000, 149896800, 168130800, 181432800, 199839600, 213141600, 231894000, 244591200, 263257200, 276040800, 294706800, 307490400, 326156400, 339458400, 357087600, 370389600, 389142000, 402444000, 419468400, 433807200, 449622000, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 4760, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#478 + /* Europe/Tiraspol */ :int { 442 } //Z#479 + /* Europe/Uzhgorod */ :table { + transPre32:intvector { -1, 1794027544 } + trans:intvector { -938905200, -857257200, -844556400, -828226800, -812502000, -794714400, -773456400, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 646786800, 670384800, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 5352, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "0102010201020105060506050605060506050605060506050605010304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + } //Z#480 + /* Europe/Vaduz */ :int { 489 } //Z#481 + /* Europe/Vatican */ :int { 469 } //Z#482 + /* Europe/Vienna */ :table { + transPre32:intvector { -1, 1872912175 } + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1569711600, -1555801200, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -780188400, -748479600, -733359600, -717634800, -701910000, -684975600, -670460400, 323823600, 338940000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3921, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#483 + /* Europe/Vilnius */ :table { + transPre32:intvector { -1, 1454820420 } + trans:intvector { -1672536240, -1585100136, -1561251600, -1553565600, -928198800, -900126000, -857257200, -844556400, -828226800, -812502000, -802144800, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686102400, 701827200, 717552000, 733276800, 749001600, 764726400, 780451200, 796176000, 811900800, 828230400, 846374400, 859680000, 877824000, 891133200, 909277200, 922582800, 941331600, 1048986000, 1067130000 } + typeOffsets:intvector { 6076, 0, 3600, 0, 3600, 3600, 5040, 0, 5736, 0, 7200, 0, 7200, 3600, 10800, 0, 10800, 3600 } + typeMap:bin { "03040105010702010201020708070807080708070807080708070807080708070605060506050605060506050605020102050605" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 2004 } + } //Z#484 + /* Europe/Volgograd */ :table { + trans:intvector { -1577761060, -1247540400, 354916800, 370724400, 386452800, 402260400, 417988800, 433796400, 449611200, 465343200, 481068000, 496792800, 512517600, 528242400, 543967200, 559692000, 575416800, 591141600, 606866400, 622594800, 638319600, 654649200, 670374000, 701820000, 717534000, 733273200, 748998000, 764722800, 780447600, 796172400, 811897200, 828226800, 846370800, 859676400, 877820400, 891126000, 909270000, 922575600, 941324400, 954025200, 972774000, 985474800, 1004223600, 1017529200, 1035673200, 1048978800, 1067122800, 1080428400, 1099177200, 1111878000, 1130626800, 1143327600, 1162076400, 1174777200, 1193526000, 1206831600, 1224975600, 1238281200, 1256425200, 1269730800, 1288479600, 1301180400, 1414274400 } + typeOffsets:intvector { 10660, 0, 10800, 0, 10800, 3600, 14400, 0, 14400, 3600 } + typeMap:bin { "010304030403040304030403040304030403020102010302010201020102010201020102010201020102010201020102010201020102010201020102010301" } + } //Z#485 + /* Europe/Warsaw */ :table { + trans:intvector { -1717032240, -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -1600473600, -1587168000, -1501725600, -931734000, -857257200, -844556400, -828226800, -812502000, -796608000, -778726800, -762660000, -748486800, -733273200, -715215600, -701910000, -684975600, -670460400, -654130800, -639010800, -397094400, -386812800, -371088000, -355363200, -334195200, -323308800, -307584000, -291859200, -271296000, -260409600, -239846400, -228960000, -208396800, -197510400, -176342400, -166060800, 228873600, 243993600, 260323200, 276048000, 291772800, 307497600, 323827200, 338947200, 354672000, 370396800, 386121600, 401846400, 417571200, 433296000, 449020800, 465350400, 481075200, 496800000, 512524800, 528249600, 543974400, 559699200, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 5040, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600 } + typeMap:bin { "01020102010203040301020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201020102010201" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 486, 582 } + } //Z#486 + /* Europe/Zagreb */ :int { 435 } //Z#487 + /* Europe/Zaporozhye */ :table { + transPre32:intvector { -1, 1454818056 } + trans:intvector { -1441160400, -1247536800, -894769200, -857257200, -844556400, -828226800, -826419600, 354920400, 370728000, 386456400, 402264000, 417992400, 433800000, 449614800, 465346800, 481071600, 496796400, 512521200, 528246000, 543970800, 559695600, 575420400, 591145200, 606870000, 622594800, 638319600, 654649200, 670374000, 686091600, 701820000, 717541200, 733269600, 748990800, 764719200, 780440400, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 8440, 0, 3600, 0, 3600, 3600, 7200, 0, 7200, 3600, 8400, 0, 10800, 0, 10800, 3600 } + typeMap:bin { "05030602010201060706070607060706070607060706070607060706040304030403040304030403" } + finalRule { "EU" } + finalRaw:int { 7200 } + finalYear:int { 1997 } + } //Z#488 + /* Europe/Zurich */ :table { + transPre32:intvector { -1, 619768448, -1, 1909720710 } + trans:intvector { -904435200, -891129600, -872985600, -859680000, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 2048, 0, 1786, 0, 3600, 0, 3600, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302" } + finalRule { "EU" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + links:intvector { 441, 481, 489 } + } //Z#489 + /* Factory */ :table { + typeOffsets:intvector { 0, 0 } + } //Z#490 + /* GB */ :int { 455 } //Z#491 + /* GB-Eire */ :int { 455 } //Z#492 + /* GMT */ :int { 395 } //Z#493 + /* GMT+0 */ :int { 395 } //Z#494 + /* GMT-0 */ :int { 395 } //Z#495 + /* GMT0 */ :int { 395 } //Z#496 + /* Greenwich */ :int { 395 } //Z#497 + /* HST */ :table { + typeOffsets:intvector { -36000, 0 } + } //Z#498 + /* Hongkong */ :int { 267 } //Z#499 + /* IET */ :int { 130 } //Z#500 + /* IST */ :int { 281 } //Z#501 + /* Iceland */ :int { 337 } //Z#502 + /* Indian/Antananarivo */ :int { 48 } //Z#503 + /* Indian/Chagos */ :table { + trans:intvector { -1988167780, 820436400 } + typeOffsets:intvector { 17380, 0, 18000, 0, 21600, 0 } + typeMap:bin { "0102" } + } //Z#504 + /* Indian/Christmas */ :table { + transPre32:intvector { -1, 1930865124 } + typeOffsets:intvector { 25372, 0, 25200, 0 } + typeMap:bin { "01" } + } //Z#505 + /* Indian/Cocos */ :table { + transPre32:intvector { -1, 2085955236 } + typeOffsets:intvector { 23260, 0, 23400, 0 } + typeMap:bin { "01" } + } //Z#506 + /* Indian/Comoro */ :int { 48 } //Z#507 + /* Indian/Kerguelen */ :table { + trans:intvector { -631152000 } + typeOffsets:intvector { 0, 0, 18000, 0 } + typeMap:bin { "01" } + } //Z#508 + /* Indian/Mahe */ :table { + trans:intvector { -2006653308 } + typeOffsets:intvector { 13308, 0, 14400, 0 } + typeMap:bin { "01" } + } //Z#509 + /* Indian/Maldives */ :table { + trans:intvector { -315636840 } + typeOffsets:intvector { 17640, 0, 18000, 0 } + typeMap:bin { "01" } + } //Z#510 + /* Indian/Mauritius */ :table { + trans:intvector { -1988164200, 403041600, 417034800, 1224972000, 1238274000 } + typeOffsets:intvector { 13800, 0, 14400, 0, 14400, 3600 } + typeMap:bin { "0102010201" } + } //Z#511 + /* Indian/Mayotte */ :int { 48 } //Z#512 + /* Indian/Reunion */ :table { + trans:intvector { -1848886912 } + typeOffsets:intvector { 13312, 0, 14400, 0 } + typeMap:bin { "01" } + } //Z#513 + /* Iran */ :int { 314 } //Z#514 + /* Israel */ :int { 273 } //Z#515 + /* JST */ :int { 318 } //Z#516 + /* Jamaica */ :int { 141 } //Z#517 + /* Japan */ :int { 318 } //Z#518 + /* Kwajalein */ :int { 558 } //Z#519 + /* Libya */ :int { 56 } //Z#520 + /* MET */ :table { + trans:intvector { -1693706400, -1680483600, -1663455600, -1650150000, -1632006000, -1618700400, -938905200, -857257200, -844556400, -828226800, -812502000, -796777200, -781052400, -766623600, 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 3600, 0, 3600, 3600 } + typeMap:bin { "010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "C-Eur" } + finalRaw:int { 3600 } + finalYear:int { 1997 } + } //Z#521 + /* MIT */ :int { 539 } //Z#522 + /* MST */ :table { + typeOffsets:intvector { -25200, 0 } + } //Z#523 + /* MST7MDT */ :table { + trans:intvector { -1633273200, -1615132800, -1601823600, -1583683200, -880210800, -765388800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 152092800, 162378000, 183542400, 199270800, 215596800, 230720400, 247046400, 262774800, 278496000, 294224400, 309945600, 325674000, 341395200, 357123600, 372844800, 388573200, 404899200, 420022800, 436348800, 452077200, 467798400, 483526800, 499248000, 514976400, 530697600, 544611600, 562147200, 576061200, 594201600, 607510800, 625651200, 638960400, 657100800, 671014800, 688550400, 702464400, 720000000, 733914000, 752054400, 765363600, 783504000, 796813200, 814953600, 828867600, 846403200, 860317200, 877852800, 891766800, 909302400, 923216400, 941356800, 954666000, 972806400, 986115600, 1004256000, 1018170000, 1035705600, 1049619600, 1067155200, 1081069200, 1099209600, 1112518800, 1130659200, 1143968400, 1162108800, 1173603600, 1194163200 } + typeOffsets:intvector { -25200, 0, -25200, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "US" } + finalRaw:int { -25200 } + finalYear:int { 2008 } + } //Z#524 + /* Mexico/BajaNorte */ :int { 214 } //Z#525 + /* Mexico/BajaSur */ :int { 159 } //Z#526 + /* Mexico/General */ :int { 164 } //Z#527 + /* NET */ :int { 328 } //Z#528 + /* NST */ :int { 540 } //Z#529 + /* NZ */ :int { 540 } //Z#530 + /* NZ-CHAT */ :int { 542 } //Z#531 + /* Navajo */ :int { 109 } //Z#532 + /* PLT */ :int { 276 } //Z#533 + /* PNT */ :int { 183 } //Z#534 + /* PRC */ :int { 308 } //Z#535 + /* PRT */ :int { 188 } //Z#536 + /* PST */ :int { 150 } //Z#537 + /* PST8PDT */ :table { + trans:intvector { -1633269600, -1615129200, -1601820000, -1583679600, -880207200, -765385200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 152096400, 162381600, 183546000, 199274400, 215600400, 230724000, 247050000, 262778400, 278499600, 294228000, 309949200, 325677600, 341398800, 357127200, 372848400, 388576800, 404902800, 420026400, 436352400, 452080800, 467802000, 483530400, 499251600, 514980000, 530701200, 544615200, 562150800, 576064800, 594205200, 607514400, 625654800, 638964000, 657104400, 671018400, 688554000, 702468000, 720003600, 733917600, 752058000, 765367200, 783507600, 796816800, 814957200, 828871200, 846406800, 860320800, 877856400, 891770400, 909306000, 923220000, 941360400, 954669600, 972810000, 986119200, 1004259600, 1018173600, 1035709200, 1049623200, 1067158800, 1081072800, 1099213200, 1112522400, 1130662800, 1143972000, 1162112400, 1173607200, 1194166800 } + typeOffsets:intvector { -28800, 0, -28800, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "US" } + finalRaw:int { -28800 } + finalYear:int { 2008 } + } //Z#538 + /* Pacific/Apia */ :table { + transPre32:intvector { -1, 1439229312 } + trans:intvector { -1861878784, -631110600, 1285498800, 1301752800, 1316872800, 1325239200, 1333202400, 1348927200 } + typeOffsets:intvector { 45184, 0, -41400, 0, -41216, 0, -39600, 0, -39600, 3600, 46800, 0, 46800, 3600 } + typeMap:bin { "020103040304060506" } + finalRule { "WS" } + finalRaw:int { 46800 } + finalYear:int { 2013 } + links:intvector { 522, 539 } + } //Z#539 + /* Pacific/Auckland */ :table { + transPre32:intvector { -1, 1102531752 } + trans:intvector { -1330335000, -1320057000, -1300699800, -1287396000, -1269250200, -1255946400, -1237800600, -1224496800, -1206351000, -1192442400, -1174901400, -1160992800, -1143451800, -1125914400, -1112607000, -1094464800, -1081157400, -1063015200, -1049707800, -1031565600, -1018258200, -1000116000, -986808600, -968061600, -955359000, -936612000, -923304600, -757425600, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } + typeOffsets:intvector { 41944, 0, 41400, 0, 41400, 1800, 41400, 3600, 43200, 0, 43200, 3600 } + typeMap:bin { "0103010201020102010201020102010201020102010201020102010204050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405040504050405" } + finalRule { "NZ" } + finalRaw:int { 43200 } + finalYear:int { 2009 } + links:intvector { 228, 231, 529, 530, 540 } + } //Z#540 + /* Pacific/Bougainville */ :table { + transPre32:intvector { -1, 1454789160, -1, 1928176784 } + trans:intvector { -868010400, -768906000, 1419696000 } + typeOffsets:intvector { 37336, 0, 32400, 0, 35312, 0, 36000, 0, 39600, 0 } + typeMap:bin { "0203010304" } + } //Z#541 + /* Pacific/Chatham */ :table { + transPre32:intvector { -1, 1102529668 } + trans:intvector { -757426500, 152632800, 162309600, 183477600, 194968800, 215532000, 226418400, 246981600, 257868000, 278431200, 289317600, 309880800, 320767200, 341330400, 352216800, 372780000, 384271200, 404834400, 415720800, 436284000, 447170400, 467733600, 478620000, 499183200, 510069600, 530632800, 541519200, 562082400, 573573600, 594136800, 605023200, 623772000, 637682400, 655221600, 669132000, 686671200, 700581600, 718120800, 732636000, 749570400, 764085600, 781020000, 795535200, 812469600, 826984800, 844524000, 858434400, 875973600, 889884000, 907423200, 921938400, 938872800, 953388000, 970322400, 984837600, 1002376800, 1016287200, 1033826400, 1047736800, 1065276000, 1079791200, 1096725600, 1111240800, 1128175200, 1142690400, 1159624800, 1174140000, 1191074400, 1207404000, 1222524000 } + typeOffsets:intvector { 44028, 0, 44100, 0, 45900, 0, 45900, 3600 } + typeMap:bin { "0102030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203020302030203" } + finalRule { "Chatham" } + finalRaw:int { 45900 } + finalYear:int { 2009 } + links:intvector { 531, 542 } + } //Z#542 + /* Pacific/Chuuk */ :table { + transPre32:intvector { -1, 2117478068 } + typeOffsets:intvector { 36428, 0, 36000, 0 } + typeMap:bin { "01" } + links:intvector { 543, 578, 581 } + } //Z#543 + /* Pacific/Easter */ :table { + trans:intvector { -1178124152, -36619200, -23922000, -3355200, 7527600, 24465600, 37767600, 55915200, 69217200, 87969600, 100666800, 118209600, 132116400, 150868800, 163566000, 182318400, 195620400, 213768000, 227070000, 245217600, 258519600, 277272000, 289969200, 308721600, 321418800, 340171200, 353473200, 371620800, 384922800, 403070400, 416372400, 434520000, 447822000, 466574400, 479271600, 498024000, 510721200, 529473600, 545194800, 560923200, 574225200, 592372800, 605674800, 624427200, 637124400, 653457600, 668574000, 687326400, 700628400, 718776000, 732078000, 750225600, 763527600, 781675200, 794977200, 813729600, 826426800, 845179200, 859690800, 876628800, 889930800, 906868800, 923194800, 939528000, 952830000, 971582400, 984279600, 1003032000, 1015729200, 1034481600, 1047178800, 1065931200, 1079233200, 1097380800, 1110682800, 1128830400, 1142132400, 1160884800, 1173582000, 1192334400, 1206846000, 1223784000, 1237086000, 1255233600, 1270350000, 1286683200, 1304823600, 1313899200, 1335668400, 1346558400, 1367118000, 1378612800, 1398567600, 1410062400, 1430017200 } + typeOffsets:intvector { -26248, 0, -25200, 0, -25200, 3600, -21600, 0, -21600, 3600, -18000, 0 } + typeMap:bin { "0102010201020102010201020102010201020102010201020102010203040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030403040304030405" } + links:intvector { 386, 544 } + } //Z#544 + /* Pacific/Efate */ :table { + trans:intvector { -1829387596, 433256400, 448977600, 467298000, 480427200, 496760400, 511876800, 528210000, 543931200, 559659600, 575380800, 591109200, 606830400, 622558800, 638280000, 654008400, 669729600, 686062800, 696340800, 719931600, 727790400 } + typeOffsets:intvector { 40396, 0, 39600, 0, 39600, 3600 } + typeMap:bin { "010201020102010201020102010201020102010201" } + } //Z#545 + /* Pacific/Enderbury */ :table { + transPre32:intvector { -1, 2117555556 } + trans:intvector { 307627200, 788958000 } + typeOffsets:intvector { -41060, 0, -43200, 0, -39600, 0, 46800, 0 } + typeMap:bin { "010203" } + } //Z#546 + /* Pacific/Fakaofo */ :table { + transPre32:intvector { -1, 2117555592 } + trans:intvector { 1325242800 } + typeOffsets:intvector { -41096, 0, -39600, 0, 46800, 0 } + typeMap:bin { "0102" } + } //Z#547 + /* Pacific/Fiji */ :table { + trans:intvector { -1709985344, 909842400, 920124000, 941896800, 951573600, 1259416800, 1269698400, 1287842400, 1299333600, 1319292000, 1327154400, 1350741600, 1358604000, 1382796000, 1390050000, 1414850400, 1421503200, 1446300000 } + typeOffsets:intvector { 42944, 0, 43200, 0, 43200, 3600 } + typeMap:bin { "010201020102010201020102010201020102" } + finalRule { "Fiji" } + finalRaw:int { 43200 } + finalYear:int { 2016 } + } //Z#548 + /* Pacific/Funafuti */ :table { + transPre32:intvector { -1, 2117471484 } + typeOffsets:intvector { 43012, 0, 43200, 0 } + typeMap:bin { "01" } + } //Z#549 + /* Pacific/Galapagos */ :table { + trans:intvector { -1230746496, 504939600 } + typeOffsets:intvector { -21504, 0, -21600, 0, -18000, 0 } + typeMap:bin { "0201" } + } //Z#550 + /* Pacific/Gambier */ :table { + trans:intvector { -1806678012 } + typeOffsets:intvector { -32388, 0, -32400, 0 } + typeMap:bin { "01" } + } //Z#551 + /* Pacific/Guadalcanal */ :table { + trans:intvector { -1806748788 } + typeOffsets:intvector { 38388, 0, 39600, 0 } + typeMap:bin { "01" } + links:intvector { 552, 586 } + } //Z#552 + /* Pacific/Guam */ :table { + transPre32:intvector { -1, 350340556, -1, 2117479756 } + typeOffsets:intvector { -51660, 0, 34740, 0, 36000, 0 } + typeMap:bin { "0102" } + links:intvector { 553, 573 } + } //Z#553 + /* Pacific/Honolulu */ :table { + transPre32:intvector { -1, 1960865982 } + trans:intvector { -1157283000, -1155436200, -880198200, -765376200, -712150200 } + typeOffsets:intvector { -37886, 0, -37800, 0, -37800, 3600, -36000, 0 } + typeMap:bin { "010201020103" } + links:intvector { 554, 555, 609 } + } //Z#554 + /* Pacific/Johnston */ :int { 554 } //Z#555 + /* Pacific/Kiritimati */ :table { + transPre32:intvector { -1, 2117552256 } + trans:intvector { 307622400, 788954400 } + typeOffsets:intvector { -37760, 0, -38400, 0, -36000, 0, 50400, 0 } + typeMap:bin { "010203" } + } //Z#556 + /* Pacific/Kosrae */ :table { + transPre32:intvector { -1, 2117475380 } + trans:intvector { -7988400, 915105600 } + typeOffsets:intvector { 39116, 0, 39600, 0, 43200, 0 } + typeMap:bin { "010201" } + } //Z#557 + /* Pacific/Kwajalein */ :table { + transPre32:intvector { -1, 2117474336 } + trans:intvector { -7988400, 745848000 } + typeOffsets:intvector { 40160, 0, -43200, 0, 39600, 0, 43200, 0 } + typeMap:bin { "020103" } + links:intvector { 519, 558 } + } //Z#558 + /* Pacific/Majuro */ :table { + transPre32:intvector { -1, 2117473408 } + trans:intvector { -7988400 } + typeOffsets:intvector { 41088, 0, 39600, 0, 43200, 0 } + typeMap:bin { "0102" } + } //Z#559 + /* Pacific/Marquesas */ :table { + trans:intvector { -1806676920 } + typeOffsets:intvector { -33480, 0, -34200, 0 } + typeMap:bin { "01" } + } //Z#560 + /* Pacific/Midway */ :int { 566 } //Z#561 + /* Pacific/Nauru */ :table { + trans:intvector { -1545131260, -877347000, -800960400, 294323400 } + typeOffsets:intvector { 40060, 0, 32400, 0, 41400, 0, 43200, 0 } + typeMap:bin { "02010203" } + } //Z#562 + /* Pacific/Niue */ :table { + transPre32:intvector { -1, 2117555276 } + trans:intvector { -599575200, 276089400 } + typeOffsets:intvector { -40780, 0, -41400, 0, -40800, 0, -39600, 0 } + typeMap:bin { "020103" } + } //Z#563 + /* Pacific/Norfolk */ :table { + transPre32:intvector { -1, 2117474184 } + trans:intvector { -599656320 } + typeOffsets:intvector { 40312, 0, 40320, 0, 41400, 0 } + typeMap:bin { "0102" } + } //Z#564 + /* Pacific/Noumea */ :table { + trans:intvector { -1829387148, 250002000, 257342400, 281451600, 288878400, 849366000, 857228400 } + typeOffsets:intvector { 39948, 0, 39600, 0, 39600, 3600 } + typeMap:bin { "01020102010201" } + } //Z#565 + /* Pacific/Pago_Pago */ :table { + transPre32:intvector { -1, 1439229064 } + trans:intvector { -1861879032 } + typeOffsets:intvector { 45432, 0, -40968, 0, -39600, 0 } + typeMap:bin { "0102" } + links:intvector { 561, 566, 574, 615 } + } //Z#566 + /* Pacific/Palau */ :table { + transPre32:intvector { -1, 2117482220 } + typeOffsets:intvector { 32276, 0, 32400, 0 } + typeMap:bin { "01" } + } //Z#567 + /* Pacific/Pitcairn */ :table { + transPre32:intvector { -1, 2117545716 } + trans:intvector { 893665800 } + typeOffsets:intvector { -31220, 0, -30600, 0, -28800, 0 } + typeMap:bin { "0102" } + } //Z#568 + /* Pacific/Pohnpei */ :table { + transPre32:intvector { -1, 2117476524 } + typeOffsets:intvector { 37972, 0, 39600, 0 } + typeMap:bin { "01" } + links:intvector { 569, 570 } + } //Z#569 + /* Pacific/Ponape */ :int { 569 } //Z#570 + /* Pacific/Port_Moresby */ :table { + transPre32:intvector { -1, 1454791176, -1, 1928176784 } + typeOffsets:intvector { 35320, 0, 35312, 0, 36000, 0 } + typeMap:bin { "0102" } + } //Z#571 + /* Pacific/Rarotonga */ :table { + transPre32:intvector { -1, 2117552840 } + trans:intvector { 279714600, 289387800, 309952800, 320837400, 341402400, 352287000, 372852000, 384341400, 404906400, 415791000, 436356000, 447240600, 467805600, 478690200, 499255200, 510139800, 530704800, 541589400, 562154400, 573643800, 594208800, 605093400, 625658400, 636543000, 657108000, 667992600 } + typeOffsets:intvector { -38344, 0, -37800, 0, -36000, 0, -36000, 1800 } + typeMap:bin { "010302030203020302030203020302030203020302030203020302" } + } //Z#572 + /* Pacific/Saipan */ :int { 553 } //Z#573 + /* Pacific/Samoa */ :int { 566 } //Z#574 + /* Pacific/Tahiti */ :table { + trans:intvector { -1806674504 } + typeOffsets:intvector { -35896, 0, -36000, 0 } + typeMap:bin { "01" } + } //Z#575 + /* Pacific/Tarawa */ :table { + transPre32:intvector { -1, 2117472972 } + typeOffsets:intvector { 41524, 0, 43200, 0 } + typeMap:bin { "01" } + } //Z#576 + /* Pacific/Tongatapu */ :table { + transPre32:intvector { -1, 2117470136 } + trans:intvector { -915193200, 939214800, 953384400, 973342800, 980596800, 1004792400, 1012046400 } + typeOffsets:intvector { 44360, 0, 44400, 0, 46800, 0, 46800, 3600 } + typeMap:bin { "0102030203020302" } + } //Z#577 + /* Pacific/Truk */ :int { 543 } //Z#578 + /* Pacific/Wake */ :table { + transPre32:intvector { -1, 2117474508 } + typeOffsets:intvector { 39988, 0, 43200, 0 } + typeMap:bin { "01" } + } //Z#579 + /* Pacific/Wallis */ :table { + transPre32:intvector { -1, 2117470376 } + typeOffsets:intvector { 44120, 0, 43200, 0 } + typeMap:bin { "01" } + } //Z#580 + /* Pacific/Yap */ :int { 543 } //Z#581 + /* Poland */ :int { 486 } //Z#582 + /* Portugal */ :int { 453 } //Z#583 + /* ROC */ :int { 311 } //Z#584 + /* ROK */ :int { 307 } //Z#585 + /* SST */ :int { 552 } //Z#586 + /* Singapore */ :int { 309 } //Z#587 + /* SystemV/AST4 */ :table { + typeOffsets:intvector { -14400, 0 } + } //Z#588 + /* SystemV/AST4ADT */ :table { + transPre32:intvector { -1, 2096195296, -1, 2111916496, -1, 2127644896, -1, 2143366096 } + trans:intvector { -2135872800, -2120151600, -2104423200, -2088702000, -2072973600, -2056647600, -2040919200, -2025198000, -2009469600, -1993748400, -1978020000, -1962298800, -1946570400, -1930849200, -1915120800, -1898794800, -1883671200, -1867345200, -1851616800, -1835895600, -1820167200, -1804446000, -1788717600, -1772996400, -1757268000, -1741546800, -1725818400, -1709492400, -1693764000, -1678042800, -1662314400, -1646593200, -1630864800, -1615143600, -1599415200, -1583694000, -1567965600, -1551639600, -1536516000, -1520190000, -1504461600, -1488740400, -1473012000, -1457290800, -1441562400, -1425841200, -1410112800, -1394391600, -1378663200, -1362337200, -1347213600, -1330887600, -1315159200, -1299438000, -1283709600, -1267988400, -1252260000, -1236538800, -1220810400, -1205089200, -1189360800, -1173034800, -1157306400, -1141585200, -1125856800, -1110135600, -1094407200, -1078686000, -1062957600, -1047236400, -1031508000, -1015182000, -1000058400, -983732400, -968004000, -952282800, -936554400, -920833200, -905104800, -889383600, -873655200, -857934000, -842205600, -825879600, -810151200, -794430000, -778701600, -762980400, -747252000, -731530800, -715802400, -700081200, -684352800, -668026800, -652903200, -636577200, -620848800, -605127600, -589399200, -573678000, -557949600, -542228400, -526500000, -510778800, -495050400, -478724400, -463600800, -447274800, -431546400, -415825200, -400096800, -384375600, -368647200, -352926000, -337197600, -321476400, -305748000, -289422000, -273693600, -257972400, -242244000, -226522800, -210794400, -195073200, -179344800, -163623600, -147895200, -131569200, -116445600, -100119600, -84391200, -68670000, -52941600, -37220400, -21492000, -5770800, 9957600, 25678800, 41407200, 57733200, 73461600, 89182800, 104911200, 120632400, 126684000, 154501200, 162367200, 183531600, 199260000, 215586000 } + typeOffsets:intvector { -14400, 0, -14400, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -14400 } + finalYear:int { 1977 } + } //Z#589 + /* SystemV/CST6 */ :table { + typeOffsets:intvector { -21600, 0 } + } //Z#590 + /* SystemV/CST6CDT */ :table { + transPre32:intvector { -1, 2096202496, -1, 2111923696, -1, 2127652096, -1, 2143373296 } + trans:intvector { -2135865600, -2120144400, -2104416000, -2088694800, -2072966400, -2056640400, -2040912000, -2025190800, -2009462400, -1993741200, -1978012800, -1962291600, -1946563200, -1930842000, -1915113600, -1898787600, -1883664000, -1867338000, -1851609600, -1835888400, -1820160000, -1804438800, -1788710400, -1772989200, -1757260800, -1741539600, -1725811200, -1709485200, -1693756800, -1678035600, -1662307200, -1646586000, -1630857600, -1615136400, -1599408000, -1583686800, -1567958400, -1551632400, -1536508800, -1520182800, -1504454400, -1488733200, -1473004800, -1457283600, -1441555200, -1425834000, -1410105600, -1394384400, -1378656000, -1362330000, -1347206400, -1330880400, -1315152000, -1299430800, -1283702400, -1267981200, -1252252800, -1236531600, -1220803200, -1205082000, -1189353600, -1173027600, -1157299200, -1141578000, -1125849600, -1110128400, -1094400000, -1078678800, -1062950400, -1047229200, -1031500800, -1015174800, -1000051200, -983725200, -967996800, -952275600, -936547200, -920826000, -905097600, -889376400, -873648000, -857926800, -842198400, -825872400, -810144000, -794422800, -778694400, -762973200, -747244800, -731523600, -715795200, -700074000, -684345600, -668019600, -652896000, -636570000, -620841600, -605120400, -589392000, -573670800, -557942400, -542221200, -526492800, -510771600, -495043200, -478717200, -463593600, -447267600, -431539200, -415818000, -400089600, -384368400, -368640000, -352918800, -337190400, -321469200, -305740800, -289414800, -273686400, -257965200, -242236800, -226515600, -210787200, -195066000, -179337600, -163616400, -147888000, -131562000, -116438400, -100112400, -84384000, -68662800, -52934400, -37213200, -21484800, -5763600, 9964800, 25686000, 41414400, 57740400, 73468800, 89190000, 104918400, 120639600, 126691200, 154508400, 162374400, 183538800, 199267200, 215593200 } + typeOffsets:intvector { -21600, 0, -21600, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -21600 } + finalYear:int { 1977 } + } //Z#591 + /* SystemV/EST5 */ :table { + typeOffsets:intvector { -18000, 0 } + } //Z#592 + /* SystemV/EST5EDT */ :table { + transPre32:intvector { -1, 2096198896, -1, 2111920096, -1, 2127648496, -1, 2143369696 } + trans:intvector { -2135869200, -2120148000, -2104419600, -2088698400, -2072970000, -2056644000, -2040915600, -2025194400, -2009466000, -1993744800, -1978016400, -1962295200, -1946566800, -1930845600, -1915117200, -1898791200, -1883667600, -1867341600, -1851613200, -1835892000, -1820163600, -1804442400, -1788714000, -1772992800, -1757264400, -1741543200, -1725814800, -1709488800, -1693760400, -1678039200, -1662310800, -1646589600, -1630861200, -1615140000, -1599411600, -1583690400, -1567962000, -1551636000, -1536512400, -1520186400, -1504458000, -1488736800, -1473008400, -1457287200, -1441558800, -1425837600, -1410109200, -1394388000, -1378659600, -1362333600, -1347210000, -1330884000, -1315155600, -1299434400, -1283706000, -1267984800, -1252256400, -1236535200, -1220806800, -1205085600, -1189357200, -1173031200, -1157302800, -1141581600, -1125853200, -1110132000, -1094403600, -1078682400, -1062954000, -1047232800, -1031504400, -1015178400, -1000054800, -983728800, -968000400, -952279200, -936550800, -920829600, -905101200, -889380000, -873651600, -857930400, -842202000, -825876000, -810147600, -794426400, -778698000, -762976800, -747248400, -731527200, -715798800, -700077600, -684349200, -668023200, -652899600, -636573600, -620845200, -605124000, -589395600, -573674400, -557946000, -542224800, -526496400, -510775200, -495046800, -478720800, -463597200, -447271200, -431542800, -415821600, -400093200, -384372000, -368643600, -352922400, -337194000, -321472800, -305744400, -289418400, -273690000, -257968800, -242240400, -226519200, -210790800, -195069600, -179341200, -163620000, -147891600, -131565600, -116442000, -100116000, -84387600, -68666400, -52938000, -37216800, -21488400, -5767200, 9961200, 25682400, 41410800, 57736800, 73465200, 89186400, 104914800, 120636000, 126687600, 154504800, 162370800, 183535200, 199263600, 215589600 } + typeOffsets:intvector { -18000, 0, -18000, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -18000 } + finalYear:int { 1977 } + } //Z#593 + /* SystemV/HST10 */ :table { + typeOffsets:intvector { -36000, 0 } + } //Z#594 + /* SystemV/MST7 */ :table { + typeOffsets:intvector { -25200, 0 } + } //Z#595 + /* SystemV/MST7MDT */ :table { + transPre32:intvector { -1, 2096206096, -1, 2111927296, -1, 2127655696, -1, 2143376896 } + trans:intvector { -2135862000, -2120140800, -2104412400, -2088691200, -2072962800, -2056636800, -2040908400, -2025187200, -2009458800, -1993737600, -1978009200, -1962288000, -1946559600, -1930838400, -1915110000, -1898784000, -1883660400, -1867334400, -1851606000, -1835884800, -1820156400, -1804435200, -1788706800, -1772985600, -1757257200, -1741536000, -1725807600, -1709481600, -1693753200, -1678032000, -1662303600, -1646582400, -1630854000, -1615132800, -1599404400, -1583683200, -1567954800, -1551628800, -1536505200, -1520179200, -1504450800, -1488729600, -1473001200, -1457280000, -1441551600, -1425830400, -1410102000, -1394380800, -1378652400, -1362326400, -1347202800, -1330876800, -1315148400, -1299427200, -1283698800, -1267977600, -1252249200, -1236528000, -1220799600, -1205078400, -1189350000, -1173024000, -1157295600, -1141574400, -1125846000, -1110124800, -1094396400, -1078675200, -1062946800, -1047225600, -1031497200, -1015171200, -1000047600, -983721600, -967993200, -952272000, -936543600, -920822400, -905094000, -889372800, -873644400, -857923200, -842194800, -825868800, -810140400, -794419200, -778690800, -762969600, -747241200, -731520000, -715791600, -700070400, -684342000, -668016000, -652892400, -636566400, -620838000, -605116800, -589388400, -573667200, -557938800, -542217600, -526489200, -510768000, -495039600, -478713600, -463590000, -447264000, -431535600, -415814400, -400086000, -384364800, -368636400, -352915200, -337186800, -321465600, -305737200, -289411200, -273682800, -257961600, -242233200, -226512000, -210783600, -195062400, -179334000, -163612800, -147884400, -131558400, -116434800, -100108800, -84380400, -68659200, -52930800, -37209600, -21481200, -5760000, 9968400, 25689600, 41418000, 57744000, 73472400, 89193600, 104922000, 120643200, 126694800, 154512000, 162378000, 183542400, 199270800, 215596800 } + typeOffsets:intvector { -25200, 0, -25200, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -25200 } + finalYear:int { 1977 } + } //Z#596 + /* SystemV/PST8 */ :table { + typeOffsets:intvector { -28800, 0 } + } //Z#597 + /* SystemV/PST8PDT */ :table { + transPre32:intvector { -1, 2096209696, -1, 2111930896, -1, 2127659296, -1, 2143380496 } + trans:intvector { -2135858400, -2120137200, -2104408800, -2088687600, -2072959200, -2056633200, -2040904800, -2025183600, -2009455200, -1993734000, -1978005600, -1962284400, -1946556000, -1930834800, -1915106400, -1898780400, -1883656800, -1867330800, -1851602400, -1835881200, -1820152800, -1804431600, -1788703200, -1772982000, -1757253600, -1741532400, -1725804000, -1709478000, -1693749600, -1678028400, -1662300000, -1646578800, -1630850400, -1615129200, -1599400800, -1583679600, -1567951200, -1551625200, -1536501600, -1520175600, -1504447200, -1488726000, -1472997600, -1457276400, -1441548000, -1425826800, -1410098400, -1394377200, -1378648800, -1362322800, -1347199200, -1330873200, -1315144800, -1299423600, -1283695200, -1267974000, -1252245600, -1236524400, -1220796000, -1205074800, -1189346400, -1173020400, -1157292000, -1141570800, -1125842400, -1110121200, -1094392800, -1078671600, -1062943200, -1047222000, -1031493600, -1015167600, -1000044000, -983718000, -967989600, -952268400, -936540000, -920818800, -905090400, -889369200, -873640800, -857919600, -842191200, -825865200, -810136800, -794415600, -778687200, -762966000, -747237600, -731516400, -715788000, -700066800, -684338400, -668012400, -652888800, -636562800, -620834400, -605113200, -589384800, -573663600, -557935200, -542214000, -526485600, -510764400, -495036000, -478710000, -463586400, -447260400, -431532000, -415810800, -400082400, -384361200, -368632800, -352911600, -337183200, -321462000, -305733600, -289407600, -273679200, -257958000, -242229600, -226508400, -210780000, -195058800, -179330400, -163609200, -147880800, -131554800, -116431200, -100105200, -84376800, -68655600, -52927200, -37206000, -21477600, -5756400, 9972000, 25693200, 41421600, 57747600, 73476000, 89197200, 104925600, 120646800, 126698400, 154515600, 162381600, 183546000, 199274400, 215600400 } + typeOffsets:intvector { -28800, 0, -28800, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -28800 } + finalYear:int { 1977 } + } //Z#598 + /* SystemV/YST9 */ :table { + typeOffsets:intvector { -32400, 0 } + } //Z#599 + /* SystemV/YST9YDT */ :table { + transPre32:intvector { -1, 2096213296, -1, 2111934496, -1, 2127662896, -1, 2143384096 } + trans:intvector { -2135854800, -2120133600, -2104405200, -2088684000, -2072955600, -2056629600, -2040901200, -2025180000, -2009451600, -1993730400, -1978002000, -1962280800, -1946552400, -1930831200, -1915102800, -1898776800, -1883653200, -1867327200, -1851598800, -1835877600, -1820149200, -1804428000, -1788699600, -1772978400, -1757250000, -1741528800, -1725800400, -1709474400, -1693746000, -1678024800, -1662296400, -1646575200, -1630846800, -1615125600, -1599397200, -1583676000, -1567947600, -1551621600, -1536498000, -1520172000, -1504443600, -1488722400, -1472994000, -1457272800, -1441544400, -1425823200, -1410094800, -1394373600, -1378645200, -1362319200, -1347195600, -1330869600, -1315141200, -1299420000, -1283691600, -1267970400, -1252242000, -1236520800, -1220792400, -1205071200, -1189342800, -1173016800, -1157288400, -1141567200, -1125838800, -1110117600, -1094389200, -1078668000, -1062939600, -1047218400, -1031490000, -1015164000, -1000040400, -983714400, -967986000, -952264800, -936536400, -920815200, -905086800, -889365600, -873637200, -857916000, -842187600, -825861600, -810133200, -794412000, -778683600, -762962400, -747234000, -731512800, -715784400, -700063200, -684334800, -668008800, -652885200, -636559200, -620830800, -605109600, -589381200, -573660000, -557931600, -542210400, -526482000, -510760800, -495032400, -478706400, -463582800, -447256800, -431528400, -415807200, -400078800, -384357600, -368629200, -352908000, -337179600, -321458400, -305730000, -289404000, -273675600, -257954400, -242226000, -226504800, -210776400, -195055200, -179326800, -163605600, -147877200, -131551200, -116427600, -100101600, -84373200, -68652000, -52923600, -37202400, -21474000, -5752800, 9975600, 25696800, 41425200, 57751200, 73479600, 89200800, 104929200, 120650400, 126702000, 154519200, 162385200, 183549600, 199278000, 215604000 } + typeOffsets:intvector { -32400, 0, -32400, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "SystemV" } + finalRaw:int { -32400 } + finalYear:int { 1977 } + } //Z#600 + /* Turkey */ :int { 449 } //Z#601 + /* UCT */ :int { 426 } //Z#602 + /* US/Alaska */ :int { 60 } //Z#603 + /* US/Aleutian */ :int { 59 } //Z#604 + /* US/Arizona */ :int { 183 } //Z#605 + /* US/Central */ :int { 98 } //Z#606 + /* US/East-Indiana */ :int { 130 } //Z#607 + /* US/Eastern */ :int { 172 } //Z#608 + /* US/Hawaii */ :int { 554 } //Z#609 + /* US/Indiana-Starke */ :int { 131 } //Z#610 + /* US/Michigan */ :int { 110 } //Z#611 + /* US/Mountain */ :int { 109 } //Z#612 + /* US/Pacific */ :int { 150 } //Z#613 + /* US/Pacific-New */ :int { 150 } //Z#614 + /* US/Samoa */ :int { 566 } //Z#615 + /* UTC */ :int { 427 } //Z#616 + /* Universal */ :int { 427 } //Z#617 + /* VST */ :int { 266 } //Z#618 + /* W-SU */ :int { 462 } //Z#619 + /* WET */ :table { + trans:intvector { 228877200, 243997200, 260326800, 276051600, 291776400, 307501200, 323830800, 338950800, 354675600, 370400400, 386125200, 401850000, 417574800, 433299600, 449024400, 465354000, 481078800, 496803600, 512528400, 528253200, 543978000, 559702800, 575427600, 591152400, 606877200, 622602000, 638326800, 654656400, 670381200, 686106000, 701830800, 717555600, 733280400, 749005200, 764730000, 780454800, 796179600, 811904400, 828234000, 846378000 } + typeOffsets:intvector { 0, 0, 0, 3600 } + typeMap:bin { "01000100010001000100010001000100010001000100010001000100010001000100010001000100" } + finalRule { "EU" } + finalRaw:int { 0 } + finalYear:int { 1997 } + } //Z#620 + /* Zulu */ :int { 427 } //Z#621 + } + Names { + "ACT","AET","AGT","ART","AST","Africa/Abidjan","Africa/Accra" // 6 + ,"Africa/Addis_Ababa","Africa/Algiers","Africa/Asmara" // 9 + ,"Africa/Asmera","Africa/Bamako","Africa/Bangui","Africa/Banjul" // 13 + ,"Africa/Bissau","Africa/Blantyre","Africa/Brazzaville" // 16 + ,"Africa/Bujumbura","Africa/Cairo","Africa/Casablanca" // 19 + ,"Africa/Ceuta","Africa/Conakry","Africa/Dakar","Africa/Dar_es_Salaam" // 23 + ,"Africa/Djibouti","Africa/Douala","Africa/El_Aaiun" // 26 + ,"Africa/Freetown","Africa/Gaborone","Africa/Harare" // 29 + ,"Africa/Johannesburg","Africa/Juba","Africa/Kampala" // 32 + ,"Africa/Khartoum","Africa/Kigali","Africa/Kinshasa" // 35 + ,"Africa/Lagos","Africa/Libreville","Africa/Lome","Africa/Luanda" // 39 + ,"Africa/Lubumbashi","Africa/Lusaka","Africa/Malabo" // 42 + ,"Africa/Maputo","Africa/Maseru","Africa/Mbabane","Africa/Mogadishu" // 46 + ,"Africa/Monrovia","Africa/Nairobi","Africa/Ndjamena" // 49 + ,"Africa/Niamey","Africa/Nouakchott","Africa/Ouagadougou" // 52 + ,"Africa/Porto-Novo","Africa/Sao_Tome","Africa/Timbuktu" // 55 + ,"Africa/Tripoli","Africa/Tunis","Africa/Windhoek" // 58 + ,"America/Adak","America/Anchorage","America/Anguilla" // 61 + ,"America/Antigua","America/Araguaina","America/Argentina/Buenos_Aires" // 64 + ,"America/Argentina/Catamarca","America/Argentina/ComodRivadavia" // 66 + ,"America/Argentina/Cordoba","America/Argentina/Jujuy" // 68 + ,"America/Argentina/La_Rioja","America/Argentina/Mendoza" // 70 + ,"America/Argentina/Rio_Gallegos","America/Argentina/Salta" // 72 + ,"America/Argentina/San_Juan","America/Argentina/San_Luis" // 74 + ,"America/Argentina/Tucuman","America/Argentina/Ushuaia" // 76 + ,"America/Aruba","America/Asuncion","America/Atikokan" // 79 + ,"America/Atka","America/Bahia","America/Bahia_Banderas" // 82 + ,"America/Barbados","America/Belem","America/Belize" // 85 + ,"America/Blanc-Sablon","America/Boa_Vista","America/Bogota" // 88 + ,"America/Boise","America/Buenos_Aires","America/Cambridge_Bay" // 91 + ,"America/Campo_Grande","America/Cancun","America/Caracas" // 94 + ,"America/Catamarca","America/Cayenne","America/Cayman" // 97 + ,"America/Chicago","America/Chihuahua","America/Coral_Harbour" // 100 + ,"America/Cordoba","America/Costa_Rica","America/Creston" // 103 + ,"America/Cuiaba","America/Curacao","America/Danmarkshavn" // 106 + ,"America/Dawson","America/Dawson_Creek","America/Denver" // 109 + ,"America/Detroit","America/Dominica","America/Edmonton" // 112 + ,"America/Eirunepe","America/El_Salvador","America/Ensenada" // 115 + ,"America/Fort_Wayne","America/Fortaleza","America/Glace_Bay" // 118 + ,"America/Godthab","America/Goose_Bay","America/Grand_Turk" // 121 + ,"America/Grenada","America/Guadeloupe","America/Guatemala" // 124 + ,"America/Guayaquil","America/Guyana","America/Halifax" // 127 + ,"America/Havana","America/Hermosillo","America/Indiana/Indianapolis" // 130 + ,"America/Indiana/Knox","America/Indiana/Marengo","America/Indiana/Petersburg" // 133 + ,"America/Indiana/Tell_City","America/Indiana/Vevay" // 135 + ,"America/Indiana/Vincennes","America/Indiana/Winamac" // 137 + ,"America/Indianapolis","America/Inuvik","America/Iqaluit" // 140 + ,"America/Jamaica","America/Jujuy","America/Juneau" // 143 + ,"America/Kentucky/Louisville","America/Kentucky/Monticello" // 145 + ,"America/Knox_IN","America/Kralendijk","America/La_Paz" // 148 + ,"America/Lima","America/Los_Angeles","America/Louisville" // 151 + ,"America/Lower_Princes","America/Maceio","America/Managua" // 154 + ,"America/Manaus","America/Marigot","America/Martinique" // 157 + ,"America/Matamoros","America/Mazatlan","America/Mendoza" // 160 + ,"America/Menominee","America/Merida","America/Metlakatla" // 163 + ,"America/Mexico_City","America/Miquelon","America/Moncton" // 166 + ,"America/Monterrey","America/Montevideo","America/Montreal" // 169 + ,"America/Montserrat","America/Nassau","America/New_York" // 172 + ,"America/Nipigon","America/Nome","America/Noronha" // 175 + ,"America/North_Dakota/Beulah","America/North_Dakota/Center" // 177 + ,"America/North_Dakota/New_Salem","America/Ojinaga" // 179 + ,"America/Panama","America/Pangnirtung","America/Paramaribo" // 182 + ,"America/Phoenix","America/Port-au-Prince","America/Port_of_Spain" // 185 + ,"America/Porto_Acre","America/Porto_Velho","America/Puerto_Rico" // 188 + ,"America/Rainy_River","America/Rankin_Inlet","America/Recife" // 191 + ,"America/Regina","America/Resolute","America/Rio_Branco" // 194 + ,"America/Rosario","America/Santa_Isabel","America/Santarem" // 197 + ,"America/Santiago","America/Santo_Domingo","America/Sao_Paulo" // 200 + ,"America/Scoresbysund","America/Shiprock","America/Sitka" // 203 + ,"America/St_Barthelemy","America/St_Johns","America/St_Kitts" // 206 + ,"America/St_Lucia","America/St_Thomas","America/St_Vincent" // 209 + ,"America/Swift_Current","America/Tegucigalpa","America/Thule" // 212 + ,"America/Thunder_Bay","America/Tijuana","America/Toronto" // 215 + ,"America/Tortola","America/Vancouver","America/Virgin" // 218 + ,"America/Whitehorse","America/Winnipeg","America/Yakutat" // 221 + ,"America/Yellowknife","Antarctica/Casey","Antarctica/Davis" // 224 + ,"Antarctica/DumontDUrville","Antarctica/Macquarie" // 226 + ,"Antarctica/Mawson","Antarctica/McMurdo","Antarctica/Palmer" // 229 + ,"Antarctica/Rothera","Antarctica/South_Pole","Antarctica/Syowa" // 232 + ,"Antarctica/Troll","Antarctica/Vostok","Arctic/Longyearbyen" // 235 + ,"Asia/Aden","Asia/Almaty","Asia/Amman","Asia/Anadyr" // 239 + ,"Asia/Aqtau","Asia/Aqtobe","Asia/Ashgabat","Asia/Ashkhabad" // 243 + ,"Asia/Baghdad","Asia/Bahrain","Asia/Baku","Asia/Bangkok" // 247 + ,"Asia/Beirut","Asia/Bishkek","Asia/Brunei","Asia/Calcutta" // 251 + ,"Asia/Chita","Asia/Choibalsan","Asia/Chongqing","Asia/Chungking" // 255 + ,"Asia/Colombo","Asia/Dacca","Asia/Damascus","Asia/Dhaka" // 259 + ,"Asia/Dili","Asia/Dubai","Asia/Dushanbe","Asia/Gaza" // 263 + ,"Asia/Harbin","Asia/Hebron","Asia/Ho_Chi_Minh","Asia/Hong_Kong" // 267 + ,"Asia/Hovd","Asia/Irkutsk","Asia/Istanbul","Asia/Jakarta" // 271 + ,"Asia/Jayapura","Asia/Jerusalem","Asia/Kabul","Asia/Kamchatka" // 275 + ,"Asia/Karachi","Asia/Kashgar","Asia/Kathmandu","Asia/Katmandu" // 279 + ,"Asia/Khandyga","Asia/Kolkata","Asia/Krasnoyarsk" // 282 + ,"Asia/Kuala_Lumpur","Asia/Kuching","Asia/Kuwait","Asia/Macao" // 286 + ,"Asia/Macau","Asia/Magadan","Asia/Makassar","Asia/Manila" // 290 + ,"Asia/Muscat","Asia/Nicosia","Asia/Novokuznetsk","Asia/Novosibirsk" // 294 + ,"Asia/Omsk","Asia/Oral","Asia/Phnom_Penh","Asia/Pontianak" // 298 + ,"Asia/Pyongyang","Asia/Qatar","Asia/Qyzylorda","Asia/Rangoon" // 302 + ,"Asia/Riyadh","Asia/Saigon","Asia/Sakhalin","Asia/Samarkand" // 306 + ,"Asia/Seoul","Asia/Shanghai","Asia/Singapore","Asia/Srednekolymsk" // 310 + ,"Asia/Taipei","Asia/Tashkent","Asia/Tbilisi","Asia/Tehran" // 314 + ,"Asia/Tel_Aviv","Asia/Thimbu","Asia/Thimphu","Asia/Tokyo" // 318 + ,"Asia/Ujung_Pandang","Asia/Ulaanbaatar","Asia/Ulan_Bator" // 321 + ,"Asia/Urumqi","Asia/Ust-Nera","Asia/Vientiane","Asia/Vladivostok" // 325 + ,"Asia/Yakutsk","Asia/Yekaterinburg","Asia/Yerevan" // 328 + ,"Atlantic/Azores","Atlantic/Bermuda","Atlantic/Canary" // 331 + ,"Atlantic/Cape_Verde","Atlantic/Faeroe","Atlantic/Faroe" // 334 + ,"Atlantic/Jan_Mayen","Atlantic/Madeira","Atlantic/Reykjavik" // 337 + ,"Atlantic/South_Georgia","Atlantic/St_Helena","Atlantic/Stanley" // 340 + ,"Australia/ACT","Australia/Adelaide","Australia/Brisbane" // 343 + ,"Australia/Broken_Hill","Australia/Canberra","Australia/Currie" // 346 + ,"Australia/Darwin","Australia/Eucla","Australia/Hobart" // 349 + ,"Australia/LHI","Australia/Lindeman","Australia/Lord_Howe" // 352 + ,"Australia/Melbourne","Australia/NSW","Australia/North" // 355 + ,"Australia/Perth","Australia/Queensland","Australia/South" // 358 + ,"Australia/Sydney","Australia/Tasmania","Australia/Victoria" // 361 + ,"Australia/West","Australia/Yancowinna","BET","BST" // 365 + ,"Brazil/Acre","Brazil/DeNoronha","Brazil/East","Brazil/West" // 369 + ,"CAT","CET","CNT","CST","CST6CDT","CTT","Canada/Atlantic" // 376 + ,"Canada/Central","Canada/East-Saskatchewan","Canada/Eastern" // 379 + ,"Canada/Mountain","Canada/Newfoundland","Canada/Pacific" // 382 + ,"Canada/Saskatchewan","Canada/Yukon","Chile/Continental" // 385 + ,"Chile/EasterIsland","Cuba","EAT","ECT","EET","EST" // 391 + ,"EST5EDT","Egypt","Eire","Etc/GMT","Etc/GMT+0","Etc/GMT+1" // 397 + ,"Etc/GMT+10","Etc/GMT+11","Etc/GMT+12","Etc/GMT+2" // 401 + ,"Etc/GMT+3","Etc/GMT+4","Etc/GMT+5","Etc/GMT+6","Etc/GMT+7" // 406 + ,"Etc/GMT+8","Etc/GMT+9","Etc/GMT-0","Etc/GMT-1","Etc/GMT-10" // 411 + ,"Etc/GMT-11","Etc/GMT-12","Etc/GMT-13","Etc/GMT-14" // 415 + ,"Etc/GMT-2","Etc/GMT-3","Etc/GMT-4","Etc/GMT-5","Etc/GMT-6" // 420 + ,"Etc/GMT-7","Etc/GMT-8","Etc/GMT-9","Etc/GMT0","Etc/Greenwich" // 425 + ,"Etc/UCT","Etc/UTC","Etc/Universal","Etc/Unknown" // 429 + ,"Etc/Zulu","Europe/Amsterdam","Europe/Andorra","Europe/Athens" // 433 + ,"Europe/Belfast","Europe/Belgrade","Europe/Berlin" // 436 + ,"Europe/Bratislava","Europe/Brussels","Europe/Bucharest" // 439 + ,"Europe/Budapest","Europe/Busingen","Europe/Chisinau" // 442 + ,"Europe/Copenhagen","Europe/Dublin","Europe/Gibraltar" // 445 + ,"Europe/Guernsey","Europe/Helsinki","Europe/Isle_of_Man" // 448 + ,"Europe/Istanbul","Europe/Jersey","Europe/Kaliningrad" // 451 + ,"Europe/Kiev","Europe/Lisbon","Europe/Ljubljana","Europe/London" // 455 + ,"Europe/Luxembourg","Europe/Madrid","Europe/Malta" // 458 + ,"Europe/Mariehamn","Europe/Minsk","Europe/Monaco" // 461 + ,"Europe/Moscow","Europe/Nicosia","Europe/Oslo","Europe/Paris" // 465 + ,"Europe/Podgorica","Europe/Prague","Europe/Riga","Europe/Rome" // 469 + ,"Europe/Samara","Europe/San_Marino","Europe/Sarajevo" // 472 + ,"Europe/Simferopol","Europe/Skopje","Europe/Sofia" // 475 + ,"Europe/Stockholm","Europe/Tallinn","Europe/Tirane" // 478 + ,"Europe/Tiraspol","Europe/Uzhgorod","Europe/Vaduz" // 481 + ,"Europe/Vatican","Europe/Vienna","Europe/Vilnius" // 484 + ,"Europe/Volgograd","Europe/Warsaw","Europe/Zagreb" // 487 + ,"Europe/Zaporozhye","Europe/Zurich","Factory","GB" // 491 + ,"GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich" // 497 + ,"HST","Hongkong","IET","IST","Iceland","Indian/Antananarivo" // 503 + ,"Indian/Chagos","Indian/Christmas","Indian/Cocos" // 506 + ,"Indian/Comoro","Indian/Kerguelen","Indian/Mahe","Indian/Maldives" // 510 + ,"Indian/Mauritius","Indian/Mayotte","Indian/Reunion" // 513 + ,"Iran","Israel","JST","Jamaica","Japan","Kwajalein" // 519 + ,"Libya","MET","MIT","MST","MST7MDT","Mexico/BajaNorte" // 525 + ,"Mexico/BajaSur","Mexico/General","NET","NST","NZ" // 530 + ,"NZ-CHAT","Navajo","PLT","PNT","PRC","PRT","PST","PST8PDT" // 538 + ,"Pacific/Apia","Pacific/Auckland","Pacific/Bougainville" // 541 + ,"Pacific/Chatham","Pacific/Chuuk","Pacific/Easter" // 544 + ,"Pacific/Efate","Pacific/Enderbury","Pacific/Fakaofo" // 547 + ,"Pacific/Fiji","Pacific/Funafuti","Pacific/Galapagos" // 550 + ,"Pacific/Gambier","Pacific/Guadalcanal","Pacific/Guam" // 553 + ,"Pacific/Honolulu","Pacific/Johnston","Pacific/Kiritimati" // 556 + ,"Pacific/Kosrae","Pacific/Kwajalein","Pacific/Majuro" // 559 + ,"Pacific/Marquesas","Pacific/Midway","Pacific/Nauru" // 562 + ,"Pacific/Niue","Pacific/Norfolk","Pacific/Noumea" // 565 + ,"Pacific/Pago_Pago","Pacific/Palau","Pacific/Pitcairn" // 568 + ,"Pacific/Pohnpei","Pacific/Ponape","Pacific/Port_Moresby" // 571 + ,"Pacific/Rarotonga","Pacific/Saipan","Pacific/Samoa" // 574 + ,"Pacific/Tahiti","Pacific/Tarawa","Pacific/Tongatapu" // 577 + ,"Pacific/Truk","Pacific/Wake","Pacific/Wallis","Pacific/Yap" // 581 + ,"Poland","Portugal","ROC","ROK","SST","Singapore" // 587 + ,"SystemV/AST4","SystemV/AST4ADT","SystemV/CST6","SystemV/CST6CDT" // 591 + ,"SystemV/EST5","SystemV/EST5EDT","SystemV/HST10","SystemV/MST7" // 595 + ,"SystemV/MST7MDT","SystemV/PST8","SystemV/PST8PDT" // 598 + ,"SystemV/YST9","SystemV/YST9YDT","Turkey","UCT","US/Alaska" // 603 + ,"US/Aleutian","US/Arizona","US/Central","US/East-Indiana" // 607 + ,"US/Eastern","US/Hawaii","US/Indiana-Starke","US/Michigan" // 611 + ,"US/Mountain","US/Pacific","US/Pacific-New","US/Samoa" // 615 + ,"UTC","Universal","VST","W-SU","WET","Zulu" // 621 + } + Rules { + AN:intvector { + 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 + } //_#0 + AS:intvector { + 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 + } //_#1 + AT:intvector { + 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 + } //_#2 + AV:intvector { + 9, 1, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 + } //_#3 + Azer:intvector { + 2, -31, -1, 14400, 0, 9, -31, -1, 18000, 0, 3600 + } //_#4 + Brazil:intvector { + 9, 15, -1, 0, 0, 1, 15, -1, 0, 0, 3600 + } //_#5 + C-Eur:intvector { + 2, -31, -1, 7200, 1, 9, -31, -1, 7200, 1, 3600 + } //_#6 + Canada:intvector { + 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 + } //_#7 + Chatham:intvector { + 8, -30, -1, 9900, 1, 3, 1, -1, 9900, 1, 3600 + } //_#8 + Cuba:intvector { + 2, 8, -1, 0, 1, 10, 1, -1, 0, 1, 3600 + } //_#9 + EU:intvector { + 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 + } //_#10 + EUAsia:intvector { + 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 3600 + } //_#11 + Fiji:intvector { + 10, 1, -1, 7200, 0, 0, 18, -1, 10800, 0, 3600 + } //_#12 + Haiti:intvector { + 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 + } //_#13 + Jordan:intvector { + 2, -31, -5, 86400, 0, 9, -31, -6, 0, 1, 3600 + } //_#14 + LH:intvector { + 9, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 1800 + } //_#15 + Lebanon:intvector { + 2, -31, -1, 0, 0, 9, -31, -1, 0, 0, 3600 + } //_#16 + Mexico:intvector { + 3, 1, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#17 + Moldova:intvector { + 2, -31, -1, 7200, 0, 9, -31, -1, 10800, 0, 3600 + } //_#18 + Mongol:intvector { + 2, -31, -7, 7200, 0, 8, -30, -7, 0, 0, 3600 + } //_#19 + Morocco:intvector { + 2, -31, -1, 7200, 0, 9, -31, -1, 10800, 0, 3600 + } //_#20 + NZ:intvector { + 8, -30, -1, 7200, 1, 3, 1, -1, 7200, 1, 3600 + } //_#21 + Namibia:intvector { + 8, 1, -1, 7200, 0, 3, 1, -1, 7200, 0, 3600 + } //_#22 + Palestine:intvector { + 2, -31, -6, 86400, 0, 9, 21, -6, 0, 0, 3600 + } //_#23 + Para:intvector { + 9, 1, -1, 0, 0, 2, 22, -1, 0, 0, 3600 + } //_#24 + Syria:intvector { + 2, -31, -6, 0, 0, 9, -31, -6, 0, 0, 3600 + } //_#25 + SystemV:intvector { + 3, -30, -1, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#26 + Thule:intvector { + 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 + } //_#27 + Troll:intvector { + 2, -31, -1, 3600, 2, 9, -31, -1, 3600, 2, 7200 + } //_#28 + US:intvector { + 2, 8, -1, 7200, 0, 10, 1, -1, 7200, 0, 3600 + } //_#29 + WS:intvector { + 8, -30, -1, 10800, 0, 3, 1, -1, 14400, 0, 3600 + } //_#30 + Zion:intvector { + 2, 23, -6, 7200, 0, 9, -31, -1, 7200, 0, 3600 + } //_#31 + } + Regions:array { + "AU", //Z#0 ACT + "AU", //Z#1 AET + "AR", //Z#2 AGT + "EG", //Z#3 ART + "US", //Z#4 AST + "CI", //Z#5 Africa/Abidjan + "GH", //Z#6 Africa/Accra + "ET", //Z#7 Africa/Addis_Ababa + "DZ", //Z#8 Africa/Algiers + "ER", //Z#9 Africa/Asmara + "ER", //Z#10 Africa/Asmera + "ML", //Z#11 Africa/Bamako + "CF", //Z#12 Africa/Bangui + "GM", //Z#13 Africa/Banjul + "GW", //Z#14 Africa/Bissau + "MW", //Z#15 Africa/Blantyre + "CG", //Z#16 Africa/Brazzaville + "BI", //Z#17 Africa/Bujumbura + "EG", //Z#18 Africa/Cairo + "MA", //Z#19 Africa/Casablanca + "ES", //Z#20 Africa/Ceuta + "GN", //Z#21 Africa/Conakry + "SN", //Z#22 Africa/Dakar + "TZ", //Z#23 Africa/Dar_es_Salaam + "DJ", //Z#24 Africa/Djibouti + "CM", //Z#25 Africa/Douala + "EH", //Z#26 Africa/El_Aaiun + "SL", //Z#27 Africa/Freetown + "BW", //Z#28 Africa/Gaborone + "ZW", //Z#29 Africa/Harare + "ZA", //Z#30 Africa/Johannesburg + "SS", //Z#31 Africa/Juba + "UG", //Z#32 Africa/Kampala + "SD", //Z#33 Africa/Khartoum + "RW", //Z#34 Africa/Kigali + "CD", //Z#35 Africa/Kinshasa + "NG", //Z#36 Africa/Lagos + "GA", //Z#37 Africa/Libreville + "TG", //Z#38 Africa/Lome + "AO", //Z#39 Africa/Luanda + "CD", //Z#40 Africa/Lubumbashi + "ZM", //Z#41 Africa/Lusaka + "GQ", //Z#42 Africa/Malabo + "MZ", //Z#43 Africa/Maputo + "LS", //Z#44 Africa/Maseru + "SZ", //Z#45 Africa/Mbabane + "SO", //Z#46 Africa/Mogadishu + "LR", //Z#47 Africa/Monrovia + "KE", //Z#48 Africa/Nairobi + "TD", //Z#49 Africa/Ndjamena + "NE", //Z#50 Africa/Niamey + "MR", //Z#51 Africa/Nouakchott + "BF", //Z#52 Africa/Ouagadougou + "BJ", //Z#53 Africa/Porto-Novo + "ST", //Z#54 Africa/Sao_Tome + "CI", //Z#55 Africa/Timbuktu + "LY", //Z#56 Africa/Tripoli + "TN", //Z#57 Africa/Tunis + "NA", //Z#58 Africa/Windhoek + "US", //Z#59 America/Adak + "US", //Z#60 America/Anchorage + "AI", //Z#61 America/Anguilla + "AG", //Z#62 America/Antigua + "BR", //Z#63 America/Araguaina + "AR", //Z#64 America/Argentina/Buenos_Aires + "AR", //Z#65 America/Argentina/Catamarca + "AR", //Z#66 America/Argentina/ComodRivadavia + "AR", //Z#67 America/Argentina/Cordoba + "AR", //Z#68 America/Argentina/Jujuy + "AR", //Z#69 America/Argentina/La_Rioja + "AR", //Z#70 America/Argentina/Mendoza + "AR", //Z#71 America/Argentina/Rio_Gallegos + "AR", //Z#72 America/Argentina/Salta + "AR", //Z#73 America/Argentina/San_Juan + "AR", //Z#74 America/Argentina/San_Luis + "AR", //Z#75 America/Argentina/Tucuman + "AR", //Z#76 America/Argentina/Ushuaia + "AW", //Z#77 America/Aruba + "PY", //Z#78 America/Asuncion + "CA", //Z#79 America/Atikokan + "US", //Z#80 America/Atka + "BR", //Z#81 America/Bahia + "MX", //Z#82 America/Bahia_Banderas + "BB", //Z#83 America/Barbados + "BR", //Z#84 America/Belem + "BZ", //Z#85 America/Belize + "CA", //Z#86 America/Blanc-Sablon + "BR", //Z#87 America/Boa_Vista + "CO", //Z#88 America/Bogota + "US", //Z#89 America/Boise + "AR", //Z#90 America/Buenos_Aires + "CA", //Z#91 America/Cambridge_Bay + "BR", //Z#92 America/Campo_Grande + "MX", //Z#93 America/Cancun + "VE", //Z#94 America/Caracas + "AR", //Z#95 America/Catamarca + "GF", //Z#96 America/Cayenne + "KY", //Z#97 America/Cayman + "US", //Z#98 America/Chicago + "MX", //Z#99 America/Chihuahua + "CA", //Z#100 America/Coral_Harbour + "AR", //Z#101 America/Cordoba + "CR", //Z#102 America/Costa_Rica + "CA", //Z#103 America/Creston + "BR", //Z#104 America/Cuiaba + "CW", //Z#105 America/Curacao + "GL", //Z#106 America/Danmarkshavn + "CA", //Z#107 America/Dawson + "CA", //Z#108 America/Dawson_Creek + "US", //Z#109 America/Denver + "US", //Z#110 America/Detroit + "DM", //Z#111 America/Dominica + "CA", //Z#112 America/Edmonton + "BR", //Z#113 America/Eirunepe + "SV", //Z#114 America/El_Salvador + "MX", //Z#115 America/Ensenada + "US", //Z#116 America/Fort_Wayne + "BR", //Z#117 America/Fortaleza + "CA", //Z#118 America/Glace_Bay + "GL", //Z#119 America/Godthab + "CA", //Z#120 America/Goose_Bay + "TC", //Z#121 America/Grand_Turk + "GD", //Z#122 America/Grenada + "GP", //Z#123 America/Guadeloupe + "GT", //Z#124 America/Guatemala + "EC", //Z#125 America/Guayaquil + "GY", //Z#126 America/Guyana + "CA", //Z#127 America/Halifax + "CU", //Z#128 America/Havana + "MX", //Z#129 America/Hermosillo + "US", //Z#130 America/Indiana/Indianapolis + "US", //Z#131 America/Indiana/Knox + "US", //Z#132 America/Indiana/Marengo + "US", //Z#133 America/Indiana/Petersburg + "US", //Z#134 America/Indiana/Tell_City + "US", //Z#135 America/Indiana/Vevay + "US", //Z#136 America/Indiana/Vincennes + "US", //Z#137 America/Indiana/Winamac + "US", //Z#138 America/Indianapolis + "CA", //Z#139 America/Inuvik + "CA", //Z#140 America/Iqaluit + "JM", //Z#141 America/Jamaica + "AR", //Z#142 America/Jujuy + "US", //Z#143 America/Juneau + "US", //Z#144 America/Kentucky/Louisville + "US", //Z#145 America/Kentucky/Monticello + "US", //Z#146 America/Knox_IN + "BQ", //Z#147 America/Kralendijk + "BO", //Z#148 America/La_Paz + "PE", //Z#149 America/Lima + "US", //Z#150 America/Los_Angeles + "US", //Z#151 America/Louisville + "SX", //Z#152 America/Lower_Princes + "BR", //Z#153 America/Maceio + "NI", //Z#154 America/Managua + "BR", //Z#155 America/Manaus + "MF", //Z#156 America/Marigot + "MQ", //Z#157 America/Martinique + "MX", //Z#158 America/Matamoros + "MX", //Z#159 America/Mazatlan + "AR", //Z#160 America/Mendoza + "US", //Z#161 America/Menominee + "MX", //Z#162 America/Merida + "US", //Z#163 America/Metlakatla + "MX", //Z#164 America/Mexico_City + "PM", //Z#165 America/Miquelon + "CA", //Z#166 America/Moncton + "MX", //Z#167 America/Monterrey + "UY", //Z#168 America/Montevideo + "CA", //Z#169 America/Montreal + "MS", //Z#170 America/Montserrat + "BS", //Z#171 America/Nassau + "US", //Z#172 America/New_York + "CA", //Z#173 America/Nipigon + "US", //Z#174 America/Nome + "BR", //Z#175 America/Noronha + "US", //Z#176 America/North_Dakota/Beulah + "US", //Z#177 America/North_Dakota/Center + "US", //Z#178 America/North_Dakota/New_Salem + "MX", //Z#179 America/Ojinaga + "PA", //Z#180 America/Panama + "CA", //Z#181 America/Pangnirtung + "SR", //Z#182 America/Paramaribo + "US", //Z#183 America/Phoenix + "HT", //Z#184 America/Port-au-Prince + "TT", //Z#185 America/Port_of_Spain + "BR", //Z#186 America/Porto_Acre + "BR", //Z#187 America/Porto_Velho + "PR", //Z#188 America/Puerto_Rico + "CA", //Z#189 America/Rainy_River + "CA", //Z#190 America/Rankin_Inlet + "BR", //Z#191 America/Recife + "CA", //Z#192 America/Regina + "CA", //Z#193 America/Resolute + "BR", //Z#194 America/Rio_Branco + "AR", //Z#195 America/Rosario + "MX", //Z#196 America/Santa_Isabel + "BR", //Z#197 America/Santarem + "CL", //Z#198 America/Santiago + "DO", //Z#199 America/Santo_Domingo + "BR", //Z#200 America/Sao_Paulo + "GL", //Z#201 America/Scoresbysund + "US", //Z#202 America/Shiprock + "US", //Z#203 America/Sitka + "BL", //Z#204 America/St_Barthelemy + "CA", //Z#205 America/St_Johns + "KN", //Z#206 America/St_Kitts + "LC", //Z#207 America/St_Lucia + "VI", //Z#208 America/St_Thomas + "VC", //Z#209 America/St_Vincent + "CA", //Z#210 America/Swift_Current + "HN", //Z#211 America/Tegucigalpa + "GL", //Z#212 America/Thule + "CA", //Z#213 America/Thunder_Bay + "MX", //Z#214 America/Tijuana + "CA", //Z#215 America/Toronto + "VG", //Z#216 America/Tortola + "CA", //Z#217 America/Vancouver + "TT", //Z#218 America/Virgin + "CA", //Z#219 America/Whitehorse + "CA", //Z#220 America/Winnipeg + "US", //Z#221 America/Yakutat + "CA", //Z#222 America/Yellowknife + "AQ", //Z#223 Antarctica/Casey + "AQ", //Z#224 Antarctica/Davis + "AQ", //Z#225 Antarctica/DumontDUrville + "AU", //Z#226 Antarctica/Macquarie + "AQ", //Z#227 Antarctica/Mawson + "AQ", //Z#228 Antarctica/McMurdo + "AQ", //Z#229 Antarctica/Palmer + "AQ", //Z#230 Antarctica/Rothera + "NZ", //Z#231 Antarctica/South_Pole + "AQ", //Z#232 Antarctica/Syowa + "AQ", //Z#233 Antarctica/Troll + "AQ", //Z#234 Antarctica/Vostok + "SJ", //Z#235 Arctic/Longyearbyen + "YE", //Z#236 Asia/Aden + "KZ", //Z#237 Asia/Almaty + "JO", //Z#238 Asia/Amman + "RU", //Z#239 Asia/Anadyr + "KZ", //Z#240 Asia/Aqtau + "KZ", //Z#241 Asia/Aqtobe + "TM", //Z#242 Asia/Ashgabat + "TM", //Z#243 Asia/Ashkhabad + "IQ", //Z#244 Asia/Baghdad + "BH", //Z#245 Asia/Bahrain + "AZ", //Z#246 Asia/Baku + "TH", //Z#247 Asia/Bangkok + "LB", //Z#248 Asia/Beirut + "KG", //Z#249 Asia/Bishkek + "BN", //Z#250 Asia/Brunei + "IN", //Z#251 Asia/Calcutta + "RU", //Z#252 Asia/Chita + "MN", //Z#253 Asia/Choibalsan + "CN", //Z#254 Asia/Chongqing + "CN", //Z#255 Asia/Chungking + "LK", //Z#256 Asia/Colombo + "BD", //Z#257 Asia/Dacca + "SY", //Z#258 Asia/Damascus + "BD", //Z#259 Asia/Dhaka + "TL", //Z#260 Asia/Dili + "AE", //Z#261 Asia/Dubai + "TJ", //Z#262 Asia/Dushanbe + "PS", //Z#263 Asia/Gaza + "CN", //Z#264 Asia/Harbin + "PS", //Z#265 Asia/Hebron + "VN", //Z#266 Asia/Ho_Chi_Minh + "HK", //Z#267 Asia/Hong_Kong + "MN", //Z#268 Asia/Hovd + "RU", //Z#269 Asia/Irkutsk + "TR", //Z#270 Asia/Istanbul + "ID", //Z#271 Asia/Jakarta + "ID", //Z#272 Asia/Jayapura + "IL", //Z#273 Asia/Jerusalem + "AF", //Z#274 Asia/Kabul + "RU", //Z#275 Asia/Kamchatka + "PK", //Z#276 Asia/Karachi + "CN", //Z#277 Asia/Kashgar + "NP", //Z#278 Asia/Kathmandu + "NP", //Z#279 Asia/Katmandu + "RU", //Z#280 Asia/Khandyga + "IN", //Z#281 Asia/Kolkata + "RU", //Z#282 Asia/Krasnoyarsk + "MY", //Z#283 Asia/Kuala_Lumpur + "MY", //Z#284 Asia/Kuching + "KW", //Z#285 Asia/Kuwait + "MO", //Z#286 Asia/Macao + "MO", //Z#287 Asia/Macau + "RU", //Z#288 Asia/Magadan + "ID", //Z#289 Asia/Makassar + "PH", //Z#290 Asia/Manila + "OM", //Z#291 Asia/Muscat + "CY", //Z#292 Asia/Nicosia + "RU", //Z#293 Asia/Novokuznetsk + "RU", //Z#294 Asia/Novosibirsk + "RU", //Z#295 Asia/Omsk + "KZ", //Z#296 Asia/Oral + "KH", //Z#297 Asia/Phnom_Penh + "ID", //Z#298 Asia/Pontianak + "KP", //Z#299 Asia/Pyongyang + "QA", //Z#300 Asia/Qatar + "KZ", //Z#301 Asia/Qyzylorda + "MM", //Z#302 Asia/Rangoon + "SA", //Z#303 Asia/Riyadh + "VN", //Z#304 Asia/Saigon + "RU", //Z#305 Asia/Sakhalin + "UZ", //Z#306 Asia/Samarkand + "KR", //Z#307 Asia/Seoul + "CN", //Z#308 Asia/Shanghai + "SG", //Z#309 Asia/Singapore + "RU", //Z#310 Asia/Srednekolymsk + "TW", //Z#311 Asia/Taipei + "UZ", //Z#312 Asia/Tashkent + "GE", //Z#313 Asia/Tbilisi + "IR", //Z#314 Asia/Tehran + "IL", //Z#315 Asia/Tel_Aviv + "BT", //Z#316 Asia/Thimbu + "BT", //Z#317 Asia/Thimphu + "JP", //Z#318 Asia/Tokyo + "ID", //Z#319 Asia/Ujung_Pandang + "MN", //Z#320 Asia/Ulaanbaatar + "MN", //Z#321 Asia/Ulan_Bator + "CN", //Z#322 Asia/Urumqi + "RU", //Z#323 Asia/Ust-Nera + "LA", //Z#324 Asia/Vientiane + "RU", //Z#325 Asia/Vladivostok + "RU", //Z#326 Asia/Yakutsk + "RU", //Z#327 Asia/Yekaterinburg + "AM", //Z#328 Asia/Yerevan + "PT", //Z#329 Atlantic/Azores + "BM", //Z#330 Atlantic/Bermuda + "ES", //Z#331 Atlantic/Canary + "CV", //Z#332 Atlantic/Cape_Verde + "FO", //Z#333 Atlantic/Faeroe + "FO", //Z#334 Atlantic/Faroe + "NO", //Z#335 Atlantic/Jan_Mayen + "PT", //Z#336 Atlantic/Madeira + "IS", //Z#337 Atlantic/Reykjavik + "GS", //Z#338 Atlantic/South_Georgia + "SH", //Z#339 Atlantic/St_Helena + "FK", //Z#340 Atlantic/Stanley + "AU", //Z#341 Australia/ACT + "AU", //Z#342 Australia/Adelaide + "AU", //Z#343 Australia/Brisbane + "AU", //Z#344 Australia/Broken_Hill + "AU", //Z#345 Australia/Canberra + "AU", //Z#346 Australia/Currie + "AU", //Z#347 Australia/Darwin + "AU", //Z#348 Australia/Eucla + "AU", //Z#349 Australia/Hobart + "AU", //Z#350 Australia/LHI + "AU", //Z#351 Australia/Lindeman + "AU", //Z#352 Australia/Lord_Howe + "AU", //Z#353 Australia/Melbourne + "AU", //Z#354 Australia/NSW + "AU", //Z#355 Australia/North + "AU", //Z#356 Australia/Perth + "AU", //Z#357 Australia/Queensland + "AU", //Z#358 Australia/South + "AU", //Z#359 Australia/Sydney + "AU", //Z#360 Australia/Tasmania + "AU", //Z#361 Australia/Victoria + "AU", //Z#362 Australia/West + "AU", //Z#363 Australia/Yancowinna + "BR", //Z#364 BET + "BD", //Z#365 BST + "BR", //Z#366 Brazil/Acre + "BR", //Z#367 Brazil/DeNoronha + "BR", //Z#368 Brazil/East + "BR", //Z#369 Brazil/West + "MZ", //Z#370 CAT + "001",//Z#371 CET + "CA", //Z#372 CNT + "US", //Z#373 CST + "001",//Z#374 CST6CDT + "CN", //Z#375 CTT + "CA", //Z#376 Canada/Atlantic + "CA", //Z#377 Canada/Central + "CA", //Z#378 Canada/East-Saskatchewan + "CA", //Z#379 Canada/Eastern + "CA", //Z#380 Canada/Mountain + "CA", //Z#381 Canada/Newfoundland + "CA", //Z#382 Canada/Pacific + "CA", //Z#383 Canada/Saskatchewan + "CA", //Z#384 Canada/Yukon + "CL", //Z#385 Chile/Continental + "CL", //Z#386 Chile/EasterIsland + "CU", //Z#387 Cuba + "KE", //Z#388 EAT + "FR", //Z#389 ECT + "001",//Z#390 EET + "001",//Z#391 EST + "001",//Z#392 EST5EDT + "EG", //Z#393 Egypt + "IE", //Z#394 Eire + "001",//Z#395 Etc/GMT + "001",//Z#396 Etc/GMT+0 + "001",//Z#397 Etc/GMT+1 + "001",//Z#398 Etc/GMT+10 + "001",//Z#399 Etc/GMT+11 + "001",//Z#400 Etc/GMT+12 + "001",//Z#401 Etc/GMT+2 + "001",//Z#402 Etc/GMT+3 + "001",//Z#403 Etc/GMT+4 + "001",//Z#404 Etc/GMT+5 + "001",//Z#405 Etc/GMT+6 + "001",//Z#406 Etc/GMT+7 + "001",//Z#407 Etc/GMT+8 + "001",//Z#408 Etc/GMT+9 + "001",//Z#409 Etc/GMT-0 + "001",//Z#410 Etc/GMT-1 + "001",//Z#411 Etc/GMT-10 + "001",//Z#412 Etc/GMT-11 + "001",//Z#413 Etc/GMT-12 + "001",//Z#414 Etc/GMT-13 + "001",//Z#415 Etc/GMT-14 + "001",//Z#416 Etc/GMT-2 + "001",//Z#417 Etc/GMT-3 + "001",//Z#418 Etc/GMT-4 + "001",//Z#419 Etc/GMT-5 + "001",//Z#420 Etc/GMT-6 + "001",//Z#421 Etc/GMT-7 + "001",//Z#422 Etc/GMT-8 + "001",//Z#423 Etc/GMT-9 + "001",//Z#424 Etc/GMT0 + "001",//Z#425 Etc/Greenwich + "001",//Z#426 Etc/UCT + "001",//Z#427 Etc/UTC + "001",//Z#428 Etc/Universal + "001",//Z#429 Etc/Unknown + "001",//Z#430 Etc/Zulu + "NL", //Z#431 Europe/Amsterdam + "AD", //Z#432 Europe/Andorra + "GR", //Z#433 Europe/Athens + "GB", //Z#434 Europe/Belfast + "RS", //Z#435 Europe/Belgrade + "DE", //Z#436 Europe/Berlin + "SK", //Z#437 Europe/Bratislava + "BE", //Z#438 Europe/Brussels + "RO", //Z#439 Europe/Bucharest + "HU", //Z#440 Europe/Budapest + "DE", //Z#441 Europe/Busingen + "MD", //Z#442 Europe/Chisinau + "DK", //Z#443 Europe/Copenhagen + "IE", //Z#444 Europe/Dublin + "GI", //Z#445 Europe/Gibraltar + "GG", //Z#446 Europe/Guernsey + "FI", //Z#447 Europe/Helsinki + "IM", //Z#448 Europe/Isle_of_Man + "TR", //Z#449 Europe/Istanbul + "JE", //Z#450 Europe/Jersey + "RU", //Z#451 Europe/Kaliningrad + "UA", //Z#452 Europe/Kiev + "PT", //Z#453 Europe/Lisbon + "SI", //Z#454 Europe/Ljubljana + "GB", //Z#455 Europe/London + "LU", //Z#456 Europe/Luxembourg + "ES", //Z#457 Europe/Madrid + "MT", //Z#458 Europe/Malta + "AX", //Z#459 Europe/Mariehamn + "BY", //Z#460 Europe/Minsk + "MC", //Z#461 Europe/Monaco + "RU", //Z#462 Europe/Moscow + "CY", //Z#463 Europe/Nicosia + "NO", //Z#464 Europe/Oslo + "FR", //Z#465 Europe/Paris + "ME", //Z#466 Europe/Podgorica + "CZ", //Z#467 Europe/Prague + "LV", //Z#468 Europe/Riga + "IT", //Z#469 Europe/Rome + "RU", //Z#470 Europe/Samara + "SM", //Z#471 Europe/San_Marino + "BA", //Z#472 Europe/Sarajevo + "RU", //Z#473 Europe/Simferopol + "MK", //Z#474 Europe/Skopje + "BG", //Z#475 Europe/Sofia + "SE", //Z#476 Europe/Stockholm + "EE", //Z#477 Europe/Tallinn + "AL", //Z#478 Europe/Tirane + "MD", //Z#479 Europe/Tiraspol + "UA", //Z#480 Europe/Uzhgorod + "LI", //Z#481 Europe/Vaduz + "VA", //Z#482 Europe/Vatican + "AT", //Z#483 Europe/Vienna + "LT", //Z#484 Europe/Vilnius + "RU", //Z#485 Europe/Volgograd + "PL", //Z#486 Europe/Warsaw + "HR", //Z#487 Europe/Zagreb + "UA", //Z#488 Europe/Zaporozhye + "CH", //Z#489 Europe/Zurich + "001",//Z#490 Factory + "GB", //Z#491 GB + "GB", //Z#492 GB-Eire + "001",//Z#493 GMT + "001",//Z#494 GMT+0 + "001",//Z#495 GMT-0 + "001",//Z#496 GMT0 + "001",//Z#497 Greenwich + "001",//Z#498 HST + "HK", //Z#499 Hongkong + "US", //Z#500 IET + "IN", //Z#501 IST + "IS", //Z#502 Iceland + "MG", //Z#503 Indian/Antananarivo + "IO", //Z#504 Indian/Chagos + "CX", //Z#505 Indian/Christmas + "CC", //Z#506 Indian/Cocos + "KM", //Z#507 Indian/Comoro + "TF", //Z#508 Indian/Kerguelen + "SC", //Z#509 Indian/Mahe + "MV", //Z#510 Indian/Maldives + "MU", //Z#511 Indian/Mauritius + "YT", //Z#512 Indian/Mayotte + "RE", //Z#513 Indian/Reunion + "IR", //Z#514 Iran + "IL", //Z#515 Israel + "JP", //Z#516 JST + "JM", //Z#517 Jamaica + "JP", //Z#518 Japan + "MH", //Z#519 Kwajalein + "LY", //Z#520 Libya + "001",//Z#521 MET + "WS", //Z#522 MIT + "001",//Z#523 MST + "001",//Z#524 MST7MDT + "MX", //Z#525 Mexico/BajaNorte + "MX", //Z#526 Mexico/BajaSur + "MX", //Z#527 Mexico/General + "AM", //Z#528 NET + "NZ", //Z#529 NST + "NZ", //Z#530 NZ + "NZ", //Z#531 NZ-CHAT + "US", //Z#532 Navajo + "PK", //Z#533 PLT + "US", //Z#534 PNT + "CN", //Z#535 PRC + "PR", //Z#536 PRT + "US", //Z#537 PST + "001",//Z#538 PST8PDT + "WS", //Z#539 Pacific/Apia + "NZ", //Z#540 Pacific/Auckland + "PG", //Z#541 Pacific/Bougainville + "NZ", //Z#542 Pacific/Chatham + "FM", //Z#543 Pacific/Chuuk + "CL", //Z#544 Pacific/Easter + "VU", //Z#545 Pacific/Efate + "KI", //Z#546 Pacific/Enderbury + "TK", //Z#547 Pacific/Fakaofo + "FJ", //Z#548 Pacific/Fiji + "TV", //Z#549 Pacific/Funafuti + "EC", //Z#550 Pacific/Galapagos + "PF", //Z#551 Pacific/Gambier + "SB", //Z#552 Pacific/Guadalcanal + "GU", //Z#553 Pacific/Guam + "US", //Z#554 Pacific/Honolulu + "UM", //Z#555 Pacific/Johnston + "KI", //Z#556 Pacific/Kiritimati + "FM", //Z#557 Pacific/Kosrae + "MH", //Z#558 Pacific/Kwajalein + "MH", //Z#559 Pacific/Majuro + "PF", //Z#560 Pacific/Marquesas + "UM", //Z#561 Pacific/Midway + "NR", //Z#562 Pacific/Nauru + "NU", //Z#563 Pacific/Niue + "NF", //Z#564 Pacific/Norfolk + "NC", //Z#565 Pacific/Noumea + "AS", //Z#566 Pacific/Pago_Pago + "PW", //Z#567 Pacific/Palau + "PN", //Z#568 Pacific/Pitcairn + "FM", //Z#569 Pacific/Pohnpei + "FM", //Z#570 Pacific/Ponape + "PG", //Z#571 Pacific/Port_Moresby + "CK", //Z#572 Pacific/Rarotonga + "MP", //Z#573 Pacific/Saipan + "AS", //Z#574 Pacific/Samoa + "PF", //Z#575 Pacific/Tahiti + "KI", //Z#576 Pacific/Tarawa + "TO", //Z#577 Pacific/Tongatapu + "FM", //Z#578 Pacific/Truk + "UM", //Z#579 Pacific/Wake + "WF", //Z#580 Pacific/Wallis + "FM", //Z#581 Pacific/Yap + "PL", //Z#582 Poland + "PT", //Z#583 Portugal + "TW", //Z#584 ROC + "KR", //Z#585 ROK + "SB", //Z#586 SST + "SG", //Z#587 Singapore + "001",//Z#588 SystemV/AST4 + "001",//Z#589 SystemV/AST4ADT + "001",//Z#590 SystemV/CST6 + "001",//Z#591 SystemV/CST6CDT + "001",//Z#592 SystemV/EST5 + "001",//Z#593 SystemV/EST5EDT + "001",//Z#594 SystemV/HST10 + "001",//Z#595 SystemV/MST7 + "001",//Z#596 SystemV/MST7MDT + "001",//Z#597 SystemV/PST8 + "001",//Z#598 SystemV/PST8PDT + "001",//Z#599 SystemV/YST9 + "001",//Z#600 SystemV/YST9YDT + "TR", //Z#601 Turkey + "001",//Z#602 UCT + "US", //Z#603 US/Alaska + "US", //Z#604 US/Aleutian + "US", //Z#605 US/Arizona + "US", //Z#606 US/Central + "US", //Z#607 US/East-Indiana + "US", //Z#608 US/Eastern + "US", //Z#609 US/Hawaii + "US", //Z#610 US/Indiana-Starke + "US", //Z#611 US/Michigan + "US", //Z#612 US/Mountain + "US", //Z#613 US/Pacific + "US", //Z#614 US/Pacific-New + "AS", //Z#615 US/Samoa + "001",//Z#616 UTC + "001",//Z#617 Universal + "VN", //Z#618 VST + "RU", //Z#619 W-SU + "001",//Z#620 WET + "001",//Z#621 Zulu + } +} diff --git a/intl/tzdata/SVN-INFO b/intl/tzdata/SVN-INFO new file mode 100644 index 000000000000..876a4af9eda7 --- /dev/null +++ b/intl/tzdata/SVN-INFO @@ -0,0 +1,10 @@ +Path: 44 +URL: https://ssl.icu-project.org/repos/icu/data/trunk/tzdata/icunew/2015f/44 +Relative URL: ^/data/trunk/tzdata/icunew/2015f/44 +Repository Root: https://ssl.icu-project.org/repos/icu +Repository UUID: 251d0590-4201-4cf1-90de-194747b24ca1 +Node Kind: directory +Last Changed Author: yoshito +Last Changed Rev: 37762 +Last Changed Date: 2015-08-12 20:21:44 +0000 (Wed, 12 Aug 2015) + diff --git a/intl/tzdata/files.txt b/intl/tzdata/files.txt new file mode 100644 index 000000000000..598618939f9f --- /dev/null +++ b/intl/tzdata/files.txt @@ -0,0 +1,5 @@ +# tzdata resources in icudt*.dat +zoneinfo64.res +windowsZones.res +timezoneTypes.res +metaZones.res diff --git a/intl/update-icu.sh b/intl/update-icu.sh index 9da23ef2719d..1120896d6c62 100755 --- a/intl/update-icu.sh +++ b/intl/update-icu.sh @@ -73,3 +73,6 @@ python ${topsrcdir}/js/src/tests/ecma_6/String/make-normalize-generateddata-inpu python `dirname $0`/icu_sources_data.py $topsrcdir hg addremove ${icu_dir} ${topsrcdir}/config/external/icu + +# Check local tzdata version. +`dirname $0`/update-tzdata.sh -c diff --git a/intl/update-tzdata.sh b/intl/update-tzdata.sh new file mode 100755 index 000000000000..666046ed52ef --- /dev/null +++ b/intl/update-tzdata.sh @@ -0,0 +1,166 @@ +#!/bin/sh +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +set -e + +# Usage: update-tzdata.sh +# E.g., for tzdata2016f: update-tzdata.sh 2016f + +# Ensure that $Date$ in the checked-out svn files expands timezone-agnostically, +# so that this script's behavior is consistent when run from any time zone. +export TZ=UTC + +# Also ensure SVN-INFO isn't localized. +export LANG=C + +# Path to icupkg executable, typically located at $ICU_DIR/bin/icupkg. +icu_pkg= +# Force updates even when current tzdata is newer than the requested version. +force=false +# Dry run, doesn't run 'svn export' and 'icupkg'. +dry=false +# Compare ICU and local tzdata versions (used by update-icu.sh). +check_version=false + +while getopts ce:fd opt +do + case "$opt" in + c) check_version=true;; + e) icu_pkg="$OPTARG";; + f) force=true;; + d) dry=true;; + \?) + echo >&2 "Usage: $0 [-e ] [-f] [-d] " + exit 1;; + esac +done +shift "$((OPTIND - 1))" + +if [ $# -ne 1 -a $check_version = false ]; then + echo >&2 "Usage: $0 [-e ] [-f] [-d] " + exit 1 +fi + +tzdata_version=$1 + +icudata_dir=`dirname "$0"`/../config/external/icu/data +icu_dir=`dirname "$0"`/icu +tzdata_dir=`dirname "$0"`/tzdata +tzdata_files="${tzdata_dir}"/files.txt +tzdata_version_dir="${tzdata_dir}"/${tzdata_version} +tzdata_url=https://ssl.icu-project.org/repos/icu/data/trunk/tzdata/icunew/${tzdata_version}/44/ +icu_tzdata_version=`grep --only-matching --perl-regexp --regexp="tz version:\s+\K.*$" "${icu_dir}"/source/data/misc/zoneinfo64.txt` +local_tzdata_version= +if [ -f "${tzdata_dir}"/SVN-INFO ]; then + local_tzdata_version=`grep --only-matching --perl-regexp --regexp="^URL: .*tzdata/icunew/\K[0-9a-z]+" "${tzdata_dir}"/SVN-INFO` +fi + +# Check ICU and current local tzdata versions. +if [ $check_version = true ]; then + if [ ! -z ${local_tzdata_version} ]; then + if [ ${local_tzdata_version} \> ${icu_tzdata_version} ]; then + echo >&2 "WARN: Local tzdata (${local_tzdata_version}) is newer than ICU tzdata (${icu_tzdata_version}), please run '$0 ${local_tzdata_version}'" + else + echo "INFO: ICU tzdata ${icu_tzdata_version} is newer than local tzdata (${local_tzdata_version})" + fi + else + echo "INFO: No local tzdata files found" + fi + exit 0 +fi + +# Find icu_pkg if not provided as an argument. +icu_pkg=${icu_pkg:-`which icupkg`} + +# Test if we can execute icupkg. +if [ ! -x "${icu_pkg}" ]; then + echo >&2 "ERROR: icupkg is not an executable" + exit 1 +fi + +# Check ICU tzdata version. +if [ ${icu_tzdata_version} \> ${tzdata_version} ]; then + if [ $force = false ]; then + echo >&2 "ERROR: ICU tzdata (${icu_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing" + exit 1 + fi +fi + +# Check tzdata version from last checkout. +if [ -n ${local_tzdata_version} -a ${local_tzdata_version} \> ${tzdata_version} ]; then + if [ $force = false ]; then + echo >&2 "ERROR: Local tzdata (${local_tzdata_version}) is newer than requested version ${tzdata_version}, use -f to force replacing" + exit 1 + fi +fi + +echo "INFO: Updating tzdata from ${local_tzdata_version:-$icu_tzdata_version} to ${tzdata_version}" + +# Search for ICU data files. +# Little endian data files. +icudata_file_le=`find "${icudata_dir}" -type f -name 'icudt*l.dat'` +if [ -f "${icudata_file_le}" ]; then + icudata_file_le=`cd "$(dirname "${icudata_file_le}")" && pwd -P`/`basename "${icudata_file_le}"` + echo "INFO: ICU data file (little endian): ${icudata_file_le}" +else + echo >&2 "ERROR: ICU data (little endian) file not found" + exit 1 +fi + +# Big endian data files. +# Optional until https://bugzilla.mozilla.org/show_bug.cgi?id=1264836 is fixed. +icudata_file_be=`find "${icudata_dir}" -type f -name 'icudt*b.dat'` +if [ -f "${icudata_file_be}" ]; then + icudata_file_be=`cd "$(dirname "${icudata_file_be}")" && pwd -P`/`basename "${icudata_file_be}"` + echo "INFO: ICU data file (big endian): ${icudata_file_be}" +else + echo "INFO: ICU data file (big endian) not found, skipping..." +fi + +# Retrieve tzdata from svn, unless already present. +if [ ! -d "$tzdata_version_dir" ]; then + if [ $dry = false ]; then + echo "INFO: Downloading tzdata${tzdata_version}" + svn export "${tzdata_url}" "${tzdata_version_dir}" + fi +else + echo "INFO: Skip downloading tzdata${tzdata_version}, directory already present" +fi + +# Record `svn info`, eliding the line that changes every time the entire ICU +# tzdata repository (not just the path within it we care about) receives a +# commit. +if [ $dry = false ]; then + svn info "${tzdata_url}" | grep --invert-match '^Revision: [[:digit:]]\+$' > "${tzdata_dir}"/SVN-INFO +fi + +# Update ICU data. +update_icu_data() { + set +e + + local type="$1" + local file="$2" + local cmd="${icu_pkg} --add ${tzdata_files} --sourcedir ${tzdata_version_dir}/${type} ${file}" + eval "${cmd}" + + local exit_status=$? + + if [ $exit_status -ne 0 ]; then + echo >&2 "ERROR: Error updating tzdata" + echo >&2 "ERROR: If you see an error message like 'format version 03.00 not supported',\n"\ + " ensure your icupkg version matches the current ICU version." + exit $exit_status + fi +} + +if [ $dry = false ]; then + update_icu_data "le" "${icudata_file_le}" + if [ -n "${icudata_file_be}" ]; then + update_icu_data "be" "${icudata_file_be}" + fi + + echo "INFO: Successfully updated tzdata!" + echo "INFO: Please run js/src/builtin/make_intl_data.py to update additional time zone files for SpiderMonkey." +fi diff --git a/js/public/RootingAPI.h b/js/public/RootingAPI.h index c843f50774fb..611dfe253393 100644 --- a/js/public/RootingAPI.h +++ b/js/public/RootingAPI.h @@ -144,14 +144,14 @@ template struct PersistentRootedMarker; } /* namespace gc */ -#define DECLARE_POINTER_COMPARISON_OPS(T) \ +#define DECLARE_POINTER_COMPARISON_OPS(T) \ bool operator==(const T& other) const { return get() == other; } \ bool operator!=(const T& other) const { return get() != other; } // Important: Return a reference so passing a Rooted, etc. to // something that takes a |const T&| is not a GC hazard. -#define DECLARE_POINTER_CONSTREF_OPS(T) \ - operator const T&() const { return get(); } \ +#define DECLARE_POINTER_CONSTREF_OPS(T) \ + operator const T&() const { return get(); } \ const T& operator->() const { return get(); } // Assignment operators on a base class are hidden by the implicitly defined @@ -167,7 +167,7 @@ struct PersistentRootedMarker; return *this; \ } \ -#define DELETE_ASSIGNMENT_OPS(Wrapper, T) \ +#define DELETE_ASSIGNMENT_OPS(Wrapper, T) \ template Wrapper& operator=(S) = delete; \ Wrapper& operator=(const Wrapper&) = delete; @@ -416,12 +416,25 @@ class TenuredHeap : public js::HeapBase return (bits & flag) != 0; } - T getPtr() const { return reinterpret_cast(bits & ~flagsMask); } + T unbarrieredGetPtr() const { return reinterpret_cast(bits & ~flagsMask); } uintptr_t getFlags() const { return bits & flagsMask; } + T getPtr() const { + T ptr = unbarrieredGetPtr(); + js::BarrierMethods::exposeToJS(ptr); + return ptr; + } + operator T() const { return getPtr(); } T operator->() const { return getPtr(); } + explicit operator bool() const { + return bool(js::BarrierMethods::asGCThingOrNull(unbarrieredGetPtr())); + } + explicit operator bool() { + return bool(js::BarrierMethods::asGCThingOrNull(unbarrieredGetPtr())); + } + TenuredHeap& operator=(T p) { setPtr(p); return *this; diff --git a/js/src/builtin/ReflectParse.cpp b/js/src/builtin/ReflectParse.cpp index 80360fdf9225..25777c121225 100644 --- a/js/src/builtin/ReflectParse.cpp +++ b/js/src/builtin/ReflectParse.cpp @@ -1877,7 +1877,7 @@ ASTSerializer::unop(ParseNodeKind kind, JSOp op) if (IsDeleteKind(kind)) return UNOP_DELETE; - if (kind == PNK_TYPEOFNAME || kind == PNK_TYPEOFEXPR) + if (IsTypeofKind(kind)) return UNOP_TYPEOF; switch (op) { diff --git a/js/src/builtin/make_intl_data.py b/js/src/builtin/make_intl_data.py index d15c61dc8c39..9ef0a29c6c5a 100755 --- a/js/src/builtin/make_intl_data.py +++ b/js/src/builtin/make_intl_data.py @@ -5,8 +5,13 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -""" Usage: make_intl_data.py [language-subtag-registry.txt] +""" Usage: + make_intl_data.py langtags [language-subtag-registry.txt] + make_intl_data.py tzdata --icu=$MOZ/intl/icu/source \\ + --icutz=$MOZ/intl/tzdata/tz2016f \\ + --version=2016f + Target "langtags": This script extracts information about mappings between deprecated and current BCP 47 language tags from the IANA Language Subtag Registry and converts it to JavaScript object definitions in IntlData.js. The definitions @@ -16,8 +21,28 @@ http://www.iana.org/assignments/language-subtag-registry and uses the syntax specified in http://tools.ietf.org/html/rfc5646#section-3 + + + Target "tzdata": + This script computes which time zone informations are not up-to-date in ICU + and provides the necessary mappings to workaround this problem. + http://bugs.icu-project.org/trac/ticket/12044 """ +from __future__ import print_function +import os +import re +import io +import codecs +import tarfile +import tempfile +import urllib2 +import urlparse +from contextlib import closing +from functools import partial +from itertools import chain, ifilter, ifilterfalse, imap, tee +from operator import attrgetter, itemgetter + def readRegistryRecord(registry): """ Yields the records of the IANA Language Subtag Registry as dictionaries. """ record = {} @@ -165,35 +190,433 @@ def writeLanguageTagData(intlData, fileDate, url, langTagMappings, langSubtagMap writeMappingsVar(intlData, extlangMappings, "extlangMappings", "Mappings from extlang subtags to preferred values", fileDate, url) +def updateLangTags(args): + """ Update the IntlData.js file. """ + url = args.url + out = args.out + filename = args.file -if __name__ == '__main__': - import codecs - import sys - import urllib2 + print("Arguments:") + print("\tDownload url: %s" % url) + print("\tLocal registry: %s" % filename) + print("\tOutput file: %s" % out) + print("") - url = "http://www.iana.org/assignments/language-subtag-registry" - if len(sys.argv) > 1: + if filename is not None: print("Always make sure you have the newest language-subtag-registry.txt!") - registry = codecs.open(sys.argv[1], "r", encoding="utf-8") + registry = codecs.open(filename, "r", encoding="utf-8") else: print("Downloading IANA Language Subtag Registry...") - reader = urllib2.urlopen(url) - text = reader.read().decode("utf-8") - reader.close() + with closing(urllib2.urlopen(url)) as reader: + text = reader.read().decode("utf-8") registry = codecs.open("language-subtag-registry.txt", "w+", encoding="utf-8") registry.write(text) registry.seek(0) print("Processing IANA Language Subtag Registry...") - data = readRegistry(registry) + with closing(registry) as reg: + data = readRegistry(reg) fileDate = data["fileDate"] langTagMappings = data["langTagMappings"] langSubtagMappings = data["langSubtagMappings"] extlangMappings = data["extlangMappings"] - registry.close() print("Writing Intl data...") - intlData = codecs.open("IntlData.js", "w", encoding="utf-8") - intlData.write("// Generated by make_intl_data.py. DO NOT EDIT.\n") - writeLanguageTagData(intlData, fileDate, url, langTagMappings, langSubtagMappings, extlangMappings) - intlData.close() + with codecs.open(out, "w", encoding="utf-8") as intlData: + intlData.write("// Generated by make_intl_data.py. DO NOT EDIT.\n") + writeLanguageTagData(intlData, fileDate, url, langTagMappings, langSubtagMappings, extlangMappings) + +def flines(filepath, encoding="utf-8"): + """ Open filepath and iterate over its content. """ + with io.open(filepath, mode="r", encoding=encoding) as f: + for line in f: + yield line + +class Zone: + """ Time zone with optional file name. """ + + def __init__(self, name, filename=""): + self.name = name + self.filename = filename + def __eq__(self, other): + return hasattr(other, "name") and self.name == other.name + def __cmp__(self, other): + if self.name == other.name: + return 0 + if self.name < other.name: + return -1 + return 1 + def __hash__(self): + return hash(self.name) + def __str__(self): + return self.name + def __repr__(self): + return self.name + +class TzDataDir: + """ tzdata source from a directory. """ + + def __init__(self, obj): + self.name = partial(os.path.basename, obj) + self.resolve = partial(os.path.join, obj) + self.basename = os.path.basename + self.isfile = os.path.isfile + self.listdir = partial(os.listdir, obj) + self.readlines = flines + +class TzDataFile: + """ tzdata source from a file (tar or gzipped). """ + + def __init__(self, obj): + self.name = lambda: os.path.splitext(os.path.splitext(os.path.basename(obj))[0])[0] + self.resolve = obj.getmember + self.basename = attrgetter("name") + self.isfile = tarfile.TarInfo.isfile + self.listdir = obj.getnames + self.readlines = partial(self._tarlines, obj) + + def _tarlines(self, tar, m): + with closing(tar.extractfile(m)) as f: + for line in codecs.EncodedFile(f, "utf-8"): + yield line + +def validateTimeZones(zones, links): + """ Validate the zone and link entries. """ + linkZones = set(links.viewkeys()) + intersect = linkZones.intersection(zones) + if intersect: + raise RuntimeError("Links also present in zones: %s" % intersect) + + zoneNames = set(z.name for z in zones) + linkTargets = set(links.viewvalues()) + if not linkTargets.issubset(zoneNames): + raise RuntimeError("Link targets not found: %s" % linkTargets.difference(zoneNames)) + +def readIANAFiles(tzdataDir, files): + """ Read all IANA time zone files from the given iterable. """ + nameSyntax = "[\w/+\-]+" + pZone = re.compile(r"Zone\s+(?P%s)\s+.*" % nameSyntax) + pLink = re.compile(r"Link\s+(?P%s)\s+(?P%s)(?:\s+#.*)?" % (nameSyntax, nameSyntax)) + + def createZone(line, fname): + match = pZone.match(line) + name = match.group("name") + return Zone(name, fname) + + def createLink(line, fname): + match = pLink.match(line) + (name, target) = match.group("name", "target") + return (Zone(name, fname), target) + + zones = set() + links = dict() + for filename in files: + filepath = tzdataDir.resolve(filename) + for line in tzdataDir.readlines(filepath): + if line.startswith("Zone"): + zones.add(createZone(line, filename)) + if line.startswith("Link"): + (link, target) = createLink(line, filename) + links[link] = target + + return (zones, links) + +def readIANATimeZones(tzdataDir): + """ Read the IANA time zone information from `tzdataDir`. """ + def partition(pred, it): + it1, it2 = tee(it) + return (ifilterfalse(pred, it1), ifilter(pred, it2)) + def isTzFile(d, m, f): + return m(f) and d.isfile(d.resolve(f)) + + backzoneFiles = {"backzone"} + (tzfiles, bkfiles) = partition( + backzoneFiles.__contains__, + ifilter(partial(isTzFile, tzdataDir, re.compile("^[a-z0-9]+$").match), tzdataDir.listdir()) + ) + + # Read zone and link infos. + (zones, links) = readIANAFiles(tzdataDir, tzfiles) + (backzones, backlinks) = readIANAFiles(tzdataDir, bkfiles) + + # Merge with backzone data. + zones |= backzones + zones.remove(Zone("Factory")) + links = {name: target for name, target in links.iteritems() if name not in backzones} + links.update(backlinks) + + validateTimeZones(zones, links) + + return (zones, links) + +def readICUResourceFile(filename): + """ Read an ICU resource file. + + Returns ("table", ) when a table starts/ends. + Returns ("entry", ) for each table entry. + """ + p = re.compile(r"^(?P.+)\{$") + q = re.compile(r'^(?P"?)(?P.+)(?P=quote)\{"(?P.+)"\}$') + + tables = [] + for line in flines(filename, "utf-8-sig"): + line = line.strip() + if line == "" or line.startswith("//"): + continue + m = p.match(line) + if m: + tables.append(m.group("name")) + yield ("table", m.group("name")) + continue + if line == "}": + yield ("table", tables.pop()) + continue + m = q.match(line) + if not m: + raise RuntimeError("unknown entry: %s" % line) + yield ("entry", (m.group("key"), m.group("value"))) + +def readICUTimeZones(icuTzDir): + """ Read the ICU time zone information from `icuTzDir`/timezoneTypes.txt + and returns the tuple (zones, links). + """ + inTypeMap = False + inTypeMapTimezone = False + inTypeAlias = False + inTypeAliasTimezone = False + toTimeZone = lambda name: Zone(name.replace(":", "/")) + + timezones = set() + aliases = dict() + for kind, value in readICUResourceFile(os.path.join(icuTzDir, "timezoneTypes.txt")): + if kind == "table": + if value == "typeMap": + inTypeMap = not inTypeMap + elif inTypeMap and value == "timezone": + inTypeMapTimezone = not inTypeMapTimezone + elif value == "typeAlias": + inTypeAlias = not inTypeAlias + elif inTypeAlias and value == "timezone": + inTypeAliasTimezone = not inTypeAliasTimezone + continue + (fst, snd) = value + if inTypeMapTimezone: + timezones.add(toTimeZone(fst)) + if inTypeAliasTimezone: + aliases[toTimeZone(fst)] = snd + + # Remove the ICU placeholder time zone "Etc/Unknown". + timezones.remove(Zone("Etc/Unknown")) + + validateTimeZones(timezones, aliases) + + return (timezones, aliases) + +def readICULegacyZones(icuDir): + """ Read the ICU legacy time zones from `icuTzDir`/tools/tzcode/icuzones + and returns the tuple (zones, links). + """ + tzdir = TzDataDir(os.path.join(icuDir, "tools/tzcode")) + (zones, links) = readIANAFiles(tzdir, ["icuzones"]) + + # Remove the ICU placeholder time zone "Etc/Unknown". + zones.remove(Zone("Etc/Unknown")) + + return (zones, links) + +def icuTzDataVersion(icuTzDir): + """ Read the ICU time zone version from `icuTzDir`/zoneinfo64.txt. """ + def searchInFile(pattern, f): + p = re.compile(pattern) + for line in flines(f, "utf-8-sig"): + m = p.search(line) + if m: + return m.group(1) + return None + + zoneinfo = os.path.join(icuTzDir, "zoneinfo64.txt") + if os.path.isfile(zoneinfo): + version = searchInFile("^//\s+tz version:\s+([0-9]{4}[a-z])$", zoneinfo) + else: + version = None + return version + +def findIncorrectICUZones(zones, links, timezones, aliases): + """ Find incorrect ICU zone entries. """ + isIANATimeZone = lambda zone: zone in zones or zone in links + isICUTimeZone = lambda zone: zone in timezones or zone in aliases + isICULink = lambda zone: zone in aliases + + # Zones which aren't present in ICU. + missingTimeZones = ((zone, "") for zone in zones if not isICUTimeZone(zone)) + + # Zones which are marked as links in ICU. + incorrectMapping = ((zone, aliases[zone]) for zone in zones if isICULink(zone)) + + # Zones which are only present in ICU? + removedTimeZones = [zone for zone in timezones if not isIANATimeZone(zone)] + if removedTimeZones: + raise RuntimeError("Removed zones? %s" % removedTimeZones) + + result = chain(missingTimeZones, incorrectMapping) + + # Remove unnecessary UTC mappings. + utcnames = ["Etc/UTC", "Etc/UCT", "Etc/GMT"] + result = ifilterfalse(lambda (zone, alias): zone.name in utcnames, result) + + return sorted(result, key=itemgetter(0)) + +def findIncorrectICULinks(zones, links, timezones, aliases): + """ Find incorrect ICU link entries. """ + isIANATimeZone = lambda zone: zone in zones or zone in links + isICUTimeZone = lambda zone: zone in timezones or zone in aliases + isICULink = lambda zone: zone in aliases + isICUZone = lambda zone: zone in timezones + + # Links which aren't present in ICU. + missingTimeZones = ((zone, target, "") for (zone, target) in links.iteritems() if not isICUTimeZone(zone)) + + # Links which have a different target in ICU. + incorrectMapping = ((zone, target, aliases[zone]) for (zone, target) in links.iteritems() if isICULink(zone) and target != aliases[zone]) + + # Links which are zones in ICU. + incorrectMapping2 = ((zone, target, zone.name) for (zone, target) in links.iteritems() if isICUZone(zone)) + + # Links which are only present in ICU? + removedTimeZones = [zone for zone in aliases.iterkeys() if not isIANATimeZone(zone)] + if removedTimeZones: + raise RuntimeError("Removed zones? %s" % removedTimeZones) + + result = chain(missingTimeZones, incorrectMapping, incorrectMapping2) + + # Remove unnecessary UTC mappings. + utcnames = ["Etc/UTC", "Etc/UCT", "Etc/GMT"] + result = ifilterfalse(lambda (zone, target, alias): target in utcnames and alias in utcnames, result) + + return sorted(result, key=itemgetter(0)) + +def processTimeZones(tzdataDir, icuDir, icuTzDir, tzversion, out): + """ Read the time zone info and create a new IntlTzData.js file. """ + print("Processing tzdata mapping...") + (zones, links) = readIANATimeZones(tzdataDir) + (timezones, aliases) = readICUTimeZones(icuTzDir) + (legacyzones, legacylinks) = readICULegacyZones(icuDir) + icuversion = icuTzDataVersion(icuTzDir) + + incorrectZones = findIncorrectICUZones(zones, links, timezones, aliases) + if not incorrectZones: + print("<<< No incorrect ICU time zones found, please update Intl.js! >>>") + print("<<< Maybe http://bugs.icu-project.org/trac/ticket/12044 was fixed? >>>") + + incorrectLinks = findIncorrectICULinks(zones, links, timezones, aliases) + if not incorrectLinks: + print("<<< No incorrect ICU time zone links found, please update Intl.js! >>>") + print("<<< Maybe http://bugs.icu-project.org/trac/ticket/12044 was fixed? >>>") + + print("Writing Intl tzdata file...") + with io.open(out, mode="w", encoding="utf-8", newline="") as f: + println = partial(print, file=f) + + println(u"// Generated by make_intl_data.py. DO NOT EDIT.") + println(u"// tzdata version = %s" % tzversion) + println(u"// ICU tzdata version = %s" % icuversion) + println(u"") + + println(u"// Format:") + println(u'// "ZoneName": true // ICU-Name [time zone file]') + println(u"var tzZoneNamesNonICU = {") + for (zone, alias) in incorrectZones: + println(u' "%s": true, // %s [%s]' % (zone, alias, zone.filename)) + println(u"};") + println(u"") + + println(u"// Format:") + println(u'// "LinkName": "Target" // ICU-Target [time zone file]') + println(u"var tzLinkNamesNonICU = {") + for (zone, target, alias) in incorrectLinks: + println(u' "%s": "%s", // %s [%s]' % (zone, target, alias, zone.filename)) + println(u"};") + println(u"") + + println(u"// Legacy ICU time zones, these are not valid IANA time zone names. We also") + println(u"// disallow the old and deprecated System V time zones.") + println(u"// http://source.icu-project.org/repos/icu/icu/trunk/source/tools/tzcode/icuzones") + println(u"var legacyICUTimeZones = {") + for zone in sorted(legacylinks.keys()) + sorted(list(legacyzones)): + println(u' "%s": true,' % zone) + println(u"};") + +def updateTzdata(args): + """ Update the IntlTzData.js file. """ + version = args.version + if not re.match("^([0-9]{4}[a-z])$", version): + raise RuntimeError("illegal version: %s" % version) + url = args.url + if url is None: + url = "https://www.iana.org/time-zones/repository/releases/tzdata%s.tar.gz" % version + tzDir = args.tz + if tzDir is not None and not (os.path.isdir(tzDir) or os.path.isfile(tzDir)): + raise RuntimeError("not a directory or file: %s" % tzDir) + icuDir = args.icu + if not os.path.isdir(icuDir): + raise RuntimeError("not a directory: %s" % icuDir) + icuTzDir = args.icutz + if icuTzDir is None: + icuTzDir = os.path.join(icuDir, "data/misc") + if not os.path.isdir(icuTzDir): + raise RuntimeError("not a directory: %s" % icuTzDir) + out = args.out + + print("Arguments:") + print("\ttzdata version: %s" % version) + print("\ttzdata URL: %s" % url) + print("\ttzdata directory|file: %s" % tzDir) + print("\tICU directory: %s" % icuDir) + print("\tICU timezone directory: %s" % icuTzDir) + print("\tOutput file: %s" % out) + print("") + + def updateFrom(f): + if os.path.isfile(f) and tarfile.is_tarfile(f): + with tarfile.open(f, "r:*") as tar: + processTimeZones(TzDataFile(tar), icuDir, icuTzDir, version, out) + elif os.path.isdir(f): + processTimeZones(TzDataDir(f), icuDir, icuTzDir, version, out) + else: + raise RuntimError("unknown format") + + if tzDir is None: + print("Downloading tzdata file...") + with closing(urllib2.urlopen(url)) as tzfile: + fname = urlparse.urlsplit(tzfile.geturl()).path.split('/')[-1] + with tempfile.NamedTemporaryFile(suffix=fname) as tztmpfile: + print("File stored in %s" % tztmpfile.name) + tztmpfile.write(tzfile.read()) + tztmpfile.flush() + updateFrom(tztmpfile.name) + else: + updateFrom(tzDir) + +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser(description="Update intl data.") + subparsers = parser.add_subparsers(help="Select update mode") + + parser_tags = subparsers.add_parser("langtags", help="Update language-subtag-registry", formatter_class=argparse.ArgumentDefaultsHelpFormatter) + parser_tags.add_argument("--url", metavar="URL", default="http://www.iana.org/assignments/language-subtag-registry", help="Download url for language-subtag-registry.txt") + parser_tags.add_argument("--out", default="IntlData.js", help="Output file") + parser_tags.add_argument("file", nargs="?", help="Local language-subtag-registry.txt file, if omitted uses ") + parser_tags.set_defaults(func=updateLangTags) + + parser_tz = subparsers.add_parser("tzdata", help="Update tzdata") + parser_tz.add_argument("--icu", metavar="ICU", required=True, help="ICU source directory") + parser_tz.add_argument("--icutz", help="ICU timezone directory, defaults to /data/misc") + parser_tz.add_argument("--tz", help="Local tzdata directory or file, if omitted uses ") + parser_tz.add_argument("--url", metavar="URL", help="Download url for tzdata, defaults to \"https://www.iana.org/time-zones/repository/releases/tzdata.tar.gz\"") + parser_tz.add_argument("--version", metavar="VERSION", required=True, help="tzdata version") + parser_tz.add_argument("--out", default="IntlTzData.js", help="Output file, defaults to \"IntlTzData.js\"") + parser_tz.set_defaults(func=updateTzdata) + + args = parser.parse_args() + args.func(args) diff --git a/js/src/ds/MemoryProtectionExceptionHandler.cpp b/js/src/ds/MemoryProtectionExceptionHandler.cpp index 5c65523ccfee..cba958c21781 100644 --- a/js/src/ds/MemoryProtectionExceptionHandler.cpp +++ b/js/src/ds/MemoryProtectionExceptionHandler.cpp @@ -170,7 +170,7 @@ VectoredExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) // want to annotate the crash to make it stand out from the crowd. if (sProtectedRegions.isProtected(address)) { ReportCrashIfDebug("Hit MOZ_CRASH(Tried to access a protected region!)\n"); - MOZ_CRASH_ANNOTATE("Tried to access a protected region!"); + MOZ_CRASH_ANNOTATE("MOZ_CRASH(Tried to access a protected region!)"); } } } @@ -240,7 +240,7 @@ UnixExceptionHandler(int signum, siginfo_t* info, void* context) // want to annotate the crash to make it stand out from the crowd. if (sProtectedRegions.isProtected(address)) { ReportCrashIfDebug("Hit MOZ_CRASH(Tried to access a protected region!)\n"); - MOZ_CRASH_ANNOTATE("Tried to access a protected region!"); + MOZ_CRASH_ANNOTATE("MOZ_CRASH(Tried to access a protected region!)"); } } } @@ -560,7 +560,7 @@ MachExceptionHandler() // want to annotate the crash to make it stand out from the crowd. if (sProtectedRegions.isProtected(address)) { ReportCrashIfDebug("Hit MOZ_CRASH(Tried to access a protected region!)\n"); - MOZ_CRASH_ANNOTATE("Tried to access a protected region!"); + MOZ_CRASH_ANNOTATE("MOZ_CRASH(Tried to access a protected region!)"); } // Forward to the previous handler which may be a debugger, the unix diff --git a/js/src/frontend/BytecodeEmitter.cpp b/js/src/frontend/BytecodeEmitter.cpp index c854b098384f..cb9d5ebcc63d 100644 --- a/js/src/frontend/BytecodeEmitter.cpp +++ b/js/src/frontend/BytecodeEmitter.cpp @@ -4513,6 +4513,76 @@ BytecodeEmitter::emitDestructuringOpsArrayHelper(ParseNode* pattern, Destructuri MOZ_ASSERT(pattern->isArity(PN_LIST)); MOZ_ASSERT(this->stackDepth != 0); + // Here's pseudo code for |let [a, b, , c=y, ...d] = x;| + // + // let x, y; + // let a, b, c, d; + // let tmp, done, iter, result; // stack values + // + // iter = x[Symbol.iterator](); + // + // // ==== emitted by loop for a ==== + // result = iter.next(); + // done = result.done; + // + // if (done) { + // a = undefined; + // + // result = undefined; + // done = true; + // } else { + // a = result.value; + // + // // Do next element's .next() and .done access here + // result = iter.next(); + // done = result.done; + // } + // + // // ==== emitted by loop for b ==== + // if (done) { + // b = undefined; + // + // result = undefined; + // done = true; + // } else { + // b = result.value; + // + // result = iter.next(); + // done = result.done; + // } + // + // // ==== emitted by loop for elision ==== + // if (done) { + // result = undefined + // done = true + // } else { + // result.value; + // + // result = iter.next(); + // done = result.done; + // } + // + // // ==== emitted by loop for c ==== + // if (done) { + // c = y; + // } else { + // tmp = result.value; + // if (tmp === undefined) + // tmp = y; + // c = tmp; + // + // // Don't do next element's .next() and .done access if + // // this is the last non-spread element. + // } + // + // // ==== emitted by loop for d ==== + // if (done) { + // // Assing empty array when completed + // d = []; + // } else { + // d = [...iter]; + // } + /* * Use an iterator to destructure the RHS, instead of index lookup. We * must leave the *original* value on the stack. @@ -4524,20 +4594,37 @@ BytecodeEmitter::emitDestructuringOpsArrayHelper(ParseNode* pattern, Destructuri bool needToPopIterator = true; for (ParseNode* member = pattern->pn_head; member; member = member->pn_next) { - /* - * Now push the property name currently being matched, which is the - * current property name "label" on the left of a colon in the object - * initializer. - */ - ParseNode* pndefault = nullptr; - ParseNode* elem = member; - if (elem->isKind(PNK_ASSIGN)) { - pndefault = elem->pn_right; - elem = elem->pn_left; - } + bool isHead = member == pattern->pn_head; + if (member->isKind(PNK_SPREAD)) { + JumpList beq; + JumpList end; + unsigned noteIndex = -1; + if (!isHead) { + // If spread is not the first element of the pattern, + // iterator can already be completed. + if (!newSrcNote(SRC_IF_ELSE, ¬eIndex)) + return false; + if (!emitJump(JSOP_IFEQ, &beq)) // ... OBJ? ITER + return false; - if (elem->isKind(PNK_SPREAD)) { - /* Create a new array with the rest of the iterator */ + int32_t depth = stackDepth; + if (!emit1(JSOP_POP)) // ... OBJ? + return false; + if (!emitUint32Operand(JSOP_NEWARRAY, 0)) // ... OBJ? ARRAY + return false; + + if (!emitDestructuringLHS(member, flav)) // ... OBJ? + return false; + + if (!emitJump(JSOP_GOTO, &end)) + return false; + if (!emitJumpTargetAndPatch(beq)) + return false; + stackDepth = depth; + } + + // If iterator is not completed, create a new array with the rest + // of the iterator. if (!emitUint32Operand(JSOP_NEWARRAY, 0)) // ... OBJ? ITER ARRAY return false; if (!emitNumberOp(0)) // ... OBJ? ITER ARRAY INDEX @@ -4546,68 +4633,136 @@ BytecodeEmitter::emitDestructuringOpsArrayHelper(ParseNode* pattern, Destructuri return false; if (!emit1(JSOP_POP)) // ... OBJ? ARRAY return false; + if (!emitDestructuringLHS(member, flav)) // ... OBJ? + return false; + + if (!isHead) { + if (!emitJumpTargetAndPatch(end)) + return false; + if (!setSrcNoteOffset(noteIndex, 0, end.offset - beq.offset)) + return false; + } needToPopIterator = false; + MOZ_ASSERT(!member->pn_next); + break; + } + + ParseNode* pndefault = nullptr; + ParseNode* subpattern = member; + if (subpattern->isKind(PNK_ASSIGN)) { + pndefault = subpattern->pn_right; + subpattern = subpattern->pn_left; + } + + bool isElision = subpattern->isKind(PNK_ELISION); + bool hasNextNonSpread = member->pn_next && !member->pn_next->isKind(PNK_SPREAD); + bool hasNextSpread = member->pn_next && member->pn_next->isKind(PNK_SPREAD); + + MOZ_ASSERT(!subpattern->isKind(PNK_SPREAD)); + + auto emitNext = [pattern](ExclusiveContext* cx, BytecodeEmitter* bce) { + if (!bce->emit1(JSOP_DUP)) // ... OBJ? ITER ITER + return false; + if (!bce->emitIteratorNext(pattern)) // ... OBJ? ITER RESULT + return false; + if (!bce->emit1(JSOP_DUP)) // ... OBJ? ITER RESULT RESULT + return false; + if (!bce->emitAtomOp(cx->names().done, JSOP_GETPROP)) // ... OBJ? ITER RESULT DONE? + return false; + return true; + }; + + if (isHead) { + if (!emitNext(cx, this)) // ... OBJ? ITER RESULT DONE? + return false; + } + + unsigned noteIndex; + if (!newSrcNote(SRC_IF_ELSE, ¬eIndex)) + return false; + JumpList beq; + if (!emitJump(JSOP_IFEQ, &beq)) // ... OBJ? ITER RESULT + return false; + + int32_t depth = stackDepth; + if (!emit1(JSOP_POP)) // ... OBJ? ITER + return false; + if (pndefault) { + // Emit only pndefault tree here, as undefined check in emitDefault + // should always be true. + if (!emitConditionallyExecutedTree(pndefault)) // ... OBJ? ITER VALUE + return false; } else { - if (!emit1(JSOP_DUP)) // ... OBJ? ITER ITER + if (!isElision) { + if (!emit1(JSOP_UNDEFINED)) // ... OBJ? ITER UNDEFINED + return false; + if (!emit1(JSOP_NOP_DESTRUCTURING)) + return false; + } + } + if (!isElision) { + if (!emitDestructuringLHS(subpattern, flav)) // ... OBJ? ITER return false; - if (!emitIteratorNext(pattern)) // ... OBJ? ITER RESULT - return false; - if (!emit1(JSOP_DUP)) // ... OBJ? ITER RESULT RESULT - return false; - if (!emitAtomOp(cx->names().done, JSOP_GETPROP)) // ... OBJ? ITER RESULT DONE? - return false; - - // Emit (result.done ? undefined : result.value) - // This is mostly copied from emitConditionalExpression, except that this code - // does not push new values onto the stack. - unsigned noteIndex; - if (!newSrcNote(SRC_COND, ¬eIndex)) - return false; - JumpList beq; - if (!emitJump(JSOP_IFEQ, &beq)) - return false; - + } else if (pndefault) { if (!emit1(JSOP_POP)) // ... OBJ? ITER return false; - if (!emit1(JSOP_UNDEFINED)) // ... OBJ? ITER UNDEFINED + } + + // Setup next element's result when the iterator is done. + if (hasNextNonSpread) { + if (!emit1(JSOP_UNDEFINED)) // ... OBJ? ITER RESULT return false; if (!emit1(JSOP_NOP_DESTRUCTURING)) return false; - - /* Jump around else, fixup the branch, emit else, fixup jump. */ - JumpList jmp; - if (!emitJump(JSOP_GOTO, &jmp)) + if (!emit1(JSOP_TRUE)) // ... OBJ? ITER RESULT DONE? return false; - if (!emitJumpTargetAndPatch(beq)) - return false; - - if (!emitAtomOp(cx->names().value, JSOP_GETPROP)) // ... OBJ? ITER VALUE - return false; - - if (!emitJumpTargetAndPatch(jmp)) - return false; - if (!setSrcNoteOffset(noteIndex, 0, jmp.offset - beq.offset)) + } else if (hasNextSpread) { + if (!emit1(JSOP_TRUE)) // ... OBJ? ITER DONE? return false; } - if (pndefault && !emitDefault(pndefault)) + JumpList end; + if (!emitJump(JSOP_GOTO, &end)) + return false; + if (!emitJumpTargetAndPatch(beq)) return false; - // Destructure into the pattern the element contains. - ParseNode* subpattern = elem; - if (subpattern->isKind(PNK_ELISION)) { - // The value destructuring into an elision just gets ignored. - if (!emit1(JSOP_POP)) // ... OBJ? ITER + stackDepth = depth; + if (!emitAtomOp(cx->names().value, JSOP_GETPROP)) // ... OBJ? ITER VALUE + return false; + + if (pndefault) { + if (!emitDefault(pndefault)) // ... OBJ? ITER VALUE return false; - continue; } - if (!emitDestructuringLHS(subpattern, flav)) + if (!isElision) { + if (!emitDestructuringLHS(subpattern, flav)) // ... OBJ? ITER + return false; + } else { + if (!emit1(JSOP_POP)) // ... OBJ? ITER + return false; + } + + // Setup next element's result when the iterator is not done. + if (hasNextNonSpread) { + if (!emitNext(cx, this)) // ... OBJ? ITER RESULT DONE? + return false; + } else if (hasNextSpread) { + if (!emit1(JSOP_FALSE)) // ... OBJ? ITER DONE? + return false; + } + + if (!emitJumpTargetAndPatch(end)) + return false; + if (!setSrcNoteOffset(noteIndex, 0, end.offset - beq.offset)) return false; } - if (needToPopIterator && !emit1(JSOP_POP)) - return false; + if (needToPopIterator) { + if (!emit1(JSOP_POP)) // ... OBJ? + return false; + } return true; } @@ -6674,13 +6829,14 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) RootedFunction fun(cx, funbox->function()); RootedAtom name(cx, fun->name()); MOZ_ASSERT_IF(fun->isInterpretedLazy(), fun->lazyScript()); + MOZ_ASSERT_IF(pn->isOp(JSOP_FUNWITHPROTO), needsProto); /* * Set the |wasEmitted| flag in the funbox once the function has been * emitted. Function definitions that need hoisting to the top of the * function will be seen by emitFunction in two places. */ - if (funbox->wasEmitted) { + if (funbox->wasEmitted && pn->functionIsHoisted()) { // Annex B block-scoped functions are hoisted like any other // block-scoped function to the top of their scope. When their // definitions are seen for the second time, we need to emit the @@ -6804,7 +6960,7 @@ BytecodeEmitter::emitFunction(ParseNode* pn, bool needsProto) } if (needsProto) { - MOZ_ASSERT(pn->getOp() == JSOP_LAMBDA); + MOZ_ASSERT(pn->getOp() == JSOP_FUNWITHPROTO || pn->getOp() == JSOP_LAMBDA); pn->setOp(JSOP_FUNWITHPROTO); } return emitIndex32(pn->getOp(), index); @@ -9651,6 +9807,15 @@ CGConstList::finish(ConstArray* array) array->vector[i] = list[i]; } +bool +CGObjectList::isAdded(ObjectBox* objbox) +{ + // An objbox added to CGObjectList as non-first element has non-null + // emitLink member. The first element has null emitLink. + // Check for firstbox to cover the first element. + return objbox->emitLink || objbox == firstbox; +} + /* * Find the index of the given object for code generator. * @@ -9662,9 +9827,15 @@ CGConstList::finish(ConstArray* array) unsigned CGObjectList::add(ObjectBox* objbox) { - MOZ_ASSERT(!objbox->emitLink); + if (isAdded(objbox)) + return indexOf(objbox->object); + objbox->emitLink = lastbox; lastbox = objbox; + + // See the comment in CGObjectList::isAdded. + if (!firstbox) + firstbox = objbox; return length++; } diff --git a/js/src/frontend/BytecodeEmitter.h b/js/src/frontend/BytecodeEmitter.h index 74bc1297ef2e..9e6a4d73184a 100644 --- a/js/src/frontend/BytecodeEmitter.h +++ b/js/src/frontend/BytecodeEmitter.h @@ -43,10 +43,12 @@ class CGConstList { struct CGObjectList { uint32_t length; /* number of emitted so far objects */ + ObjectBox* firstbox; /* first emitted object */ ObjectBox* lastbox; /* last emitted object */ - CGObjectList() : length(0), lastbox(nullptr) {} + CGObjectList() : length(0), firstbox(nullptr), lastbox(nullptr) {} + bool isAdded(ObjectBox* objbox); unsigned add(ObjectBox* objbox); unsigned indexOf(JSObject* obj); void finish(ObjectArray* array); diff --git a/js/src/frontend/FullParseHandler.h b/js/src/frontend/FullParseHandler.h index b2a2f66c3b86..ac3d8e441957 100644 --- a/js/src/frontend/FullParseHandler.h +++ b/js/src/frontend/FullParseHandler.h @@ -226,6 +226,21 @@ class FullParseHandler return new_(kind, op, pos, kid); } + ParseNode* newUpdate(ParseNodeKind kind, uint32_t begin, ParseNode* kid) { + TokenPos pos(begin, kid->pn_pos.end); + return new_(kind, JSOP_NOP, pos, kid); + } + + ParseNode* newSpread(uint32_t begin, ParseNode* kid) { + TokenPos pos(begin, kid->pn_pos.end); + return new_(PNK_SPREAD, JSOP_NOP, pos, kid); + } + + ParseNode* newArrayPush(uint32_t begin, ParseNode* kid) { + TokenPos pos(begin, kid->pn_pos.end); + return new_(PNK_ARRAYPUSH, JSOP_ARRAYPUSH, pos, kid); + } + ParseNode* newBinary(ParseNodeKind kind, JSOp op = JSOP_NOP) { return new_(kind, op, pos(), (ParseNode*) nullptr, (ParseNode*) nullptr); } @@ -707,6 +722,15 @@ class FullParseHandler return false; } + bool isUnparenthesizedUnaryExpression(ParseNode* node) { + if (!node->isInParens()) { + ParseNodeKind kind = node->getKind(); + return kind == PNK_VOID || kind == PNK_NOT || kind == PNK_BITNOT || kind == PNK_POS || + kind == PNK_NEG || IsTypeofKind(kind) || IsDeleteKind(kind); + } + return false; + } + bool isReturnStatement(ParseNode* node) { return node->isKind(PNK_RETURN); } diff --git a/js/src/frontend/ParseNode.h b/js/src/frontend/ParseNode.h index f73350eef065..e1df62d7f040 100644 --- a/js/src/frontend/ParseNode.h +++ b/js/src/frontend/ParseNode.h @@ -194,6 +194,12 @@ IsDeleteKind(ParseNodeKind kind) return PNK_DELETENAME <= kind && kind <= PNK_DELETEEXPR; } +inline bool +IsTypeofKind(ParseNodeKind kind) +{ + return PNK_TYPEOFNAME <= kind && kind <= PNK_TYPEOFEXPR; +} + /* * Label Variant Members * ----- ------- ------- @@ -357,7 +363,6 @@ IsDeleteKind(ParseNodeKind kind) * PNK_DELETENAME unary pn_kid: PNK_NAME expr * PNK_DELETEPROP unary pn_kid: PNK_DOT expr * PNK_DELETEELEM unary pn_kid: PNK_ELEM expr - * PNK_DELETESUPERELEM unary pn_kid: PNK_SUPERELEM expr * PNK_DELETEEXPR unary pn_kid: MEMBER expr that's evaluated, then the * overall delete evaluates to true; can't be a kind * for a more-specific PNK_DELETE* unless constant @@ -630,12 +635,14 @@ class ParseNode MOZ_ASSERT(pn_arity == PN_CODE && getKind() == PNK_FUNCTION); MOZ_ASSERT(isOp(JSOP_LAMBDA) || // lambda, genexpr isOp(JSOP_LAMBDA_ARROW) || // arrow function + isOp(JSOP_FUNWITHPROTO) || // already emitted lambda with needsProto isOp(JSOP_DEFFUN) || // non-body-level function statement isOp(JSOP_NOP) || // body-level function stmt in global code isOp(JSOP_GETLOCAL) || // body-level function stmt in function code isOp(JSOP_GETARG) || // body-level function redeclaring formal isOp(JSOP_INITLEXICAL)); // block-level function stmt - return !isOp(JSOP_LAMBDA) && !isOp(JSOP_LAMBDA_ARROW) && !isOp(JSOP_DEFFUN); + return !isOp(JSOP_LAMBDA) && !isOp(JSOP_LAMBDA_ARROW) && + !isOp(JSOP_FUNWITHPROTO) && !isOp(JSOP_DEFFUN); } /* diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index 91969fbc2a57..5693b6ed9038 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -2571,7 +2571,7 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn TokenKind tt; if (!tokenStream.peekToken(&tt, TokenStream::Operand)) return false; - if (tt == TOK_NAME) + if (tt == TOK_NAME || tt == TOK_YIELD) parenFreeArrow = true; else modifier = TokenStream::Operand; @@ -2626,7 +2626,7 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn TokenKind tt; if (!tokenStream.getToken(&tt, TokenStream::Operand)) return false; - MOZ_ASSERT_IF(parenFreeArrow, tt == TOK_NAME); + MOZ_ASSERT_IF(parenFreeArrow, tt == TOK_NAME || tt == TOK_YIELD); switch (tt) { case TOK_LB: case TOK_LC: { @@ -2746,6 +2746,15 @@ Parser::functionArguments(YieldHandling yieldHandling, FunctionSyn return false; if (!matched) break; + + if (!hasRest) { + if (!tokenStream.peekToken(&tt, TokenStream::Operand)) + return null(); + if (tt == TOK_RP) { + tokenStream.addModifierException(TokenStream::NoneIsOperand); + break; + } + } } if (!parenFreeArrow) { @@ -3013,8 +3022,8 @@ Parser::functionDefinition(InHandling inHandling, YieldHandling yi // reparse a function due to failed syntax parsing and encountering new // "use foo" directives. while (true) { - if (trySyntaxParseInnerFunction(pn, fun, inHandling, kind, generatorKind, tryAnnexB, - directives, &newDirectives)) + if (trySyntaxParseInnerFunction(pn, fun, inHandling, yieldHandling, kind, generatorKind, + tryAnnexB, directives, &newDirectives)) { break; } @@ -3042,6 +3051,7 @@ template <> bool Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunction fun, InHandling inHandling, + YieldHandling yieldHandling, FunctionSyntaxKind kind, GeneratorKind generatorKind, bool tryAnnexB, @@ -3079,7 +3089,7 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct funbox->initWithEnclosingParseContext(pc, kind); if (!parser->innerFunction(SyntaxParseHandler::NodeGeneric, pc, funbox, inHandling, - kind, generatorKind, inheritedDirectives, newDirectives)) + yieldHandling, kind, inheritedDirectives, newDirectives)) { if (parser->hadAbortedSyntaxParse()) { // Try again with a full parse. UsedNameTracker needs to be @@ -3105,7 +3115,7 @@ Parser::trySyntaxParseInnerFunction(ParseNode* pn, HandleFunct } while (false); // We failed to do a syntax parse above, so do the full parse. - return innerFunction(pn, pc, fun, inHandling, kind, generatorKind, tryAnnexB, + return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, tryAnnexB, inheritedDirectives, newDirectives); } @@ -3113,6 +3123,7 @@ template <> bool Parser::trySyntaxParseInnerFunction(Node pn, HandleFunction fun, InHandling inHandling, + YieldHandling yieldHandling, FunctionSyntaxKind kind, GeneratorKind generatorKind, bool tryAnnexB, @@ -3120,15 +3131,15 @@ Parser::trySyntaxParseInnerFunction(Node pn, HandleFunction Directives* newDirectives) { // This is already a syntax parser, so just parse the inner function. - return innerFunction(pn, pc, fun, inHandling, kind, generatorKind, tryAnnexB, + return innerFunction(pn, pc, fun, inHandling, yieldHandling, kind, generatorKind, tryAnnexB, inheritedDirectives, newDirectives); } template bool Parser::innerFunction(Node pn, ParseContext* outerpc, FunctionBox* funbox, - InHandling inHandling, FunctionSyntaxKind kind, - GeneratorKind generatorKind, Directives inheritedDirectives, + InHandling inHandling, YieldHandling yieldHandling, + FunctionSyntaxKind kind, Directives inheritedDirectives, Directives* newDirectives) { // Note that it is possible for outerpc != this->pc, as we may be @@ -3141,7 +3152,6 @@ Parser::innerFunction(Node pn, ParseContext* outerpc, FunctionBox* if (!funpc.init()) return false; - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; if (!functionFormalParametersAndBody(inHandling, yieldHandling, pn, kind)) return false; @@ -3151,9 +3161,10 @@ Parser::innerFunction(Node pn, ParseContext* outerpc, FunctionBox* template bool Parser::innerFunction(Node pn, ParseContext* outerpc, HandleFunction fun, - InHandling inHandling, FunctionSyntaxKind kind, - GeneratorKind generatorKind, bool tryAnnexB, - Directives inheritedDirectives, Directives* newDirectives) + InHandling inHandling, YieldHandling yieldHandling, + FunctionSyntaxKind kind, GeneratorKind generatorKind, + bool tryAnnexB, Directives inheritedDirectives, + Directives* newDirectives) { // Note that it is possible for outerpc != this->pc, as we may be // attempting to syntax parse an inner function from an outer full @@ -3165,8 +3176,8 @@ Parser::innerFunction(Node pn, ParseContext* outerpc, HandleFuncti return false; funbox->initWithEnclosingParseContext(outerpc, kind); - return innerFunction(pn, outerpc, funbox, inHandling, kind, generatorKind, - inheritedDirectives, newDirectives); + return innerFunction(pn, outerpc, funbox, inHandling, yieldHandling, kind, inheritedDirectives, + newDirectives); } template @@ -3311,7 +3322,15 @@ Parser::functionFormalParametersAndBody(InHandling inHandling, #endif } - Node body = functionBody(inHandling, yieldHandling, kind, bodyType); + // Arrow function parameters inherit yieldHandling from the enclosing + // context, but the arrow body doesn't. E.g. in |(a = yield) => yield|, + // |yield| in the parameters is either a name or keyword, depending on + // whether the arrow function is enclosed in a generator function or not. + // Whereas the |yield| in the function body is always parsed as a name. + YieldHandling bodyYieldHandling = pc->isGenerator() ? YieldIsKeyword : YieldIsName; + MOZ_ASSERT_IF(yieldHandling != bodyYieldHandling, kind == Arrow); + + Node body = functionBody(inHandling, bodyYieldHandling, kind, bodyType); if (!body) return false; @@ -3400,7 +3419,8 @@ Parser::functionStmt(YieldHandling yieldHandling, DefaultHandling return null(); } - Node fun = functionDefinition(InAllowed, yieldHandling, name, Statement, generatorKind, + YieldHandling newYieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + Node fun = functionDefinition(InAllowed, newYieldHandling, name, Statement, generatorKind, PredictUninvoked); if (!fun) return null(); @@ -3433,16 +3453,17 @@ Parser::functionExpr(InvokedPrediction invoked) return null(); } + YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; + RootedPropertyName name(context); if (tt == TOK_NAME || tt == TOK_YIELD) { - name = bindingIdentifier(YieldIsName); + name = bindingIdentifier(yieldHandling); if (!name) return null(); } else { tokenStream.ungetToken(); } - YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; return functionDefinition(InAllowed, yieldHandling, name, Expression, generatorKind, invoked); } @@ -5095,10 +5116,17 @@ Parser::matchInOrOf(bool* isForInp, bool* isForOfp) template bool -Parser::validateForInOrOfLHSExpression(Node target) +Parser::validateForInOrOfLHSExpression(Node target, PossibleError* possibleError) { - if (handler.isUnparenthesizedDestructuringPattern(target)) - return checkDestructuringPattern(target); + if (handler.isUnparenthesizedDestructuringPattern(target)) { + bool isDestructuring = checkDestructuringPattern(target); + // Here we've successfully distinguished between destructuring and an + // object literal. In the case where "CoverInitializedName" syntax was + // used there will be a pending error that needs clearing. + if (isDestructuring) + possibleError->setResolved(); + return isDestructuring; + } // All other permitted targets are simple. if (!reportIfNotValidSimpleAssignmentTarget(target, ForInOrOfTarget)) @@ -5207,7 +5235,8 @@ Parser::forHeadStart(YieldHandling yieldHandling, // Finally, handle for-loops that start with expressions. Pass // |InProhibited| so that |in| isn't parsed in a RelationalExpression as a // binary operator. |in| makes it a for-in loop, *not* an |in| expression. - *forInitialPart = expr(InProhibited, yieldHandling, TripledotProhibited); + PossibleError possibleError(*this); + *forInitialPart = expr(InProhibited, yieldHandling, TripledotProhibited, &possibleError); if (!*forInitialPart) return false; @@ -5220,6 +5249,8 @@ Parser::forHeadStart(YieldHandling yieldHandling, // modifier when regetting: Operand must be used to examine the ';' in // |for (;|, and our caller handles this case and that. if (!isForIn && !isForOf) { + if (!possibleError.checkForExprErrors()) + return false; *forHeadKind = PNK_FORHEAD; tokenStream.addModifierException(TokenStream::OperandIsNone); return true; @@ -5244,7 +5275,9 @@ Parser::forHeadStart(YieldHandling yieldHandling, *forHeadKind = isForIn ? PNK_FORIN : PNK_FOROF; - if (!validateForInOrOfLHSExpression(*forInitialPart)) + if (!validateForInOrOfLHSExpression(*forInitialPart, &possibleError)) + return false; + if (!possibleError.checkForExprErrors()) return false; // Finally, parse the iterated expression, making the for-loop's closing @@ -5735,6 +5768,7 @@ Parser::yieldExpression(InHandling inHandling) case TOK_RP: case TOK_COLON: case TOK_COMMA: + case TOK_IN: // No value. exprNode = null(); tokenStream.addModifierException(TokenStream::NoneIsOperand); @@ -6284,11 +6318,6 @@ Parser::classDefinition(YieldHandling yieldHandling, tokenStream.ungetToken(); } - if (name == context->names().let) { - report(ParseError, false, null(), JSMSG_LET_CLASS_BINDING); - return null(); - } - RootedAtom propAtom(context); // A named class creates a new lexical scope with a const binding of the @@ -6338,13 +6367,6 @@ Parser::classDefinition(YieldHandling yieldHandling, bool isStatic = false; if (tt == TOK_NAME && tokenStream.currentName() == context->names().static_) { - MOZ_ASSERT(pc->sc()->strict(), "classes are always strict"); - - // Strict mode forbids "class" as Identifier, so it can only be the - // unescaped keyword. - if (!checkUnescapedName()) - return null(); - if (!tokenStream.peekToken(&tt, TokenStream::KeywordIsName)) return null(); if (tt == TOK_RC) { @@ -6420,7 +6442,7 @@ Parser::classDefinition(YieldHandling yieldHandling, if (!tokenStream.isCurrentTokenType(TOK_RB)) funName = propAtom; } - Node fn = methodDefinition(yieldHandling, propType, funName); + Node fn = methodDefinition(propType, funName); if (!fn) return null(); @@ -6491,8 +6513,13 @@ Parser::nextTokenContinuesLetDeclaration(TokenKind next, YieldHand // Otherwise a let declaration must have a name. if (next == TOK_NAME) { - MOZ_ASSERT(tokenStream.nextName() != context->names().yield, - "token stream should interpret 'yield' as TOK_YIELD"); + if (tokenStream.nextName() == context->names().yield) { + MOZ_ASSERT(tokenStream.nextNameContainsEscape(), + "token stream should interpret unescaped 'yield' as TOK_YIELD"); + + // Same as |next == TOK_YIELD|. + return yieldHandling == YieldIsName; + } // One non-"yield" TOK_NAME edge case deserves special comment. // Consider this: @@ -6933,6 +6960,32 @@ Parser::expr(InHandling inHandling, YieldHandling yieldHandling, if (!seq) return null(); while (true) { + // Trailing comma before the closing parenthesis is valid in an arrow + // function parameters list: `(a, b, ) => body`. Check if we are + // directly under CoverParenthesizedExpressionAndArrowParameterList, + // and the next two tokens are closing parenthesis and arrow. If all + // are present allow the trailing comma. + if (tripledotHandling == TripledotAllowed) { + TokenKind tt; + if (!tokenStream.peekToken(&tt, TokenStream::Operand)) + return null(); + + if (tt == TOK_RP) { + tokenStream.consumeKnownToken(TOK_RP, TokenStream::Operand); + + if (!tokenStream.peekToken(&tt)) + return null(); + if (tt != TOK_ARROW) { + report(ParseError, false, null(), JSMSG_UNEXPECTED_TOKEN, + "expression", TokenKindToDesc(TOK_RP)); + return null(); + } + + tokenStream.ungetToken(); // put back right paren + tokenStream.addModifierException(TokenStream::NoneIsOperand); + break; + } + } // Additional calls to assignExpr should not reuse the possibleError // which had been passed into the function. Otherwise we would lose @@ -7096,6 +7149,11 @@ Parser::orExpr1(InHandling inHandling, YieldHandling yieldHandling // Destructuring defaults are an error in this context if (possibleError && !possibleError->checkForExprErrors()) return null(); + // Report an error for unary expressions on the LHS of **. + if (tok == TOK_POW && handler.isUnparenthesizedUnaryExpression(pn)) { + report(ParseError, false, null(), JSMSG_BAD_POW_LEFTSIDE); + return null(); + } pnk = BinaryOpTokenKindToParseNodeKind(tok); } else { tok = TOK_EOF; @@ -7319,10 +7377,13 @@ Parser::assignExpr(InHandling inHandling, YieldHandling yieldHandl // A line terminator between ArrowParameters and the => should trigger a SyntaxError. tokenStream.ungetToken(); - TokenKind next = TOK_EOF; - if (!tokenStream.peekTokenSameLine(&next) || next != TOK_ARROW) { - report(ParseError, false, null(), JSMSG_UNEXPECTED_TOKEN, - "expression", TokenKindToDesc(TOK_ARROW)); + TokenKind next; + if (!tokenStream.peekTokenSameLine(&next)) + return null(); + MOZ_ASSERT(next == TOK_ARROW || next == TOK_EOL); + + if (next != TOK_ARROW) { + report(ParseError, false, null(), JSMSG_LINE_BREAK_BEFORE_ARROW); return null(); } tokenStream.consumeKnownToken(TOK_ARROW); @@ -7603,10 +7664,9 @@ Parser::unaryExpr(YieldHandling yieldHandling, TripledotHandling t AssignmentFlavor flavor = (tt == TOK_INC) ? IncrementAssignment : DecrementAssignment; if (!checkAndMarkAsIncOperand(pn2, flavor)) return null(); - return handler.newUnary((tt == TOK_INC) ? PNK_PREINCREMENT : PNK_PREDECREMENT, - JSOP_NOP, - begin, - pn2); + return handler.newUpdate((tt == TOK_INC) ? PNK_PREINCREMENT : PNK_PREDECREMENT, + begin, + pn2); } case TOK_DELETE: { @@ -7639,10 +7699,9 @@ Parser::unaryExpr(YieldHandling yieldHandling, TripledotHandling t AssignmentFlavor flavor = (tt == TOK_INC) ? IncrementAssignment : DecrementAssignment; if (!checkAndMarkAsIncOperand(pn, flavor)) return null(); - return handler.newUnary((tt == TOK_INC) ? PNK_POSTINCREMENT : PNK_POSTDECREMENT, - JSOP_NOP, - begin, - pn); + return handler.newUpdate((tt == TOK_INC) ? PNK_POSTINCREMENT : PNK_POSTDECREMENT, + begin, + pn); } return pn; } @@ -7873,7 +7932,7 @@ Parser::comprehensionTail(GeneratorKind comprehensionKind) return null(); if (comprehensionKind == NotGenerator) - return handler.newUnary(PNK_ARRAYPUSH, JSOP_ARRAYPUSH, begin, bodyExpr); + return handler.newArrayPush(begin, bodyExpr); MOZ_ASSERT(comprehensionKind == StarGenerator); Node yieldExpr = newYieldExpression(begin, bodyExpr); @@ -7994,7 +8053,7 @@ Parser::argumentList(YieldHandling yieldHandling, Node listNode, b if (!argNode) return false; if (spread) { - argNode = handler.newUnary(PNK_SPREAD, JSOP_NOP, begin, argNode); + argNode = handler.newSpread(begin, argNode); if (!argNode) return false; } @@ -8006,6 +8065,14 @@ Parser::argumentList(YieldHandling yieldHandling, Node listNode, b return false; if (!matched) break; + + TokenKind tt; + if (!tokenStream.peekToken(&tt, TokenStream::Operand)) + return null(); + if (tt == TOK_RP) { + tokenStream.addModifierException(TokenStream::NoneIsOperand); + break; + } } TokenKind tt; @@ -8121,8 +8188,8 @@ Parser::memberExpr(YieldHandling yieldHandling, TripledotHandling MUST_MATCH_TOKEN(TOK_RB, JSMSG_BRACKET_IN_INDEX); if (handler.isSuperBase(lhs) && !checkAndMarkSuperScope()) { - report(ParseError, false, null(), JSMSG_BAD_SUPERPROP, "member"); - return null(); + report(ParseError, false, null(), JSMSG_BAD_SUPERPROP, "member"); + return null(); } nextMember = handler.newPropertyByValue(lhs, propExpr, pos().end); if (!nextMember) @@ -8146,7 +8213,7 @@ Parser::memberExpr(YieldHandling yieldHandling, TripledotHandling if (!nextMember) return null(); - // Despite the fact that it's impossible to have |super()| is a + // Despite the fact that it's impossible to have |super()| in a // generator, we still inherit the yieldHandling of the // memberExpression, per spec. Curious. bool isSpread = false; @@ -8159,71 +8226,73 @@ Parser::memberExpr(YieldHandling yieldHandling, TripledotHandling Node thisName = newThisName(); if (!thisName) return null(); - return handler.newSetThis(thisName, nextMember); - } - if (options().selfHostingMode && handler.isPropertyAccess(lhs)) { - report(ParseError, false, null(), JSMSG_SELFHOSTED_METHOD_CALL); - return null(); - } - - nextMember = tt == TOK_LP ? handler.newCall() : handler.newTaggedTemplate(); - if (!nextMember) - return null(); - - JSOp op = JSOP_CALL; - if (handler.isNameAnyParentheses(lhs)) { - if (tt == TOK_LP && handler.nameIsEvalAnyParentheses(lhs, context)) { - // Select the right EVAL op and flag pc as having a direct eval. - op = pc->sc()->strict() ? JSOP_STRICTEVAL : JSOP_EVAL; - pc->sc()->setBindingsAccessedDynamically(); - pc->sc()->setHasDirectEval(); - - /* - * In non-strict mode code, direct calls to eval can add - * variables to the call object. - */ - if (pc->isFunctionBox() && !pc->sc()->strict()) - pc->functionBox()->setHasExtensibleScope(); - - // If we're in a method, mark the method as requiring - // support for 'super', since direct eval code can use it. - // (If we're not in a method, that's fine, so ignore the - // return value.) - checkAndMarkSuperScope(); - } - } else if (PropertyName* prop = handler.maybeDottedProperty(lhs)) { - // Use the JSOP_FUN{APPLY,CALL} optimizations given the right - // syntax. - if (prop == context->names().apply) { - op = JSOP_FUNAPPLY; - if (pc->isFunctionBox()) - pc->functionBox()->usesApply = true; - } else if (prop == context->names().call) { - op = JSOP_FUNCALL; - } - } - - handler.setBeginPosition(nextMember, lhs); - handler.addList(nextMember, lhs); - - if (tt == TOK_LP) { - bool isSpread = false; - if (!argumentList(yieldHandling, nextMember, &isSpread)) + nextMember = handler.newSetThis(thisName, nextMember); + if (!nextMember) return null(); - if (isSpread) { - if (op == JSOP_EVAL) - op = JSOP_SPREADEVAL; - else if (op == JSOP_STRICTEVAL) - op = JSOP_STRICTSPREADEVAL; - else - op = JSOP_SPREADCALL; - } } else { - if (!taggedTemplate(yieldHandling, nextMember, tt)) + if (options().selfHostingMode && handler.isPropertyAccess(lhs)) { + report(ParseError, false, null(), JSMSG_SELFHOSTED_METHOD_CALL); return null(); + } + + nextMember = tt == TOK_LP ? handler.newCall() : handler.newTaggedTemplate(); + if (!nextMember) + return null(); + + JSOp op = JSOP_CALL; + if (handler.isNameAnyParentheses(lhs)) { + if (tt == TOK_LP && handler.nameIsEvalAnyParentheses(lhs, context)) { + // Select the right EVAL op and flag pc as having a + // direct eval. + op = pc->sc()->strict() ? JSOP_STRICTEVAL : JSOP_EVAL; + pc->sc()->setBindingsAccessedDynamically(); + pc->sc()->setHasDirectEval(); + + // In non-strict mode code, direct calls to eval can + // add variables to the call object. + if (pc->isFunctionBox() && !pc->sc()->strict()) + pc->functionBox()->setHasExtensibleScope(); + + // If we're in a method, mark the method as requiring + // support for 'super', since direct eval code can use + // it. (If we're not in a method, that's fine, so + // ignore the return value.) + checkAndMarkSuperScope(); + } + } else if (PropertyName* prop = handler.maybeDottedProperty(lhs)) { + // Use the JSOP_FUN{APPLY,CALL} optimizations given the + // right syntax. + if (prop == context->names().apply) { + op = JSOP_FUNAPPLY; + if (pc->isFunctionBox()) + pc->functionBox()->usesApply = true; + } else if (prop == context->names().call) { + op = JSOP_FUNCALL; + } + } + + handler.setBeginPosition(nextMember, lhs); + handler.addList(nextMember, lhs); + + if (tt == TOK_LP) { + bool isSpread = false; + if (!argumentList(yieldHandling, nextMember, &isSpread)) + return null(); + if (isSpread) { + if (op == JSOP_EVAL) + op = JSOP_SPREADEVAL; + else if (op == JSOP_STRICTEVAL) + op = JSOP_STRICTSPREADEVAL; + else + op = JSOP_SPREADCALL; + } + } else { + if (!taggedTemplate(yieldHandling, nextMember, tt)) + return null(); + } + handler.setOp(nextMember, op); } - handler.setOp(nextMember, op); } else { tokenStream.ungetToken(); if (handler.isSuperBase(lhs)) @@ -8271,15 +8340,29 @@ Parser::newName(PropertyName* name, TokenPos pos) template PropertyName* -Parser::labelOrIdentifierReference(YieldHandling yieldHandling) +Parser::labelOrIdentifierReference(YieldHandling yieldHandling, + bool yieldTokenizedAsName) { PropertyName* ident; + bool isYield; const Token& tok = tokenStream.currentToken(); if (tok.type == TOK_NAME) { - ident = tok.name(); - MOZ_ASSERT(ident != context->names().yield, - "tokenizer should have treated 'yield' as TOK_YIELD"); + MOZ_ASSERT(tok.name() != context->names().yield || + tok.nameContainsEscape() || + yieldTokenizedAsName, + "tokenizer should have treated unescaped 'yield' as TOK_YIELD"); + MOZ_ASSERT_IF(yieldTokenizedAsName, tok.name() == context->names().yield); + ident = tok.name(); + isYield = ident == context->names().yield; + } else { + MOZ_ASSERT(tok.type == TOK_YIELD && !yieldTokenizedAsName); + + ident = context->names().yield; + isYield = true; + } + + if (!isYield) { if (pc->sc()->strict()) { const char* badName = ident == context->names().let ? "let" @@ -8292,18 +8375,13 @@ Parser::labelOrIdentifierReference(YieldHandling yieldHandling) } } } else { - MOZ_ASSERT(tok.type == TOK_YIELD); - if (yieldHandling == YieldIsKeyword || pc->sc()->strict() || - pc->isStarGenerator() || versionNumber() >= JSVERSION_1_7) { report(ParseError, false, null(), JSMSG_RESERVED_ID, "yield"); return nullptr; } - - ident = context->names().yield; } return ident; @@ -8314,12 +8392,22 @@ PropertyName* Parser::bindingIdentifier(YieldHandling yieldHandling) { PropertyName* ident; + bool isYield; const Token& tok = tokenStream.currentToken(); if (tok.type == TOK_NAME) { - ident = tok.name(); - MOZ_ASSERT(ident != context->names().yield, - "tokenizer should have treated 'yield' as TOK_YIELD"); + MOZ_ASSERT(tok.name() != context->names().yield || tok.nameContainsEscape(), + "tokenizer should have treated unescaped 'yield' as TOK_YIELD"); + ident = tok.name(); + isYield = ident == context->names().yield; + } else { + MOZ_ASSERT(tok.type == TOK_YIELD); + + ident = context->names().yield; + isYield = true; + } + + if (!isYield) { if (pc->sc()->strict()) { const char* badName = ident == context->names().arguments ? "arguments" @@ -8342,18 +8430,13 @@ Parser::bindingIdentifier(YieldHandling yieldHandling) } } } else { - MOZ_ASSERT(tok.type == TOK_YIELD); - if (yieldHandling == YieldIsKeyword || pc->sc()->strict() || - pc->isStarGenerator() || versionNumber() >= JSVERSION_1_7) { report(ParseError, false, null(), JSMSG_RESERVED_ID, "yield"); return nullptr; } - - ident = context->names().yield; } return ident; @@ -8758,12 +8841,20 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* } else if (propType == PropertyType::Shorthand) { /* * Support, e.g., |var {x, y} = o| as destructuring shorthand - * for |var {x: x, y: y} = o|, per proposed JS2/ES4 for JS1.8. + * for |var {x: x, y: y} = o|, and |var o = {x, y}| as initializer + * shorthand for |var o = {x: x, y: y}|. */ - if (!tokenStream.checkForKeyword(propAtom, nullptr)) + TokenKind propToken = TOK_NAME; + if (!tokenStream.checkForKeyword(propAtom, &propToken)) return null(); - Rooted name(context, identifierReference(yieldHandling)); + if (propToken != TOK_NAME && propToken != TOK_YIELD) { + report(ParseError, false, null(), JSMSG_RESERVED_ID, TokenKindToDesc(propToken)); + return null(); + } + + Rooted name(context, + identifierReference(yieldHandling, propToken == TOK_YIELD)); if (!name) return null(); @@ -8776,12 +8867,19 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* } else if (propType == PropertyType::CoverInitializedName) { /* * Support, e.g., |var {x=1, y=2} = o| as destructuring shorthand - * with default values, as per ES6 12.14.5 (2016/2/4) + * with default values, as per ES6 12.14.5 */ - if (!tokenStream.checkForKeyword(propAtom, nullptr)) + TokenKind propToken = TOK_NAME; + if (!tokenStream.checkForKeyword(propAtom, &propToken)) return null(); - Rooted name(context, identifierReference(yieldHandling)); + if (propToken != TOK_NAME && propToken != TOK_YIELD) { + report(ParseError, false, null(), JSMSG_RESERVED_ID, TokenKindToDesc(propToken)); + return null(); + } + + Rooted name(context, + identifierReference(yieldHandling, propToken == TOK_YIELD)); if (!name) return null(); @@ -8791,6 +8889,29 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* tokenStream.consumeKnownToken(TOK_ASSIGN); + if (!seenCoverInitializedName) { + // "shorthand default" or "CoverInitializedName" syntax is only + // valid in the case of destructuring. + seenCoverInitializedName = true; + + if (!possibleError) { + // Destructuring defaults are definitely not allowed in this object literal, + // because of something the caller knows about the preceding code. + // For example, maybe the preceding token is an operator: `x + {y=z}`. + report(ParseError, false, null(), JSMSG_COLON_AFTER_ID); + return null(); + } + + // Here we set a pending error so that later in the parse, once we've + // determined whether or not we're destructuring, the error can be + // reported or ignored appropriately. + if (!possibleError->setPending(ParseError, JSMSG_COLON_AFTER_ID, false)) { + // Report any previously pending error. + possibleError->checkForExprErrors(); + return null(); + } + } + Node rhs; { // Clearing `inDestructuringDecl` allows name use to be noted @@ -8810,32 +8931,6 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* if (!abortIfSyntaxParser()) return null(); - - if (!seenCoverInitializedName) { - - // "shorthand default" or "CoverInitializedName" syntax is only - // valid in the case of destructuring. - seenCoverInitializedName = true; - - if (!possibleError) { - // Destructuring defaults are definitely not allowed in this object literal, - // because of something the caller knows about the preceding code. - // For example, maybe the preceding token is an operator: `x + {y=z}`. - report(ParseError, false, null(), JSMSG_COLON_AFTER_ID); - return null(); - } - - // Here we set a pending error so that later in the parse, once we've - // determined whether or not we're destructuring, the error can be - // reported or ignored appropriately. - if (!possibleError->setPending(ParseError, JSMSG_COLON_AFTER_ID, false)) { - - // Report any previously pending error. - possibleError->checkForExprErrors(); - return null(); - } - } - } else { // FIXME: Implement ES6 function "name" property semantics // (bug 883377). @@ -8850,7 +8945,7 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* } } - Node fn = methodDefinition(yieldHandling, propType, funName); + Node fn = methodDefinition(propType, funName); if (!fn) return null(); @@ -8875,11 +8970,11 @@ Parser::objectLiteral(YieldHandling yieldHandling, PossibleError* template typename ParseHandler::Node -Parser::methodDefinition(YieldHandling yieldHandling, PropertyType propType, - HandleAtom funName) +Parser::methodDefinition(PropertyType propType, HandleAtom funName) { FunctionSyntaxKind kind = FunctionSyntaxKindFromPropertyType(propType); GeneratorKind generatorKind = GeneratorKindFromPropertyType(propType); + YieldHandling yieldHandling = generatorKind != NotGenerator ? YieldIsKeyword : YieldIsName; return functionDefinition(InAllowed, yieldHandling, funName, kind, generatorKind); } @@ -9067,9 +9162,11 @@ Parser::primaryExpr(YieldHandling yieldHandling, TripledotHandling return null(); } - if (!tokenStream.peekTokenSameLine(&next)) + if (!tokenStream.peekToken(&next)) return null(); if (next != TOK_ARROW) { + // Advance the scanner for proper error location reporting. + tokenStream.consumeKnownToken(next); report(ParseError, false, null(), JSMSG_UNEXPECTED_TOKEN, "'=>' after argument list", TokenKindToDesc(next)); return null(); diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index f0fa6b3f3baf..ae838e5a5be3 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -969,8 +969,8 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter // Parse an inner function given an enclosing ParseContext and a // FunctionBox for the inner function. - bool innerFunction(Node pn, ParseContext* outerpc, FunctionBox* funbox, - InHandling inHandling, FunctionSyntaxKind kind, GeneratorKind generatorKind, + bool innerFunction(Node pn, ParseContext* outerpc, FunctionBox* funbox, InHandling inHandling, + YieldHandling yieldHandling, FunctionSyntaxKind kind, Directives inheritedDirectives, Directives* newDirectives); // Parse a function's formal parameters and its body assuming its function @@ -1037,7 +1037,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter Node* forInitialPart, mozilla::Maybe& forLetImpliedScope, Node* forInOrOfExpression); - bool validateForInOrOfLHSExpression(Node target); + bool validateForInOrOfLHSExpression(Node target, PossibleError* possibleError); Node expressionAfterForInOrOf(ParseNodeKind forHeadKind, YieldHandling yieldHandling); Node switchStatement(YieldHandling yieldHandling); @@ -1165,7 +1165,7 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter bool tryNewTarget(Node& newTarget); bool checkAndMarkSuperScope(); - Node methodDefinition(YieldHandling yieldHandling, PropertyType propType, HandleAtom funName); + Node methodDefinition(PropertyType propType, HandleAtom funName); /* * Additional JS parsers. @@ -1210,14 +1210,17 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter Node classDefinition(YieldHandling yieldHandling, ClassContext classContext, DefaultHandling defaultHandling); - PropertyName* labelOrIdentifierReference(YieldHandling yieldHandling); + PropertyName* labelOrIdentifierReference(YieldHandling yieldHandling, + bool yieldTokenizedAsName); PropertyName* labelIdentifier(YieldHandling yieldHandling) { - return labelOrIdentifierReference(yieldHandling); + return labelOrIdentifierReference(yieldHandling, false); } - PropertyName* identifierReference(YieldHandling yieldHandling) { - return labelOrIdentifierReference(yieldHandling); + PropertyName* identifierReference(YieldHandling yieldHandling, + bool yieldTokenizedAsName = false) + { + return labelOrIdentifierReference(yieldHandling, yieldTokenizedAsName); } PropertyName* importedBinding() { @@ -1261,13 +1264,13 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter GeneratorKind generatorKind, bool* tryAnnexB); bool skipLazyInnerFunction(Node pn, FunctionSyntaxKind kind, bool tryAnnexB); bool innerFunction(Node pn, ParseContext* outerpc, HandleFunction fun, - InHandling inHandling, FunctionSyntaxKind kind, - GeneratorKind generatorKind, bool tryAnnexB, + InHandling inHandling, YieldHandling yieldHandling, + FunctionSyntaxKind kind, GeneratorKind generatorKind, bool tryAnnexB, Directives inheritedDirectives, Directives* newDirectives); bool trySyntaxParseInnerFunction(Node pn, HandleFunction fun, InHandling inHandling, - FunctionSyntaxKind kind, GeneratorKind generatorKind, - bool tryAnnexB, Directives inheritedDirectives, - Directives* newDirectives); + YieldHandling yieldHandling, FunctionSyntaxKind kind, + GeneratorKind generatorKind, bool tryAnnexB, + Directives inheritedDirectives, Directives* newDirectives); bool finishFunctionScopes(); bool finishFunction(); bool leaveInnerFunction(ParseContext* outerpc); @@ -1362,9 +1365,4 @@ class Parser final : private JS::AutoGCRooter, public StrictModeGetter } /* namespace frontend */ } /* namespace js */ -/* - * Convenience macro to access Parser.tokenStream as a pointer. - */ -#define TS(p) (&(p)->tokenStream) - #endif /* frontend_Parser_h */ diff --git a/js/src/frontend/SyntaxParseHandler.h b/js/src/frontend/SyntaxParseHandler.h index cc633bbf4f86..e9a2603143f7 100644 --- a/js/src/frontend/SyntaxParseHandler.h +++ b/js/src/frontend/SyntaxParseHandler.h @@ -127,6 +127,11 @@ class SyntaxParseHandler // eventually enforce extraWarnings and will require this then.) NodeUnparenthesizedAssignment, + // This node is necessary to determine if the base operand in an + // exponentiation operation is an unparenthesized unary expression. + // We want to reject |-2 ** 3|, but still need to allow |(-2) ** 3|. + NodeUnparenthesizedUnary, + // This node is necessary to determine if the LHS of a property access is // super related. NodeSuperBase @@ -220,14 +225,26 @@ class SyntaxParseHandler Node newElision() { return NodeGeneric; } Node newDelete(uint32_t begin, Node expr) { - return NodeGeneric; + return NodeUnparenthesizedUnary; } Node newTypeof(uint32_t begin, Node kid) { - return NodeGeneric; + return NodeUnparenthesizedUnary; } Node newUnary(ParseNodeKind kind, JSOp op, uint32_t begin, Node kid) { + return NodeUnparenthesizedUnary; + } + + Node newUpdate(ParseNodeKind kind, uint32_t begin, Node kid) { + return NodeGeneric; + } + + Node newSpread(uint32_t begin, Node kid) { + return NodeGeneric; + } + + Node newArrayPush(uint32_t begin, Node kid) { return NodeGeneric; } @@ -441,6 +458,10 @@ class SyntaxParseHandler return node == NodeUnparenthesizedAssignment; } + bool isUnparenthesizedUnaryExpression(Node node) { + return node == NodeUnparenthesizedUnary; + } + bool isReturnStatement(Node node) { return node == NodeReturn; } @@ -478,7 +499,8 @@ class SyntaxParseHandler // them to a generic node. if (node == NodeUnparenthesizedString || node == NodeUnparenthesizedCommaExpr || - node == NodeUnparenthesizedAssignment) + node == NodeUnparenthesizedAssignment || + node == NodeUnparenthesizedUnary) { return NodeGeneric; } diff --git a/js/src/frontend/TokenStream.cpp b/js/src/frontend/TokenStream.cpp index f5506b5fbafe..1f48c5fa1c8c 100644 --- a/js/src/frontend/TokenStream.cpp +++ b/js/src/frontend/TokenStream.cpp @@ -982,12 +982,8 @@ TokenStream::checkForKeyword(const KeywordInfo* kw, TokenKind* ttp) return reportStrictModeError(JSMSG_RESERVED_ID, kw->chars); // Working keyword. - if (ttp) { - *ttp = kw->tokentype; - return true; - } - - return reportError(JSMSG_RESERVED_ID, kw->chars); + *ttp = kw->tokentype; + return true; } bool @@ -1206,7 +1202,15 @@ TokenStream::getTokenInternal(TokenKind* ttp, Modifier modifier) // That said, keywords can't contain escapes. (Contexts where // keywords are treated as names, that also sometimes treat // keywords as keywords, must manually check this requirement.) - if (hadUnicodeEscape) { + // There are two exceptions + // 1) StrictReservedWords: These keywords need to be treated as + // names in non-strict mode. + // 2) yield is also treated as a name if it contains an escape + // sequence. The parser must handle this case separately. + if (hadUnicodeEscape && !( + (kw->tokentype == TOK_STRICT_RESERVED && !strictMode()) || + kw->tokentype == TOK_YIELD)) + { reportError(JSMSG_ESCAPED_KEYWORD); goto error; } @@ -1214,7 +1218,7 @@ TokenStream::getTokenInternal(TokenKind* ttp, Modifier modifier) tp->type = TOK_NAME; if (!checkForKeyword(kw, &tp->type)) goto error; - if (tp->type != TOK_NAME) + if (tp->type != TOK_NAME && !hadUnicodeEscape) goto out; } } diff --git a/js/src/frontend/TokenStream.h b/js/src/frontend/TokenStream.h index 90b1941425d4..a36512c7e332 100644 --- a/js/src/frontend/TokenStream.h +++ b/js/src/frontend/TokenStream.h @@ -741,10 +741,8 @@ class MOZ_STACK_CLASS TokenStream // If it is a reserved word in this version and strictness mode, and thus // can't be present in correct code, report a SyntaxError and return false. // - // If it is a keyword, like "if", the behavior depends on ttp. If ttp is - // null, report a SyntaxError ("if is a reserved identifier") and return - // false. If ttp is non-null, return true with the keyword's TokenKind in - // *ttp. + // If it is a keyword, like "if", return true with the keyword's TokenKind + // in *ttp. MOZ_MUST_USE bool checkForKeyword(JSAtom* atom, TokenKind* ttp); // Same semantics as above, but for the provided keyword. diff --git a/js/src/gc/Barrier.cpp b/js/src/gc/Barrier.cpp index 29991e1c5b06..22aa000cc6f5 100644 --- a/js/src/gc/Barrier.cpp +++ b/js/src/gc/Barrier.cpp @@ -29,7 +29,7 @@ RuntimeFromMainThreadIsHeapMajorCollecting(JS::shadow::Zone* shadowZone) #ifdef DEBUG -static bool +bool IsMarkedBlack(NativeObject* obj) { // Note: we assume conservatively that Nursery things will be live. diff --git a/js/src/gc/Barrier.h b/js/src/gc/Barrier.h index 6252be0f50a8..bffd1e7b1593 100644 --- a/js/src/gc/Barrier.h +++ b/js/src/gc/Barrier.h @@ -240,6 +240,9 @@ CurrentThreadIsIonCompilingSafeForMinorGC(); bool CurrentThreadIsGCSweeping(); + +bool +IsMarkedBlack(NativeObject* obj); #endif namespace gc { diff --git a/js/src/gc/Marking.cpp b/js/src/gc/Marking.cpp index ccfe949d5de9..83ca9243be2c 100644 --- a/js/src/gc/Marking.cpp +++ b/js/src/gc/Marking.cpp @@ -439,7 +439,7 @@ JS_PUBLIC_API(void) JS::TraceEdge(JSTracer* trc, JS::TenuredHeap* thingp, const char* name) { MOZ_ASSERT(thingp); - if (JSObject* ptr = thingp->getPtr()) { + if (JSObject* ptr = thingp->unbarrieredGetPtr()) { DispatchToTracer(trc, &ptr, name); thingp->setPtr(ptr); } diff --git a/js/src/gc/Memory.cpp b/js/src/gc/Memory.cpp index f12aed18d731..00f3c23e336b 100644 --- a/js/src/gc/Memory.cpp +++ b/js/src/gc/Memory.cpp @@ -840,14 +840,24 @@ DeallocateMappedContent(void* p, size_t length) #error "Memory mapping functions are not defined for your OS." #endif +#ifdef XP_WIN +static char sCrashReason[256]; +#endif + void ProtectPages(void* p, size_t size) { MOZ_ASSERT(size % pageSize == 0); + MOZ_RELEASE_ASSERT(size > 0); + MOZ_RELEASE_ASSERT(p); #if defined(XP_WIN) DWORD oldProtect; - if (!VirtualProtect(p, size, PAGE_NOACCESS, &oldProtect)) - MOZ_CRASH("VirtualProtect(PAGE_NOACCESS) failed"); + if (!VirtualProtect(p, size, PAGE_NOACCESS, &oldProtect)) { + snprintf(sCrashReason, sizeof(sCrashReason), + "MOZ_CRASH(VirtualProtect(PAGE_NOACCESS) failed! Error code: %u)", GetLastError()); + MOZ_CRASH_ANNOTATE(sCrashReason); + MOZ_REALLY_CRASH(); + } MOZ_ASSERT(oldProtect == PAGE_READWRITE); #else // assume Unix if (mprotect(p, size, PROT_NONE)) @@ -859,10 +869,16 @@ void MakePagesReadOnly(void* p, size_t size) { MOZ_ASSERT(size % pageSize == 0); + MOZ_RELEASE_ASSERT(size > 0); + MOZ_RELEASE_ASSERT(p); #if defined(XP_WIN) DWORD oldProtect; - if (!VirtualProtect(p, size, PAGE_READONLY, &oldProtect)) - MOZ_CRASH("VirtualProtect(PAGE_READONLY) failed"); + if (!VirtualProtect(p, size, PAGE_READONLY, &oldProtect)) { + snprintf(sCrashReason, sizeof(sCrashReason), + "MOZ_CRASH(VirtualProtect(PAGE_READONLY) failed! Error code: %u)", GetLastError()); + MOZ_CRASH_ANNOTATE(sCrashReason); + MOZ_REALLY_CRASH(); + } MOZ_ASSERT(oldProtect == PAGE_READWRITE); #else // assume Unix if (mprotect(p, size, PROT_READ)) @@ -874,10 +890,16 @@ void UnprotectPages(void* p, size_t size) { MOZ_ASSERT(size % pageSize == 0); + MOZ_RELEASE_ASSERT(size > 0); + MOZ_RELEASE_ASSERT(p); #if defined(XP_WIN) DWORD oldProtect; - if (!VirtualProtect(p, size, PAGE_READWRITE, &oldProtect)) - MOZ_CRASH("VirtualProtect(PAGE_READWRITE) failed"); + if (!VirtualProtect(p, size, PAGE_READWRITE, &oldProtect)) { + snprintf(sCrashReason, sizeof(sCrashReason), + "MOZ_CRASH(VirtualProtect(PAGE_READWRITE) failed! Error code: %u)", GetLastError()); + MOZ_CRASH_ANNOTATE(sCrashReason); + MOZ_REALLY_CRASH(); + } MOZ_ASSERT(oldProtect == PAGE_NOACCESS || oldProtect == PAGE_READONLY); #else // assume Unix if (mprotect(p, size, PROT_READ | PROT_WRITE)) diff --git a/js/src/gc/Nursery.cpp b/js/src/gc/Nursery.cpp index 6541368e5d6e..c7d0f3887523 100644 --- a/js/src/gc/Nursery.cpp +++ b/js/src/gc/Nursery.cpp @@ -339,7 +339,7 @@ js::Nursery::allocate(size_t size) } void* -js::Nursery::allocateBuffer(Zone* zone, uint32_t nbytes) +js::Nursery::allocateBuffer(Zone* zone, size_t nbytes) { MOZ_ASSERT(nbytes > 0); @@ -358,7 +358,7 @@ js::Nursery::allocateBuffer(Zone* zone, uint32_t nbytes) } void* -js::Nursery::allocateBuffer(JSObject* obj, uint32_t nbytes) +js::Nursery::allocateBuffer(JSObject* obj, size_t nbytes) { MOZ_ASSERT(obj); MOZ_ASSERT(nbytes > 0); @@ -370,7 +370,7 @@ js::Nursery::allocateBuffer(JSObject* obj, uint32_t nbytes) void* js::Nursery::reallocateBuffer(JSObject* obj, void* oldBuffer, - uint32_t oldBytes, uint32_t newBytes) + size_t oldBytes, size_t newBytes) { if (!IsInsideNursery(obj)) return obj->zone()->pod_realloc((uint8_t*)oldBuffer, oldBytes, newBytes); diff --git a/js/src/gc/Nursery.h b/js/src/gc/Nursery.h index a1d24dcacda4..628a41cd19a5 100644 --- a/js/src/gc/Nursery.h +++ b/js/src/gc/Nursery.h @@ -174,17 +174,17 @@ class Nursery JSObject* allocateObject(JSContext* cx, size_t size, size_t numDynamic, const js::Class* clasp); /* Allocate a buffer for a given zone, using the nursery if possible. */ - void* allocateBuffer(JS::Zone* zone, uint32_t nbytes); + void* allocateBuffer(JS::Zone* zone, size_t nbytes); /* * Allocate a buffer for a given object, using the nursery if possible and * obj is in the nursery. */ - void* allocateBuffer(JSObject* obj, uint32_t nbytes); + void* allocateBuffer(JSObject* obj, size_t nbytes); /* Resize an existing object buffer. */ void* reallocateBuffer(JSObject* obj, void* oldBuffer, - uint32_t oldBytes, uint32_t newBytes); + size_t oldBytes, size_t newBytes); /* Free an object buffer. */ void freeBuffer(void* buffer); diff --git a/js/src/jit-test/tests/basic/bug1296249.js b/js/src/jit-test/tests/basic/bug1296249.js new file mode 100644 index 000000000000..65e3674a7fc2 --- /dev/null +++ b/js/src/jit-test/tests/basic/bug1296249.js @@ -0,0 +1,9 @@ +if (!('oomTest' in this)) + quit(); + +function f(x) { + new Int32Array(x); +} + +f(0); +oomTest(() => f(2147483647)); diff --git a/js/src/jit-test/tests/basic/destructuring-iterator.js b/js/src/jit-test/tests/basic/destructuring-iterator.js index f9e68f9299eb..ca6593024280 100644 --- a/js/src/jit-test/tests/basic/destructuring-iterator.js +++ b/js/src/jit-test/tests/basic/destructuring-iterator.js @@ -39,10 +39,10 @@ function assertIterable(expectCalls, fn, expectResult) { assertIterable([1,1,1,1], it => { var [a] = it; return [a]; }, [1]); -assertIterable([3,3,1,1], +assertIterable([2,2,1,1], it => { var [a,b,c] = it; return [a,b,c]; }, [1,undefined,undefined]); -assertIterable([3,3,1,1], +assertIterable([2,2,1,1], it => { var [a,b,...rest] = it; return [a,b,...rest]; }, [1,undefined]); assertIterable([5,5,4,4], diff --git a/js/src/jit-test/tests/basic/spread-call-invalid-syntax.js b/js/src/jit-test/tests/basic/spread-call-invalid-syntax.js index 25f56eea0709..c3288736d434 100644 --- a/js/src/jit-test/tests/basic/spread-call-invalid-syntax.js +++ b/js/src/jit-test/tests/basic/spread-call-invalid-syntax.js @@ -6,7 +6,6 @@ var offenders = [ "f(...)", "f(...,)", "f(... ...[])", - "f(...x,)", "f(x, ...)", "f(...x, x for (x in y))", "f(x for (x in y), ...x)" diff --git a/js/src/jit-test/tests/debug/Debugger-isCompilableUnit.js b/js/src/jit-test/tests/debug/Debugger-isCompilableUnit.js index 9653805c4840..dbfde0ef46e6 100644 --- a/js/src/jit-test/tests/debug/Debugger-isCompilableUnit.js +++ b/js/src/jit-test/tests/debug/Debugger-isCompilableUnit.js @@ -20,7 +20,7 @@ const compilable_units = [ "'Get Schwifty!'", "1 + 2", "function f(x) {}", - "function x(f,) {", // statements with bad syntax are always compilable + "function x(...f,) {", // statements with bad syntax are always compilable "let x = 100", ";;;;;;;;", "", diff --git a/js/src/jit-test/tests/gc/bug-1308048.js b/js/src/jit-test/tests/gc/bug-1308048.js new file mode 100644 index 000000000000..8cf2fba6b6cd --- /dev/null +++ b/js/src/jit-test/tests/gc/bug-1308048.js @@ -0,0 +1,10 @@ +if (helperThreadCount() == 0) + quit(); + +m = 'x'; +for (var i = 0; i < 10; i++) + m += m; +offThreadCompileScript("", ({elementAttributeName: m})); +var n = newGlobal(); +gczeal(2,1); +n.runOffThreadScript(); diff --git a/js/src/jit/BaselineBailouts.cpp b/js/src/jit/BaselineBailouts.cpp index 420e0a7c82be..9179e6163d4b 100644 --- a/js/src/jit/BaselineBailouts.cpp +++ b/js/src/jit/BaselineBailouts.cpp @@ -1023,7 +1023,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, // Not every monitored op has a monitored fallback stub, e.g. // JSOP_NEWOBJECT, which always returns the same type for a // particular script/pc location. - ICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); + BaselineICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback(); if (fallbackStub->isMonitoredFallback()) enterMonitorChain = true; @@ -1038,7 +1038,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, builder.setResumeFramePtr(prevFramePtr); if (enterMonitorChain) { - ICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); + BaselineICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); ICFallbackStub* fallbackStub = icEntry.firstStub()->getChainFallback(); MOZ_ASSERT(fallbackStub->isMonitoredFallback()); JitSpew(JitSpew_BaselineBailouts, " [TYPE-MONITOR CHAIN]"); @@ -1187,7 +1187,7 @@ InitFromBailout(JSContext* cx, HandleScript caller, jsbytecode* callerPC, // Calculate and write out return address. // The icEntry in question MUST have an inlinable fallback stub. - ICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); + BaselineICEntry& icEntry = baselineScript->icEntryFromPCOffset(pcOff); MOZ_ASSERT(IsInlinableFallback(icEntry.firstStub()->getChainFallback())); if (!builder.writePtr(baselineScript->returnAddressForIC(icEntry), "ReturnAddr")) return false; diff --git a/js/src/jit/BaselineCompiler.cpp b/js/src/jit/BaselineCompiler.cpp index f52642a23037..5c9174655a9a 100644 --- a/js/src/jit/BaselineCompiler.cpp +++ b/js/src/jit/BaselineCompiler.cpp @@ -250,7 +250,7 @@ BaselineCompiler::compile() for (size_t i = 0; i < icLoadLabels_.length(); i++) { CodeOffset label = icLoadLabels_[i].label; size_t icEntry = icLoadLabels_[i].icEntry; - ICEntry* entryAddr = &(baselineScript->icEntry(icEntry)); + BaselineICEntry* entryAddr = &(baselineScript->icEntry(icEntry)); Assembler::PatchDataWithValueCheck(CodeLocationLabel(code, label), ImmPtr(entryAddr), ImmPtr((void*)-1)); @@ -499,7 +499,7 @@ BaselineCompiler::emitOutOfLinePostBarrierSlot() bool BaselineCompiler::emitIC(ICStub* stub, ICEntry::Kind kind) { - ICEntry* entry = allocateICEntry(stub, kind); + BaselineICEntry* entry = allocateICEntry(stub, kind); if (!entry) return false; diff --git a/js/src/jit/BaselineDebugModeOSR.cpp b/js/src/jit/BaselineDebugModeOSR.cpp index a83841c41cd1..889f44dc9b70 100644 --- a/js/src/jit/BaselineDebugModeOSR.cpp +++ b/js/src/jit/BaselineDebugModeOSR.cpp @@ -219,7 +219,7 @@ CollectJitStackScripts(JSContext* cx, const Debugger::ExecutionObservableSet& ob } else { // The frame must be settled on a pc with an ICEntry. uint8_t* retAddr = iter.returnAddressToFp(); - ICEntry& icEntry = script->baselineScript()->icEntryFromReturnAddress(retAddr); + BaselineICEntry& icEntry = script->baselineScript()->icEntryFromReturnAddress(retAddr); if (!entries.append(DebugModeOSREntry(script, icEntry))) return false; } @@ -493,7 +493,7 @@ PatchBaselineFramesForDebugMode(JSContext* cx, const Debugger::ExecutionObservab // callVMs which can trigger debug mode OSR are the *only* // callVMs generated for their respective pc locations in the // baseline JIT code. - ICEntry& callVMEntry = bl->callVMEntryFromPCOffset(pcOffset); + BaselineICEntry& callVMEntry = bl->callVMEntryFromPCOffset(pcOffset); recompInfo->resumeAddr = bl->returnAddressForIC(callVMEntry); popFrameReg = false; break; @@ -505,7 +505,7 @@ PatchBaselineFramesForDebugMode(JSContext* cx, const Debugger::ExecutionObservab // Patching mechanism is identical to a CallVM. This is // handled especially only because the warmup counter VM call is // part of the prologue, and not tied an opcode. - ICEntry& warmupCountEntry = bl->warmupCountICEntry(); + BaselineICEntry& warmupCountEntry = bl->warmupCountICEntry(); recompInfo->resumeAddr = bl->returnAddressForIC(warmupCountEntry); popFrameReg = false; break; @@ -519,7 +519,7 @@ PatchBaselineFramesForDebugMode(JSContext* cx, const Debugger::ExecutionObservab // handled especially only because the stack check VM call is // part of the prologue, and not tied an opcode. bool earlyCheck = kind == ICEntry::Kind_EarlyStackCheck; - ICEntry& stackCheckEntry = bl->stackCheckICEntry(earlyCheck); + BaselineICEntry& stackCheckEntry = bl->stackCheckICEntry(earlyCheck); recompInfo->resumeAddr = bl->returnAddressForIC(stackCheckEntry); popFrameReg = false; break; diff --git a/js/src/jit/BaselineInspector.h b/js/src/jit/BaselineInspector.h index 5e08bb47d4a4..961df18aa2dd 100644 --- a/js/src/jit/BaselineInspector.h +++ b/js/src/jit/BaselineInspector.h @@ -45,7 +45,7 @@ class BaselineInspector { private: JSScript* script; - ICEntry* prevLookedUpEntry; + BaselineICEntry* prevLookedUpEntry; public: explicit BaselineInspector(JSScript* script) @@ -69,10 +69,11 @@ class BaselineInspector } #endif - ICEntry& icEntryFromPC(jsbytecode* pc) { + BaselineICEntry& icEntryFromPC(jsbytecode* pc) { MOZ_ASSERT(hasBaselineScript()); MOZ_ASSERT(isValidPC(pc)); - ICEntry& ent = baselineScript()->icEntryFromPCOffset(script->pcToOffset(pc), prevLookedUpEntry); + BaselineICEntry& ent = + baselineScript()->icEntryFromPCOffset(script->pcToOffset(pc), prevLookedUpEntry); MOZ_ASSERT(ent.isForOp()); prevLookedUpEntry = &ent; return ent; @@ -80,7 +81,7 @@ class BaselineInspector template ICInspectorType makeICInspector(jsbytecode* pc, ICStub::Kind expectedFallbackKind) { - ICEntry* ent = nullptr; + BaselineICEntry* ent = nullptr; if (hasBaselineScript()) { ent = &icEntryFromPC(pc); MOZ_ASSERT(ent->fallbackStub()->kind() == expectedFallbackKind); diff --git a/js/src/jit/BaselineJIT.cpp b/js/src/jit/BaselineJIT.cpp index 341a2cb9b884..cb8a9a8a6918 100644 --- a/js/src/jit/BaselineJIT.cpp +++ b/js/src/jit/BaselineJIT.cpp @@ -411,7 +411,7 @@ BaselineScript::New(JSScript* jsscript, { static const unsigned DataAlignment = sizeof(uintptr_t); - size_t icEntriesSize = icEntries * sizeof(ICEntry); + size_t icEntriesSize = icEntries * sizeof(BaselineICEntry); size_t pcMappingIndexEntriesSize = pcMappingIndexEntries * sizeof(PCMappingIndexEntry); size_t bytecodeTypeMapSize = bytecodeTypeMapEntries * sizeof(uint32_t); size_t yieldEntriesSize = yieldEntries * sizeof(uintptr_t); @@ -475,7 +475,7 @@ BaselineScript::trace(JSTracer* trc) // Mark all IC stub codes hanging off the IC stub entries. for (size_t i = 0; i < numICEntries(); i++) { - ICEntry& ent = icEntry(i); + BaselineICEntry& ent = icEntry(i); ent.trace(trc); } } @@ -570,7 +570,7 @@ BaselineScript::removeDependentWasmImport(wasm::Instance& instance, uint32_t idx } } -ICEntry& +BaselineICEntry& BaselineScript::icEntry(size_t index) { MOZ_ASSERT(index < numICEntries()); @@ -603,12 +603,12 @@ struct ICEntries explicit ICEntries(BaselineScript* baseline) : baseline_(baseline) {} - ICEntry& operator[](size_t index) const { + BaselineICEntry& operator[](size_t index) const { return baseline_->icEntry(index); } }; -ICEntry& +BaselineICEntry& BaselineScript::icEntryFromReturnOffset(CodeOffset returnOffset) { size_t loc; @@ -616,7 +616,7 @@ BaselineScript::icEntryFromReturnOffset(CodeOffset returnOffset) bool found = #endif BinarySearchIf(ICEntries(this), 0, numICEntries(), - [&returnOffset](ICEntry& entry) { + [&returnOffset](BaselineICEntry& entry) { size_t roffset = returnOffset.offset(); size_t entryRoffset = entry.returnOffset().offset(); if (roffset < entryRoffset) @@ -638,7 +638,7 @@ ComputeBinarySearchMid(BaselineScript* baseline, uint32_t pcOffset) { size_t loc; BinarySearchIf(ICEntries(baseline), 0, baseline->numICEntries(), - [pcOffset](ICEntry& entry) { + [pcOffset](BaselineICEntry& entry) { uint32_t entryOffset = entry.pcOffset(); if (pcOffset < entryOffset) return -1; @@ -651,12 +651,12 @@ ComputeBinarySearchMid(BaselineScript* baseline, uint32_t pcOffset) } uint8_t* -BaselineScript::returnAddressForIC(const ICEntry& ent) +BaselineScript::returnAddressForIC(const BaselineICEntry& ent) { return method()->raw() + ent.returnOffset().offset(); } -ICEntry& +BaselineICEntry& BaselineScript::icEntryFromPCOffset(uint32_t pcOffset) { // Multiple IC entries can have the same PC offset, but this method only looks for @@ -677,17 +677,17 @@ BaselineScript::icEntryFromPCOffset(uint32_t pcOffset) MOZ_CRASH("Invalid PC offset for IC entry."); } -ICEntry& -BaselineScript::icEntryFromPCOffset(uint32_t pcOffset, ICEntry* prevLookedUpEntry) +BaselineICEntry& +BaselineScript::icEntryFromPCOffset(uint32_t pcOffset, BaselineICEntry* prevLookedUpEntry) { // Do a linear forward search from the last queried PC offset, or fallback to a // binary search if the last offset is too far away. if (prevLookedUpEntry && pcOffset >= prevLookedUpEntry->pcOffset() && (pcOffset - prevLookedUpEntry->pcOffset()) <= 10) { - ICEntry* firstEntry = &icEntry(0); - ICEntry* lastEntry = &icEntry(numICEntries() - 1); - ICEntry* curEntry = prevLookedUpEntry; + BaselineICEntry* firstEntry = &icEntry(0); + BaselineICEntry* lastEntry = &icEntry(numICEntries() - 1); + BaselineICEntry* curEntry = prevLookedUpEntry; while (curEntry >= firstEntry && curEntry <= lastEntry) { if (curEntry->pcOffset() == pcOffset && curEntry->isForOp()) break; @@ -700,7 +700,7 @@ BaselineScript::icEntryFromPCOffset(uint32_t pcOffset, ICEntry* prevLookedUpEntr return icEntryFromPCOffset(pcOffset); } -ICEntry& +BaselineICEntry& BaselineScript::callVMEntryFromPCOffset(uint32_t pcOffset) { // Like icEntryFromPCOffset, but only looks for the fake ICEntries @@ -718,7 +718,7 @@ BaselineScript::callVMEntryFromPCOffset(uint32_t pcOffset) MOZ_CRASH("Invalid PC offset for callVM entry."); } -ICEntry& +BaselineICEntry& BaselineScript::stackCheckICEntry(bool earlyCheck) { // The stack check will always be at offset 0, so just do a linear search @@ -733,7 +733,7 @@ BaselineScript::stackCheckICEntry(bool earlyCheck) MOZ_CRASH("No stack check ICEntry found."); } -ICEntry& +BaselineICEntry& BaselineScript::warmupCountICEntry() { // The stack check will be at a very low offset, so just do a linear search @@ -745,7 +745,7 @@ BaselineScript::warmupCountICEntry() MOZ_CRASH("No warmup count ICEntry found."); } -ICEntry& +BaselineICEntry& BaselineScript::icEntryFromReturnAddress(uint8_t* returnAddr) { MOZ_ASSERT(returnAddr > method_->raw()); @@ -766,12 +766,12 @@ BaselineScript::copyYieldEntries(JSScript* script, Vector& yieldOffset } void -BaselineScript::copyICEntries(JSScript* script, const ICEntry* entries, MacroAssembler& masm) +BaselineScript::copyICEntries(JSScript* script, const BaselineICEntry* entries, MacroAssembler& masm) { // Fix up the return offset in the IC entries and copy them in. // Also write out the IC entry ptrs in any fallback stubs that were added. for (uint32_t i = 0; i < numICEntries(); i++) { - ICEntry& realEntry = icEntry(i); + BaselineICEntry& realEntry = icEntry(i); realEntry = entries[i]; if (!realEntry.hasStub()) { @@ -1076,7 +1076,7 @@ BaselineScript::purgeOptimizedStubs(Zone* zone) JitSpew(JitSpew_BaselineIC, "Purging optimized stubs"); for (size_t i = 0; i < numICEntries(); i++) { - ICEntry& entry = icEntry(i); + BaselineICEntry& entry = icEntry(i); if (!entry.hasStub()) continue; @@ -1117,7 +1117,7 @@ BaselineScript::purgeOptimizedStubs(Zone* zone) #ifdef DEBUG // All remaining stubs must be allocated in the fallback space. for (size_t i = 0; i < numICEntries(); i++) { - ICEntry& entry = icEntry(i); + BaselineICEntry& entry = icEntry(i); if (!entry.hasStub()) continue; diff --git a/js/src/jit/BaselineJIT.h b/js/src/jit/BaselineJIT.h index 81d595e10b21..049f68fe3228 100644 --- a/js/src/jit/BaselineJIT.h +++ b/js/src/jit/BaselineJIT.h @@ -22,7 +22,7 @@ namespace js { namespace jit { class StackValue; -class ICEntry; +class BaselineICEntry; class ICStub; class PCMappingSlotInfo @@ -340,8 +340,8 @@ struct BaselineScript return method_->raw() + postDebugPrologueOffset_; } - ICEntry* icEntryList() { - return (ICEntry*)(reinterpret_cast(this) + icEntriesOffset_); + BaselineICEntry* icEntryList() { + return (BaselineICEntry*)(reinterpret_cast(this) + icEntriesOffset_); } uint8_t** yieldEntryList() { return (uint8_t**)(reinterpret_cast(this) + yieldEntriesOffset_); @@ -380,21 +380,21 @@ struct BaselineScript return method()->raw() <= addr && addr <= method()->raw() + method()->instructionsSize(); } - ICEntry& icEntry(size_t index); - ICEntry& icEntryFromReturnOffset(CodeOffset returnOffset); - ICEntry& icEntryFromPCOffset(uint32_t pcOffset); - ICEntry& icEntryFromPCOffset(uint32_t pcOffset, ICEntry* prevLookedUpEntry); - ICEntry& callVMEntryFromPCOffset(uint32_t pcOffset); - ICEntry& stackCheckICEntry(bool earlyCheck); - ICEntry& warmupCountICEntry(); - ICEntry& icEntryFromReturnAddress(uint8_t* returnAddr); - uint8_t* returnAddressForIC(const ICEntry& ent); + BaselineICEntry& icEntry(size_t index); + BaselineICEntry& icEntryFromReturnOffset(CodeOffset returnOffset); + BaselineICEntry& icEntryFromPCOffset(uint32_t pcOffset); + BaselineICEntry& icEntryFromPCOffset(uint32_t pcOffset, BaselineICEntry* prevLookedUpEntry); + BaselineICEntry& callVMEntryFromPCOffset(uint32_t pcOffset); + BaselineICEntry& stackCheckICEntry(bool earlyCheck); + BaselineICEntry& warmupCountICEntry(); + BaselineICEntry& icEntryFromReturnAddress(uint8_t* returnAddr); + uint8_t* returnAddressForIC(const BaselineICEntry& ent); size_t numICEntries() const { return icEntries_; } - void copyICEntries(JSScript* script, const ICEntry* entries, MacroAssembler& masm); + void copyICEntries(JSScript* script, const BaselineICEntry* entries, MacroAssembler& masm); void adoptFallbackStubs(FallbackICStubSpace* stubSpace); void copyYieldEntries(JSScript* script, Vector& yieldOffsets); diff --git a/js/src/jit/Ion.cpp b/js/src/jit/Ion.cpp index 2a79ac42b7ab..39954b0b5c2b 100644 --- a/js/src/jit/Ion.cpp +++ b/js/src/jit/Ion.cpp @@ -1029,7 +1029,7 @@ IonScript::trace(JSTracer* trc) // Mark all IC stub codes hanging off the IC stub entries. for (size_t i = 0; i < numSharedStubs(); i++) { - ICEntry& ent = sharedStubList()[i]; + IonICEntry& ent = sharedStubList()[i]; ent.trace(trc); } @@ -1261,7 +1261,7 @@ void IonScript::purgeOptimizedStubs(Zone* zone) { for (size_t i = 0; i < numSharedStubs(); i++) { - ICEntry& entry = sharedStubList()[i]; + IonICEntry& entry = sharedStubList()[i]; if (!entry.hasStub()) continue; @@ -1306,7 +1306,7 @@ IonScript::purgeOptimizedStubs(Zone* zone) #ifdef DEBUG // All remaining stubs must be allocated in the fallback space. for (size_t i = 0; i < numSharedStubs(); i++) { - ICEntry& entry = sharedStubList()[i]; + IonICEntry& entry = sharedStubList()[i]; if (!entry.hasStub()) continue; diff --git a/js/src/jit/SharedIC.cpp b/js/src/jit/SharedIC.cpp index dd59df382b21..1c227439e349 100644 --- a/js/src/jit/SharedIC.cpp +++ b/js/src/jit/SharedIC.cpp @@ -96,7 +96,20 @@ ICEntry::fallbackStub() const } void -ICEntry::trace(JSTracer* trc) +IonICEntry::trace(JSTracer* trc) +{ + TraceManuallyBarrieredEdge(trc, &script_, "IonICEntry::script_"); + traceEntry(trc); +} + +void +BaselineICEntry::trace(JSTracer* trc) +{ + traceEntry(trc); +} + +void +ICEntry::traceEntry(JSTracer* trc) { if (!hasStub()) return; diff --git a/js/src/jit/SharedIC.h b/js/src/jit/SharedIC.h index 5399c3d3379d..b8e081688897 100644 --- a/js/src/jit/SharedIC.h +++ b/js/src/jit/SharedIC.h @@ -337,6 +337,17 @@ class ICEntry return &firstStub_; } + protected: + void traceEntry(JSTracer* trc); +}; + +class BaselineICEntry : public ICEntry +{ + public: + BaselineICEntry(uint32_t pcOffset, Kind kind) + : ICEntry(pcOffset, kind) + { } + void trace(JSTracer* trc); }; @@ -353,6 +364,8 @@ class IonICEntry : public ICEntry JSScript* script() { return script_; } + + void trace(JSTracer* trc); }; class ICMonitoredStub; diff --git a/js/src/jit/shared/BaselineCompiler-shared.h b/js/src/jit/shared/BaselineCompiler-shared.h index 56f9166cf214..7d1402a9d0cf 100644 --- a/js/src/jit/shared/BaselineCompiler-shared.h +++ b/js/src/jit/shared/BaselineCompiler-shared.h @@ -31,7 +31,7 @@ class BaselineCompilerShared FrameInfo frame; FallbackICStubSpace stubSpace_; - js::Vector icEntries_; + js::Vector icEntries_; // Stores the native code offset for a bytecode pc. struct PCMappingEntry @@ -71,16 +71,16 @@ class BaselineCompilerShared BaselineCompilerShared(JSContext* cx, TempAllocator& alloc, JSScript* script); - ICEntry* allocateICEntry(ICStub* stub, ICEntry::Kind kind) { + BaselineICEntry* allocateICEntry(ICStub* stub, ICEntry::Kind kind) { if (!stub) return nullptr; // Create the entry and add it to the vector. - if (!icEntries_.append(ICEntry(script->pcToOffset(pc), kind))) { + if (!icEntries_.append(BaselineICEntry(script->pcToOffset(pc), kind))) { ReportOutOfMemory(cx); return nullptr; } - ICEntry& vecEntry = icEntries_.back(); + BaselineICEntry& vecEntry = icEntries_.back(); // Set the first stub for the IC entry to the fallback stub vecEntry.setFirstStub(stub); @@ -91,7 +91,7 @@ class BaselineCompilerShared // Append an ICEntry without a stub. bool appendICEntry(ICEntry::Kind kind, uint32_t returnOffset) { - ICEntry entry(script->pcToOffset(pc), kind); + BaselineICEntry entry(script->pcToOffset(pc), kind); entry.setReturnOffset(CodeOffset(returnOffset)); if (!icEntries_.append(entry)) { ReportOutOfMemory(cx); diff --git a/js/src/js.msg b/js/src/js.msg index 207ce7be1f9e..551781d1c0bf 100644 --- a/js/src/js.msg +++ b/js/src/js.msg @@ -179,7 +179,7 @@ MSG_DEF(JSMSG_UNKNOWN_FORMAT, 1, JSEXN_INTERNALERR, "unknown bytecode f // Frontend MSG_DEF(JSMSG_ACCESSOR_WRONG_ARGS, 3, JSEXN_SYNTAXERR, "{0} functions must have {1} argument{2}") MSG_DEF(JSMSG_ARRAY_COMP_LEFTSIDE, 0, JSEXN_SYNTAXERR, "invalid array comprehension left-hand side") -MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 0, JSEXN_INTERNALERR, "array initialiser too large") +MSG_DEF(JSMSG_ARRAY_INIT_TOO_BIG, 0, JSEXN_INTERNALERR, "array initializer too large") MSG_DEF(JSMSG_AS_AFTER_IMPORT_STAR, 0, JSEXN_SYNTAXERR, "missing keyword 'as' after import *") MSG_DEF(JSMSG_AS_AFTER_RESERVED_WORD, 1, JSEXN_SYNTAXERR, "missing keyword 'as' after reserved word '{0}'") MSG_DEF(JSMSG_BAD_ANON_GENERATOR_RETURN, 0, JSEXN_TYPEERR, "anonymous generator function returns a value") @@ -202,6 +202,7 @@ MSG_DEF(JSMSG_BAD_INCOP_OPERAND, 0, JSEXN_REFERENCEERR, "invalid increment MSG_DEF(JSMSG_BAD_METHOD_DEF, 0, JSEXN_SYNTAXERR, "bad method definition") MSG_DEF(JSMSG_BAD_OCTAL, 1, JSEXN_SYNTAXERR, "{0} is not a legal ECMA-262 octal constant") MSG_DEF(JSMSG_BAD_OPERAND, 1, JSEXN_SYNTAXERR, "invalid {0} operand") +MSG_DEF(JSMSG_BAD_POW_LEFTSIDE, 0, JSEXN_SYNTAXERR, "unparenthesized unary expression can't appear on the left-hand side of '**'") MSG_DEF(JSMSG_BAD_PROP_ID, 0, JSEXN_SYNTAXERR, "invalid property id") MSG_DEF(JSMSG_BAD_RETURN_OR_YIELD, 1, JSEXN_SYNTAXERR, "{0} not in function") MSG_DEF(JSMSG_BAD_STRICT_ASSIGN, 1, JSEXN_SYNTAXERR, "'{0}' can't be defined or assigned to in strict mode code") @@ -258,7 +259,6 @@ MSG_DEF(JSMSG_ILLEGAL_CHARACTER, 0, JSEXN_SYNTAXERR, "illegal character") MSG_DEF(JSMSG_IMPORT_DECL_AT_TOP_LEVEL, 0, JSEXN_SYNTAXERR, "import declarations may only appear at top level of a module") MSG_DEF(JSMSG_INVALID_FOR_IN_DECL_WITH_INIT,0,JSEXN_SYNTAXERR,"for-in loop head declarations may not have initializers") MSG_DEF(JSMSG_LABEL_NOT_FOUND, 0, JSEXN_SYNTAXERR, "label not found") -MSG_DEF(JSMSG_LET_CLASS_BINDING, 0, JSEXN_SYNTAXERR, "'let' is not a valid name for a class") MSG_DEF(JSMSG_LET_COMP_BINDING, 0, JSEXN_SYNTAXERR, "'let' is not a valid name for a comprehension variable") MSG_DEF(JSMSG_LEXICAL_DECL_NOT_IN_BLOCK, 1, JSEXN_SYNTAXERR, "{0} declaration not directly within block") MSG_DEF(JSMSG_LEXICAL_DECL_LABEL, 1, JSEXN_SYNTAXERR, "{0} declarations cannot be labelled") @@ -266,6 +266,7 @@ MSG_DEF(JSMSG_GENERATOR_LABEL, 0, JSEXN_SYNTAXERR, "generator functions MSG_DEF(JSMSG_FUNCTION_LABEL, 0, JSEXN_SYNTAXERR, "functions cannot be labelled") MSG_DEF(JSMSG_SLOPPY_FUNCTION_LABEL, 0, JSEXN_SYNTAXERR, "functions can only be labelled inside blocks") MSG_DEF(JSMSG_LINE_BREAK_AFTER_THROW, 0, JSEXN_SYNTAXERR, "no line break is allowed between 'throw' and its expression") +MSG_DEF(JSMSG_LINE_BREAK_BEFORE_ARROW, 0, JSEXN_SYNTAXERR, "no line break is allowed before '=>'") MSG_DEF(JSMSG_MALFORMED_ESCAPE, 1, JSEXN_SYNTAXERR, "malformed {0} character escape sequence") MSG_DEF(JSMSG_MISSING_BINARY_DIGITS, 0, JSEXN_SYNTAXERR, "missing binary digits after '0b'") MSG_DEF(JSMSG_MISSING_EXPONENT, 0, JSEXN_SYNTAXERR, "missing exponent") diff --git a/js/src/jsfun.h b/js/src/jsfun.h index bb901495b1da..0eca8ef32c81 100644 --- a/js/src/jsfun.h +++ b/js/src/jsfun.h @@ -765,6 +765,8 @@ inline void JSFunction::setExtendedSlot(size_t which, const js::Value& val) { MOZ_ASSERT(which < mozilla::ArrayLength(toExtended()->extendedSlots)); + MOZ_ASSERT_IF(js::IsMarkedBlack(this) && val.isMarkable(), + !JS::GCThingIsMarkedGray(JS::GCCellPtr(val))); toExtended()->extendedSlots[which] = val; } diff --git a/js/src/old-configure.in b/js/src/old-configure.in index da106064b871..825533838cfa 100644 --- a/js/src/old-configure.in +++ b/js/src/old-configure.in @@ -750,6 +750,10 @@ case "$target" in dnl If nothing, compiler sometimes causes C1041 error. CFLAGS="$CFLAGS -FS" CXXFLAGS="$CXXFLAGS -FS" + dnl VS2013+ supports -Gw for better linker optimizations. + dnl http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx + CFLAGS="$CFLAGS -Gw" + CXXFLAGS="$CXXFLAGS -Gw" # khuey says we can safely ignore MSVC warning C4251 # MSVC warning C4244 (implicit type conversion may lose data) warns # and requires workarounds for perfectly valid code. Also, GCC/clang diff --git a/js/src/tests/Makefile.in b/js/src/tests/Makefile.in index 04b9194619e6..ad4181b6efa6 100644 --- a/js/src/tests/Makefile.in +++ b/js/src/tests/Makefile.in @@ -19,6 +19,7 @@ TEST_FILES = \ ecma_5/ \ ecma_6/ \ ecma_7/ \ + ecma_2017/ \ Intl/ \ js1_1/ \ js1_2/ \ diff --git a/js/src/tests/ecma_2017/Expressions/browser.js b/js/src/tests/ecma_2017/Expressions/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_2017/Expressions/shell.js b/js/src/tests/ecma_2017/Expressions/shell.js new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/js/src/tests/ecma_2017/Expressions/shell.js @@ -0,0 +1 @@ + diff --git a/js/src/tests/ecma_2017/Expressions/trailing_comma_arguments.js b/js/src/tests/ecma_2017/Expressions/trailing_comma_arguments.js new file mode 100644 index 000000000000..612fd46a130e --- /dev/null +++ b/js/src/tests/ecma_2017/Expressions/trailing_comma_arguments.js @@ -0,0 +1,85 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Trailing comma in Arguments production. + +// 12.3 Left-Hand-Side Expressions +// Arguments[Yield]: +// () +// ( ArgumentList[?Yield] ) +// ( ArgumentList[?Yield] , ) + + +function argsLength() { + return {value: arguments.length}; +} +function sum(...rest) { + return {value: rest.reduce((a, c) => a + c, 0)}; +} + +function call(f, argList) { + return eval(`(${f}(${argList})).value`); +} + +function newCall(F, argList) { + return eval(`(new ${F}(${argList})).value`); +} + +function superCall(superClass, argList) { + return eval(`(new class extends ${superClass} { + constructor() { + super(${argList}); + } + }).value`); +} + +// Ensure the correct number of arguments is passed. +for (let type of [call, newCall, superCall]) { + let test = type.bind(null, "argsLength"); + + assertEq(test("10, "), 1); + assertEq(test("10, 20, "), 2); + assertEq(test("10, 20, 30, "), 3); + assertEq(test("10, 20, 30, 40, "), 4); + + assertEq(test("...[10, 20], "), 2); + assertEq(test("...[10, 20], 30, "), 3); + assertEq(test("...[10, 20], ...[30], "), 3); +} + +// Ensure the arguments themselves are passed correctly. +for (let type of [call, newCall, superCall]) { + let test = type.bind(null, "sum"); + + assertEq(test("10, "), 10); + assertEq(test("10, 20, "), 30); + assertEq(test("10, 20, 30, "), 60); + assertEq(test("10, 20, 30, 40, "), 100); + + assertEq(test("...[10, 20], "), 30); + assertEq(test("...[10, 20], 30, "), 60); + assertEq(test("...[10, 20], ...[30], "), 60); +} + +// Error cases. +for (let type of [call, newCall, superCall]) { + let test = type.bind(null, "f"); + + // Trailing comma in empty arguments list. + assertThrowsInstanceOf(() => test(","), SyntaxError); + + // Leading comma. + assertThrowsInstanceOf(() => test(", a"), SyntaxError); + assertThrowsInstanceOf(() => test(", ...a"), SyntaxError); + + // Multiple trailing comma. + assertThrowsInstanceOf(() => test("a, , "), SyntaxError); + assertThrowsInstanceOf(() => test("...a, , "), SyntaxError); + + // Elision. + assertThrowsInstanceOf(() => test("a, , b"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_2017/Expressions/trailing_comma_arrow.js b/js/src/tests/ecma_2017/Expressions/trailing_comma_arrow.js new file mode 100644 index 000000000000..f36b476ef4e4 --- /dev/null +++ b/js/src/tests/ecma_2017/Expressions/trailing_comma_arrow.js @@ -0,0 +1,108 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Trailing comma in CoverParenthesizedExpressionAndArrowParameterList production. + +// 12.2 Primary Expression +// CoverParenthesizedExpressionAndArrowParameterList[Yield]: +// ( Expression[In, ?Yield] ) +// ( Expression[In, ?Yield] , ) +// () +// ( ...BindingIdentifier[?Yield] ) +// ( Expression[In, ?Yield] , ...BindingIdentifier[?Yield] ) + + +function arrow(argList, parameters = "", returnExpr = "") { + return eval(` + let fun = (${argList}) => { + return ${returnExpr}; + } + fun(${parameters}); + `); +} + +function arrowConcise(argList, parameters = "", returnExpr = "null") { + return eval(` + let fun = (${argList}) => ${returnExpr}; + fun(${parameters}); + `); +} + +const tests = [ + arrow, + arrowConcise, +]; + +// Ensure parameters are passed correctly. +for (let test of tests) { + assertEq(test("a, ", "10", "a"), 10); + assertEq(test("a, b, ", "10, 20", "a + b"), 30); + assertEq(test("a = 30, ", "", "a"), 30); + assertEq(test("a = 30, b = 40, ", "", "a + b"), 70); + + assertEq(test("[a], ", "[10]", "a"), 10); + assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30); + assertEq(test("[a] = [30], ", "", "a"), 30); + assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70); + + assertEq(test("{a}, ", "{a: 10}", "a"), 10); + assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30); + assertEq(test("{a} = {a: 30}, ", "", "a"), 30); + assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70); +} + +// Ensure function length doesn't change. +for (let test of tests) { + assertEq(test("a, ", "", "fun.length"), 1); + assertEq(test("a, b, ", "", "fun.length"), 2); + + assertEq(test("[a], ", "[]", "fun.length"), 1); + assertEq(test("[a], [b], ", "[], []", "fun.length"), 2); + + assertEq(test("{a}, ", "{}", "fun.length"), 1); + assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2); +} + +for (let test of tests) { + // Trailing comma in empty parameters list. + assertThrowsInstanceOf(() => test(","), SyntaxError); + + // Leading comma. + assertThrowsInstanceOf(() => test(", a"), SyntaxError); + assertThrowsInstanceOf(() => test(", ...a"), SyntaxError); + + // Multiple trailing comma. + assertThrowsInstanceOf(() => test("a, , "), SyntaxError); + assertThrowsInstanceOf(() => test("a..., , "), SyntaxError); + + // Trailing comma after rest parameter. + assertThrowsInstanceOf(() => test("...a, "), SyntaxError); + assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError); + + // Elision. + assertThrowsInstanceOf(() => test("a, , b"), SyntaxError); +} + +// Trailing comma in non-parenthesized arrow head. +assertThrowsInstanceOf(() => eval("a, => {}"), SyntaxError); +assertThrowsInstanceOf(() => eval("a, => null"), SyntaxError); + +// Parenthesized expression is not an arrow function expression. +for (let trail of ["", ";", "\n => {}"]) { + assertThrowsInstanceOf(() => eval("(a,)" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(a, b,)" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(...a, )" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(a, ...b, )" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(a, , b)" + trail), SyntaxError); + + assertThrowsInstanceOf(() => eval("(,)" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(, a)" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(, ...a)" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(a, , )" + trail), SyntaxError); + assertThrowsInstanceOf(() => eval("(...a, , )" + trail), SyntaxError); +} + + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_2017/Expressions/trailing_comma_getter_setter.js b/js/src/tests/ecma_2017/Expressions/trailing_comma_getter_setter.js new file mode 100644 index 000000000000..258dd8df61fe --- /dev/null +++ b/js/src/tests/ecma_2017/Expressions/trailing_comma_getter_setter.js @@ -0,0 +1,88 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Trailing comma is not allowed in getter and setter methods + +// 14.3 Method Definitions +// MethodDefinition[Yield]: +// get PropertyName[?Yield] () { FunctionBody[~Yield] } +// set PropertyName[?Yield] ( PropertySetParameterList ) { FunctionBody[~Yield] } +// PropertySetParameterList: +// FormalParameter[~Yield] + +function objectGetter(argList) { + return eval(`({ + get m(${argList}) {} + })`); +} + +function objectSetter(argList) { + return eval(`({ + set m(${argList}) {} + })`); +} + +function classGetter(argList) { + return eval(`(class { + get m(${argList}) {} + })`); +} + +function classStaticGetter(argList) { + return eval(`(class { + static get m(${argList}) {} + })`); +} + +function classSetter(argList) { + return eval(`(class { + set m(${argList}) {} + })`); +} + +function classStaticSetter(argList) { + return eval(`(class { + static set m(${argList}) {} + })`); +} + +const tests = [ + objectGetter, + objectSetter, + classGetter, + classStaticGetter, + classSetter, + classStaticSetter, +]; + +for (let test of tests) { + // Trailing comma. + assertThrowsInstanceOf(() => test("a, "), SyntaxError); + assertThrowsInstanceOf(() => test("[], "), SyntaxError); + assertThrowsInstanceOf(() => test("{}, "), SyntaxError); + assertThrowsInstanceOf(() => test("a = 0, "), SyntaxError); + assertThrowsInstanceOf(() => test("[] = [], "), SyntaxError); + assertThrowsInstanceOf(() => test("{} = {}, "), SyntaxError); + + // Trailing comma in empty parameters list. + assertThrowsInstanceOf(() => test(","), SyntaxError); + + // Leading comma. + assertThrowsInstanceOf(() => test(", a"), SyntaxError); + assertThrowsInstanceOf(() => test(", ...a"), SyntaxError); + + // Multiple trailing comma. + assertThrowsInstanceOf(() => test("a, ,"), SyntaxError); + assertThrowsInstanceOf(() => test("a..., ,"), SyntaxError); + + // Trailing comma after rest parameter. + assertThrowsInstanceOf(() => test("...a ,"), SyntaxError); + assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError); + + // Elision. + assertThrowsInstanceOf(() => test("a, , b"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_2017/Expressions/trailing_comma_parameters.js b/js/src/tests/ecma_2017/Expressions/trailing_comma_parameters.js new file mode 100644 index 000000000000..d0e756b8622e --- /dev/null +++ b/js/src/tests/ecma_2017/Expressions/trailing_comma_parameters.js @@ -0,0 +1,165 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Trailing comma in functions and methods. + +// 14.1 Function Definitions +// FunctionExpression: +// function BindingIdentifier[~Yield]opt ( FormalParameters[~Yield] ) { FunctionBody[~Yield] } + +// 14.3 Method Definitions +// MethodDefinition[Yield]: +// PropertyName[?Yield] ( UniqueFormalParameters[~Yield] ) { FunctionBody[~Yield] } +// GeneratorMethod[?Yield] +// PropertySetParameterList: +// FormalParameter[~Yield] + +// 14.4 Generator Function Definitions +// GeneratorExpression: +// function * BindingIdentifier[+Yield]opt ( FormalParameters[+Yield] ) { GeneratorBody } +// GeneratorMethod[Yield]: +// * PropertyName[?Yield] ( UniqueFormalParameters[+Yield] ) { GeneratorBody } + + +function functionExpression(argList, parameters = "", returnExpr = "") { + return eval(`(function f(${argList}) { + var fun = f; + return ${returnExpr}; + })(${parameters})`); +} + +function generatorExpression(argList, parameters = "", returnExpr = "") { + return eval(`(function* f(${argList}) { + var fun = f; + return ${returnExpr}; + })(${parameters}).next().value`); +} + +function objectMethod(argList, parameters = "", returnExpr = "") { + return eval(`({ + m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters})`); +} + +function objectGeneratorMethod(argList, parameters = "", returnExpr = "") { + return eval(`({ + * m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters}).next().value`); +} + +function classMethod(argList, parameters = "", returnExpr = "") { + return eval(`(new class { + m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters})`); +} + +function classStaticMethod(argList, parameters = "", returnExpr = "") { + return eval(`(class { + static m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters})`); +} + +function classGeneratorMethod(argList, parameters = "", returnExpr = "") { + return eval(`(new class { + * m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters}).next().value`); +} + +function classStaticGeneratorMethod(argList, parameters = "", returnExpr = "") { + return eval(`(class { + static * m(${argList}) { + var fun = this.m; + return ${returnExpr}; + } + }).m(${parameters}).next().value`); +} + +function classConstructorMethod(argList, parameters = "", returnExpr = "null") { + return eval(`new (class { + constructor(${argList}) { + var fun = this.constructor; + return { value: ${returnExpr} }; + } + })(${parameters}).value`); +} + +const tests = [ + functionExpression, + generatorExpression, + objectMethod, + objectGeneratorMethod, + classMethod, + classStaticMethod, + classGeneratorMethod, + classStaticGeneratorMethod, + classConstructorMethod, +]; + +// Ensure parameters are passed correctly. +for (let test of tests) { + assertEq(test("a, ", "10", "a"), 10); + assertEq(test("a, b, ", "10, 20", "a + b"), 30); + assertEq(test("a = 30, ", "", "a"), 30); + assertEq(test("a = 30, b = 40, ", "", "a + b"), 70); + + assertEq(test("[a], ", "[10]", "a"), 10); + assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30); + assertEq(test("[a] = [30], ", "", "a"), 30); + assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70); + + assertEq(test("{a}, ", "{a: 10}", "a"), 10); + assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30); + assertEq(test("{a} = {a: 30}, ", "", "a"), 30); + assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70); +} + +// Ensure function length doesn't change. +for (let test of tests) { + assertEq(test("a, ", "", "fun.length"), 1); + assertEq(test("a, b, ", "", "fun.length"), 2); + + assertEq(test("[a], ", "[]", "fun.length"), 1); + assertEq(test("[a], [b], ", "[], []", "fun.length"), 2); + + assertEq(test("{a}, ", "{}", "fun.length"), 1); + assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2); +} + +for (let test of tests) { + // Trailing comma in empty parameters list. + assertThrowsInstanceOf(() => test(","), SyntaxError); + + // Leading comma. + assertThrowsInstanceOf(() => test(", a"), SyntaxError); + assertThrowsInstanceOf(() => test(", ...a"), SyntaxError); + + // Multiple trailing comma. + assertThrowsInstanceOf(() => test("a, , "), SyntaxError); + assertThrowsInstanceOf(() => test("a..., , "), SyntaxError); + + // Trailing comma after rest parameter. + assertThrowsInstanceOf(() => test("...a, "), SyntaxError); + assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError); + + // Elision. + assertThrowsInstanceOf(() => test("a, , b"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_2017/Statements/browser.js b/js/src/tests/ecma_2017/Statements/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_2017/Statements/shell.js b/js/src/tests/ecma_2017/Statements/shell.js new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/js/src/tests/ecma_2017/Statements/shell.js @@ -0,0 +1 @@ + diff --git a/js/src/tests/ecma_2017/Statements/trailing_comma_parameters.js b/js/src/tests/ecma_2017/Statements/trailing_comma_parameters.js new file mode 100644 index 000000000000..8612f7b1bf8d --- /dev/null +++ b/js/src/tests/ecma_2017/Statements/trailing_comma_parameters.js @@ -0,0 +1,92 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Trailing comma in functions and generators. + +// 14.1 Function Definitions +// FunctionDeclaration[Yield, Default]: +// function BindingIdentifier[?Yield] ( FormalParameters[~Yield] ) { FunctionBody[~Yield] } + +// 14.4 Generator Function Definitions +// GeneratorDeclaration[Yield, Default]: +// function * BindingIdentifier[?Yield] ( FormalParameters[+Yield] ) { GeneratorBody } + + +function functionDeclaration(argList, parameters = "", returnExpr = "") { + return eval(` + function f(${argList}) { + var fun = f; + return ${returnExpr}; + } + f(${parameters}); + `); +} + +function generatorDeclaration(argList, parameters = "", returnExpr = "") { + return eval(` + function* f(${argList}) { + var fun = f; + return ${returnExpr}; + } + f(${parameters}).next().value; + `); +} + +const tests = [ + functionDeclaration, + generatorDeclaration, +]; + +// Ensure parameters are passed correctly. +for (let test of tests) { + assertEq(test("a, ", "10", "a"), 10); + assertEq(test("a, b, ", "10, 20", "a + b"), 30); + assertEq(test("a = 30, ", "", "a"), 30); + assertEq(test("a = 30, b = 40, ", "", "a + b"), 70); + + assertEq(test("[a], ", "[10]", "a"), 10); + assertEq(test("[a], [b], ", "[10], [20]", "a + b"), 30); + assertEq(test("[a] = [30], ", "", "a"), 30); + assertEq(test("[a] = [30], [b] = [40], ", "", "a + b"), 70); + + assertEq(test("{a}, ", "{a: 10}", "a"), 10); + assertEq(test("{a}, {b}, ", "{a: 10}, {b: 20}", "a + b"), 30); + assertEq(test("{a} = {a: 30}, ", "", "a"), 30); + assertEq(test("{a} = {a: 30}, {b} = {b: 40}, ", "", "a + b"), 70); +} + +// Ensure function length doesn't change. +for (let test of tests) { + assertEq(test("a, ", "", "fun.length"), 1); + assertEq(test("a, b, ", "", "fun.length"), 2); + + assertEq(test("[a], ", "[]", "fun.length"), 1); + assertEq(test("[a], [b], ", "[], []", "fun.length"), 2); + + assertEq(test("{a}, ", "{}", "fun.length"), 1); + assertEq(test("{a}, {b}, ", "{}, {}", "fun.length"), 2); +} + +for (let test of tests) { + // Trailing comma in empty parameters list. + assertThrowsInstanceOf(() => test(","), SyntaxError); + + // Leading comma. + assertThrowsInstanceOf(() => test(", a"), SyntaxError); + assertThrowsInstanceOf(() => test(", ...a"), SyntaxError); + + // Multiple trailing comma. + assertThrowsInstanceOf(() => test("a, , "), SyntaxError); + assertThrowsInstanceOf(() => test("a..., , "), SyntaxError); + + // Trailing comma after rest parameter. + assertThrowsInstanceOf(() => test("...a, "), SyntaxError); + assertThrowsInstanceOf(() => test("a, ...b, "), SyntaxError); + + // Elision. + assertThrowsInstanceOf(() => test("a, , b"), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_2017/browser.js b/js/src/tests/ecma_2017/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_2017/shell.js b/js/src/tests/ecma_2017/shell.js new file mode 100644 index 000000000000..8b137891791f --- /dev/null +++ b/js/src/tests/ecma_2017/shell.js @@ -0,0 +1 @@ + diff --git a/js/src/tests/ecma_6/ArrowFunctions/browser.js b/js/src/tests/ecma_6/ArrowFunctions/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_6/ArrowFunctions/shell.js b/js/src/tests/ecma_6/ArrowFunctions/shell.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_6/ArrowFunctions/yield-in-arrow.js b/js/src/tests/ecma_6/ArrowFunctions/yield-in-arrow.js new file mode 100644 index 000000000000..8b849a1c8850 --- /dev/null +++ b/js/src/tests/ecma_6/ArrowFunctions/yield-in-arrow.js @@ -0,0 +1,77 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const yieldInParameters = [ + `(a = yield) => {}`, + `(a = yield /a/g) => {}`, // Should parse as division, not yield expression with regexp. + `yield => {};`, + `(yield) => {};`, + `(yield = 0) => {};`, + `([yield]) => {};`, + `([yield = 0]) => {};`, + `([...yield]) => {};`, + `({a: yield}) => {};`, + `({yield}) => {};`, + `({yield = 0}) => {};`, +]; + +const yieldInBody = [ + `() => yield;`, + `() => yield /a/g;`, + `() => { var x = yield; }`, + `() => { var x = yield /a/g; }`, + + `() => { var yield; };`, + `() => { var yield = 0; };`, + `() => { var [yield] = []; };`, + `() => { var [yield = 0] = []; };`, + `() => { var [...yield] = []; };`, + `() => { var {a: yield} = {}; };`, + `() => { var {yield} = {}; };`, + `() => { var {yield = 0} = {}; };`, + + `() => { let yield; };`, + `() => { let yield = 0; };`, + `() => { let [yield] = []; };`, + `() => { let [yield = 0] = []; };`, + `() => { let [...yield] = []; };`, + `() => { let {a: yield} = {}; };`, + `() => { let {yield} = {}; };`, + `() => { let {yield = 0} = {}; };`, + + `() => { const yield = 0; };`, + `() => { const [yield] = []; };`, + `() => { const [yield = 0] = []; };`, + `() => { const [...yield] = []; };`, + `() => { const {a: yield} = {}; };`, + `() => { const {yield} = {}; };`, + `() => { const {yield = 0} = {}; };`, +]; + + +// Script context. +for (let test of [...yieldInParameters, ...yieldInBody]) { + eval(test); + assertThrowsInstanceOf(() => eval(`"use strict"; ${test}`), SyntaxError); +} + +// Function context. +for (let test of [...yieldInParameters, ...yieldInBody]) { + eval(`function f() { ${test} }`); + assertThrowsInstanceOf(() => eval(`"use strict"; function f() { ${test} }`), SyntaxError); +} + +// Generator context. +for (let test of yieldInParameters) { + assertThrowsInstanceOf(() => eval(`function* g() { ${test} }`), SyntaxError); +} +for (let test of yieldInBody) { + eval(`function* g() { ${test} }`); +} +for (let test of [...yieldInParameters, ...yieldInBody]) { + assertThrowsInstanceOf(() => eval(`"use strict"; function* g() { ${test} }`), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Class/member-expr-after-super.js b/js/src/tests/ecma_6/Class/member-expr-after-super.js new file mode 100644 index 000000000000..fa965b24e52e --- /dev/null +++ b/js/src/tests/ecma_6/Class/member-expr-after-super.js @@ -0,0 +1,44 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +class Base { + get test() { + return "ok"; + } +} + +class SuperThenProperty extends Base { + constructor() { + var result = super().test; + return {result}; + } +} +assertEq(new SuperThenProperty().result, "ok"); + +class SuperThenMember extends Base { + constructor() { + var result = super()["tes" + String.fromCodePoint("t".codePointAt(0))]; + return {result}; + } +} +assertEq(new SuperThenMember().result, "ok"); + +class SuperThenCall extends Function { + constructor() { + var result = super("o, k", "return o + k;")("o", "k"); + return {result}; + } +} +assertEq(new SuperThenCall().result, "ok"); + +class SuperThenTemplateCall extends Function { + constructor() { + var result = super("cooked", "return cooked[0][0] + cooked.raw[0][1];")`ok`; + return {result}; + } +} +assertEq(new SuperThenTemplateCall().result, "ok"); + +if (typeof reportCompare === "function") + reportCompare(0, 0); diff --git a/js/src/tests/ecma_6/Class/method-named-static.js b/js/src/tests/ecma_6/Class/method-named-static.js new file mode 100644 index 000000000000..c5a2ed882765 --- /dev/null +++ b/js/src/tests/ecma_6/Class/method-named-static.js @@ -0,0 +1,56 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Instance method named "static", with and without escape sequence. +assertEq((new class { + static() { return "method-static-no-escape"; } +}).static(), "method-static-no-escape"); + +assertEq((new class { + st\u0061tic() { return "method-static-escape"; } +}).static(), "method-static-escape"); + +// Instance getter named "static", with and without escape sequence. +assertEq((new class { + get static() { return "getter-static-no-escape"; } +}).static, "getter-static-no-escape"); + +assertEq((new class { + get static() { return "getter-static-escape"; } +}).static, "getter-static-escape"); + +// Static method named "static", with and without escape sequence. +assertEq(class { + static static() { return "static-method-static-no-escape"; } +}.static(), "static-method-static-no-escape"); + +assertEq(class { + static st\u0061tic() { return "static-method-static-escape"; } +}.static(), "static-method-static-escape"); + +// Static getter named "static", with and without escape sequence. +assertEq(class { + static get static() { return "static-getter-static-no-escape"; } +}.static, "static-getter-static-no-escape"); + +assertEq(class { + static get st\u0061tic() { return "static-getter-static-escape"; } +}.static, "static-getter-static-escape"); + + +// The static modifier itself must not contain any escape sequences. +assertThrowsInstanceOf(() => eval(String.raw` + class C { + st\u0061tic m() {} + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + class C { + st\u0061tic get m() {} + } +`), SyntaxError); + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/browser.js b/js/src/tests/ecma_6/Destructuring/browser.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_6/Destructuring/shell.js b/js/src/tests/ecma_6/Destructuring/shell.js new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-function.js b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-function.js new file mode 100644 index 000000000000..9f5eed8345fd --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-function.js @@ -0,0 +1,182 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +(function() { + var {a: yield} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); + + var {yield} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); + + var {yield = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + var {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + var {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + var {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with let. +(function(){ + let {a: yield} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +})(); + +(function() { + let {yield} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +})(); + +(function() { + let {yield = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + let {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + let {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + let {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with const. +(function() { + const {a: yield} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +})(); + +(function() { + const {yield} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +})(); + +(function() { + const {yield = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + const {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + const {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + const {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns in parameters. +(function({a: yield} = {a: "yield-with-name"}) { + assertEq(yield, "yield-with-name"); +})(); + +(function({yield} = {yield: "yield-with-shorthand"}) { + assertEq(yield, "yield-with-shorthand"); +})(); + +(function({yield = 0} = {yield: "yield-with-coverinitname"}) { + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f({a: yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f({yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f({yield = 0} = {}) { } +`), SyntaxError); + + +// Destructuring assignment pattern. +(function() { + var a, yield; + + ({a: yield} = {a: "yield-with-name"}); + assertEq(yield, "yield-with-name"); + + ({yield} = {yield: "yield-with-shorthand"}); + assertEq(yield, "yield-with-shorthand"); + + ({yield = 0} = {yield: "yield-with-coverinitname"}); + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + ({a: yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + ({yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function f() { + ({yield = 0} = {}); + } +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-generator.js b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-generator.js new file mode 100644 index 000000000000..4423f8190f9b --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-generator.js @@ -0,0 +1,200 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +assertThrowsInstanceOf(() => eval(` + function* g() { + var {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + var {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + var {yield = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + var {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + var {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + var {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with let. +assertThrowsInstanceOf(() => eval(` + function* g() { + let {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + let {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + let {yield = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + let {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + let {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + let {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with const. +assertThrowsInstanceOf(() => eval(` + function* g() { + const {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + const {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + const {yield = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + const {a: yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + const {yield} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + const {yield = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns in parameters. +assertThrowsInstanceOf(() => eval(` + function* g({a: yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g({yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g({yield = 0} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g({a: yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g({yield} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g({yield = 0} = {}) { } +`), SyntaxError); + + +// Destructuring assignment pattern. +assertThrowsInstanceOf(() => eval(` + function* g() { + ({a: yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + ({yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + function* g() { + ({yield = 0} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + ({a: yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + ({yield} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + function* g() { + ({yield = 0} = {}); + } +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-script.js b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-script.js new file mode 100644 index 000000000000..99b48dd417fa --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-in-object-destr-script.js @@ -0,0 +1,123 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +var {a: yield} = {a: "yield-with-name"}; +assertEq(yield, "yield-with-name"); + +var {yield} = {yield: "yield-with-shorthand"}; +assertEq(yield, "yield-with-shorthand"); + +var {yield = 0} = {yield: "yield-with-coverinitname"}; +assertEq(yield, "yield-with-coverinitname"); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + var {a: yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + var {yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + var {yield = 0} = {}; +`), SyntaxError); + + +// Destructuring binding patterns with let. +{ + let {a: yield} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +} + +{ + let {yield} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +} + +{ + let {yield = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +} + +assertThrowsInstanceOf(() => eval(` + "use strict"; + let {a: yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + let {yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + let {yield = 0} = {}; +`), SyntaxError); + + +// Destructuring binding patterns with const. +{ + const {a: yield} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +} + +{ + const {yield} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +} + +{ + const {yield = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +} + +assertThrowsInstanceOf(() => eval(` + "use strict"; + const {a: yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + const {yield} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + const {yield = 0} = {}; +`), SyntaxError); + + +// Destructuring assignment pattern. +({a: yield} = {a: "yield-with-name"}); +assertEq(yield, "yield-with-name"); + +({yield} = {yield: "yield-with-shorthand"}); +assertEq(yield, "yield-with-shorthand"); + +({yield = 0} = {yield: "yield-with-coverinitname"}); +assertEq(yield, "yield-with-coverinitname"); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + ({a: yield} = {}); +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + ({yield} = {}); +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(` + "use strict"; + ({yield = 0} = {}); +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-function.js b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-function.js new file mode 100644 index 000000000000..349badeaf727 --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-function.js @@ -0,0 +1,182 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +(function() { + var {a: yi\u0065ld} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); + + var {yi\u0065ld} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); + + var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + var {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + var {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + var {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with let. +(function(){ + let {a: yi\u0065ld} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +})(); + +(function() { + let {yi\u0065ld} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +})(); + +(function() { + let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + let {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + let {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + let {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with const. +(function() { + const {a: yi\u0065ld} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +})(); + +(function() { + const {yi\u0065ld} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +})(); + +(function() { + const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + const {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + const {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + const {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns in parameters. +(function({a: yi\u0065ld} = {a: "yield-with-name"}) { + assertEq(yield, "yield-with-name"); +})(); + +(function({yi\u0065ld} = {yield: "yield-with-shorthand"}) { + assertEq(yield, "yield-with-shorthand"); +})(); + +(function({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}) { + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f({a: yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f({yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f({yi\u0065ld = 0} = {}) { } +`), SyntaxError); + + +// Destructuring assignment pattern. +(function() { + var a, yield; + + ({a: yi\u0065ld} = {a: "yield-with-name"}); + assertEq(yield, "yield-with-name"); + + ({yi\u0065ld} = {yield: "yield-with-shorthand"}); + assertEq(yield, "yield-with-shorthand"); + + ({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}); + assertEq(yield, "yield-with-coverinitname"); +})(); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + ({a: yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + ({yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function f() { + ({yi\u0065ld = 0} = {}); + } +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-generator.js b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-generator.js new file mode 100644 index 000000000000..faa356391464 --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-generator.js @@ -0,0 +1,200 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + var {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + var {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + var {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + var {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + var {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + var {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with let. +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + let {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + let {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + let {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + let {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + let {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + let {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns with const. +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + const {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + const {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + const {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + const {a: yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + const {yi\u0065ld} = {}; + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + const {yi\u0065ld = 0} = {}; + } +`), SyntaxError); + + +// Destructuring binding patterns in parameters. +assertThrowsInstanceOf(() => eval(String.raw` + function* g({a: yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g({yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g({yi\u0065ld = 0} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g({a: yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g({yi\u0065ld} = {}) { } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g({yi\u0065ld = 0} = {}) { } +`), SyntaxError); + + +// Destructuring assignment pattern. +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + ({a: yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + ({yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + ({yi\u0065ld = 0} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + ({a: yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + ({yi\u0065ld} = {}); + } +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + ({yi\u0065ld = 0} = {}); + } +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-script.js b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-script.js new file mode 100644 index 000000000000..65352a66cffd --- /dev/null +++ b/js/src/tests/ecma_6/Destructuring/yield-with-escape-in-object-destr-script.js @@ -0,0 +1,123 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + +// Destructuring binding patterns with var. +var {a: yi\u0065ld} = {a: "yield-with-name"}; +assertEq(yield, "yield-with-name"); + +var {yi\u0065ld} = {yield: "yield-with-shorthand"}; +assertEq(yield, "yield-with-shorthand"); + +var {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; +assertEq(yield, "yield-with-coverinitname"); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + var {a: yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + var {yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + var {yi\u0065ld = 0} = {}; +`), SyntaxError); + + +// Destructuring binding patterns with let. +{ + let {a: yi\u0065ld} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +} + +{ + let {yi\u0065ld} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +} + +{ + let {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +} + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + let {a: yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + let {yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + let {yi\u0065ld = 0} = {}; +`), SyntaxError); + + +// Destructuring binding patterns with const. +{ + const {a: yi\u0065ld} = {a: "yield-with-name"}; + assertEq(yield, "yield-with-name"); +} + +{ + const {yi\u0065ld} = {yield: "yield-with-shorthand"}; + assertEq(yield, "yield-with-shorthand"); +} + +{ + const {yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}; + assertEq(yield, "yield-with-coverinitname"); +} + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + const {a: yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + const {yi\u0065ld} = {}; +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + const {yi\u0065ld = 0} = {}; +`), SyntaxError); + + +// Destructuring assignment pattern. +({a: yi\u0065ld} = {a: "yield-with-name"}); +assertEq(yield, "yield-with-name"); + +({yi\u0065ld} = {yield: "yield-with-shorthand"}); +assertEq(yield, "yield-with-shorthand"); + +({yi\u0065ld = 0} = {yield: "yield-with-coverinitname"}); +assertEq(yield, "yield-with-coverinitname"); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + ({a: yi\u0065ld} = {}); +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + ({yi\u0065ld} = {}); +`), SyntaxError); + +assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + ({yi\u0065ld = 0} = {}); +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-default-call.js b/js/src/tests/ecma_6/Expressions/destructuring-array-default-call.js new file mode 100644 index 000000000000..a3a3622054dc --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-default-call.js @@ -0,0 +1,10 @@ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - call/new expression"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("func()"); +testDestructuringArrayDefault("new func()"); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-default-class.js b/js/src/tests/ecma_6/Expressions/destructuring-array-default-class.js new file mode 100644 index 000000000000..80830892865a --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-default-class.js @@ -0,0 +1,72 @@ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - class expression and super/new.target"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault(`class E { + constructor() {} + method() {} + get v() {} + set v(_) {} + static method() {} + static get v() {} + static set v(_) {} +}`); + +testDestructuringArrayDefault(`class E extends C { + constructor() {} + method() {} + get v() {} + set v(_) {} + static method() {} + static get v() {} + static set v(_) {} +}`); + +var opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen: true, + no_gen_arg: true, + no_ctor: true, + no_method: true, + no_pre_super: true, + no_comp: true, + + no_derived_ctor: false, +}; +testDestructuringArrayDefault("super()", opt); + +opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen: true, + no_gen_arg: true, + no_ctor: true, + no_comp: true, + + no_derived_ctor: false, + no_method: false, + no_pre_super: false, +}; +testDestructuringArrayDefault("super.foo()", opt); + +opt = { + no_plain: true, + + no_func: false, + no_func_arg: false, + no_gen: false, + no_gen_arg: false, + no_ctor: false, + no_derived_ctor: false, + no_method: false, + no_pre_super: false, + no_comp: false, +}; +testDestructuringArrayDefault("new.target", opt); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-default-function.js b/js/src/tests/ecma_6/Expressions/destructuring-array-default-function.js new file mode 100644 index 000000000000..5d2ffef1885e --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-default-function.js @@ -0,0 +1,11 @@ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - function expression"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("function f() {}"); +testDestructuringArrayDefault("function* g() {}"); +testDestructuringArrayDefault("() => {}"); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-default-simple.js b/js/src/tests/ecma_6/Expressions/destructuring-array-default-simple.js new file mode 100644 index 000000000000..50c6c37f3dc6 --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-default-simple.js @@ -0,0 +1,16 @@ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - simple literal"; + +print(BUGNUMBER + ": " + summary); + +testDestructuringArrayDefault("'foo'"); +testDestructuringArrayDefault("`foo`"); +testDestructuringArrayDefault("func`foo`"); + +testDestructuringArrayDefault("/foo/"); + +testDestructuringArrayDefault("{}"); +testDestructuringArrayDefault("[]"); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-default-yield.js b/js/src/tests/ecma_6/Expressions/destructuring-array-default-yield.js new file mode 100644 index 000000000000..57ff9e94729a --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-default-yield.js @@ -0,0 +1,22 @@ +var BUGNUMBER = 1184922; +var summary = "Array destructuring with various default values in various context - yield expression"; + +print(BUGNUMBER + ": " + summary); + +var opt = { + no_plain: true, + no_func: true, + no_func_arg: true, + no_gen_arg: true, + no_ctor: true, + no_derived_ctor: true, + no_method: true, + no_pre_super: true, + no_comp: true, + + no_gen: false, +}; +testDestructuringArrayDefault("yield 1", opt); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/destructuring-array-done.js b/js/src/tests/ecma_6/Expressions/destructuring-array-done.js new file mode 100644 index 000000000000..f2c7e9410e0b --- /dev/null +++ b/js/src/tests/ecma_6/Expressions/destructuring-array-done.js @@ -0,0 +1,319 @@ +var BUGNUMBER = 1184922; +var summary = "iterator.next() should not be called when after iterator completes"; + +print(BUGNUMBER + ": " + summary); + +var log; +function reset() { + log = ""; +} +var obj = new Proxy({}, { + set(that, name, value) { + var v; + if (value instanceof Function || value instanceof RegExp) + v = value.toString(); + else + v = JSON.stringify(value); + log += "set:" + name + "=" + v + ","; + } +}); +function createIterable(n) { + return { + i: 0, + [Symbol.iterator]() { + return this; + }, + next() { + log += "next,"; + this.i++; + if (this.i <= n) + return {value: this.i, done: false}; + return {value: 0, done: true}; + } + }; +} + +// Simple pattern. + +reset(); +[obj.a, obj.b, obj.c] = createIterable(0); +assertEq(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(1); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(2); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, obj.b, obj.c] = createIterable(3); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:c=3,"); + +// Elision. + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(0); +assertEq(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(1); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(2); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=undefined," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(3); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(4); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(5); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=undefined,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(6); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=6," + + "next,"); + +reset(); +[obj.a, , obj.b, , , obj.c, ,] = createIterable(7); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:b=3," + + "next," + + "next," + + "next," + + "set:c=6," + + "next,"); + +// Rest. + +reset(); +[...obj.r] = createIterable(0); +assertEq(log, + "next," + + "set:r=[],"); + +reset(); +[...obj.r] = createIterable(1); +assertEq(log, + "next," + + "next," + + "set:r=[1],"); + +reset(); +[obj.a, ...obj.r] = createIterable(0); +assertEq(log, + "next," + + "set:a=undefined," + + "set:r=[],"); + +reset(); +[obj.a, ...obj.r] = createIterable(1); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, ...obj.r] = createIterable(2); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "next," + + "set:r=[2],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(0); +assertEq(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(1); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(2); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, ...obj.r] = createIterable(3); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "set:r=[3],"); + +// Rest and elision. + +reset(); +[, ...obj.r] = createIterable(0); +assertEq(log, + "next," + + "set:r=[],"); + +reset(); +[, ...obj.r] = createIterable(1); +assertEq(log, + "next," + + "next," + + "set:r=[],"); + +reset(); +[, ...obj.r] = createIterable(2); +assertEq(log, + "next," + + "next," + + "next," + + "set:r=[2],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(0); +assertEq(log, + "next," + + "set:a=undefined," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(1); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=undefined," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(2); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(3); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "set:r=[],"); + +reset(); +[obj.a, obj.b, , ...obj.r] = createIterable(4); +assertEq(log, + "next," + + "set:a=1," + + "next," + + "set:b=2," + + "next," + + "next," + + "next," + + "set:r=[4],"); + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Expressions/shell.js b/js/src/tests/ecma_6/Expressions/shell.js index e69de29bb2d1..0a0a24656bbf 100644 --- a/js/src/tests/ecma_6/Expressions/shell.js +++ b/js/src/tests/ecma_6/Expressions/shell.js @@ -0,0 +1,186 @@ +(function(global) { + function func() { + } + class C { + foo() { + } + static foo() { + } + } + + function test_one(pattern, val, opt) { + var stmts = []; + var i = 0; + var c; + + stmts.push(`var ${pattern} = ${val};`); + if (!opt.no_comp) { + stmts.push(`[for (x of [1]) ${pattern} = ${val}];`); + stmts.push(`[...(for (x of [1]) ${pattern} = ${val})];`); + } + + for (var stmt of stmts) { + if (!opt.no_plain) { + eval(` +${stmt} +`); + } + + if (!opt.no_func) { + eval(` +function f${i}() { + ${stmt} +} +f${i}(); +`); + i++; + + eval(` +var f${i} = function foo() { + ${stmt} +}; +f${i}(); +`); + i++; + + eval(` +var f${i} = () => { + ${stmt} +}; +f${i}(); +`); + i++; + } + + if (!opt.no_gen) { + eval(` +function* g${i}() { + ${stmt} +} +[...g${i}()]; +`); + i++; + + eval(` +var g${i} = function* foo() { + ${stmt} +}; +[...g${i}()]; +`); + i++; + } + + if (!opt.no_ctor) { + eval(` +class D${i} { + constructor() { + ${stmt} + } +} +new D${i}(); +`); + i++; + } + + if (!opt.no_derived_ctor) { + if (opt.no_pre_super) { + eval(` +class D${i} extends C { + constructor() { + ${stmt} + try { super(); } catch (e) {} + } +} +new D${i}(); +`); + i++; + } else { + eval(` +class D${i} extends C { + constructor() { + super(); + ${stmt} + } +} +new D${i}(); +`); + i++; + } + } + + if (!opt.no_method) { + eval(` +class D${i} extends C { + method() { + ${stmt} + } + static staticMethod() { + ${stmt} + } +} +new D${i}().method(); +D${i}.staticMethod(); +`); + i++; + } + } + + if (!opt.no_func_arg) { + eval(` +function f${i}(${pattern}) {} +f${i}(${val}); +`); + i++; + + eval(` +var f${i} = function foo(${pattern}) {}; +f${i}(${val}); +`); + i++; + + eval(` +var f${i} = (${pattern}) => {}; +f${i}(${val}); +`); + i++; + } + + if (!opt.no_gen_arg) { + eval(` +function* g${i}(${pattern}) {} +[...g${i}(${val})]; +`); + i++; + + eval(` +var g${i} = function* foo(${pattern}) {}; +[...g${i}(${val})]; +`); + i++; + } + } + + function test(expr, opt={}) { + var pattern = `[a=${expr}, ...c]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + + pattern = `[,a=${expr}]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + test_one(pattern, "[1, 2]", opt); + + pattern = `[{x: [a=${expr}]}]`; + test_one(pattern, "[{x: [1]}]", opt); + + pattern = `[x=[a=${expr}]=[]]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + + pattern = `[x=[a=${expr}]=[1]]`; + test_one(pattern, "[]", opt); + test_one(pattern, "[1]", opt); + } + + global.testDestructuringArrayDefault = test; +})(this); diff --git a/js/src/tests/ecma_6/Generators/syntax.js b/js/src/tests/ecma_6/Generators/syntax.js index 98af714204e3..b2fec3bcc3d1 100644 --- a/js/src/tests/ecma_6/Generators/syntax.js +++ b/js/src/tests/ecma_6/Generators/syntax.js @@ -117,8 +117,21 @@ assertSyntaxError("function* g() { yield 3 + yield 4; }"); // Yield is still a future-reserved-word in strict mode assertSyntaxError("function f() { 'use strict'; var yield = 13; }"); -// The name of the NFE is let-bound in G, so is invalid. -assertSyntaxError("function* g() { yield (function yield() {}); }"); +// The name of the NFE isn't let-bound in F/G, so this is valid. +function f() { (function yield() {}); } +function* g() { (function yield() {}); } + +// The name of the NFE is let-bound in the function/generator expression, so this is invalid. +assertSyntaxError("function f() { (function* yield() {}); }"); +assertSyntaxError("function* g() { (function* yield() {}); }"); + +// The name of the declaration is let-bound in F, so this is valid. +function f() { function yield() {} } +function f() { function* yield() {} } + +// The name of the declaration is let-bound in G, so this is invalid. +assertSyntaxError("function* g() { function yield() {} }"); +assertSyntaxError("function* g() { function* yield() {} }"); // In generators, yield is invalid as a formal argument name. assertSyntaxError("function* g(yield) { yield (10); }"); diff --git a/js/src/tests/ecma_6/Math/log2-approx.js b/js/src/tests/ecma_6/Math/log2-approx.js index a9b0305f145a..954f4c1cf970 100644 --- a/js/src/tests/ecma_6/Math/log2-approx.js +++ b/js/src/tests/ecma_6/Math/log2-approx.js @@ -1,4 +1,4 @@ -for (var i = -10; i < 10; i++) +for (var i = -1074; i < 1023; i++) assertNear(Math.log2(Math.pow(2, i)), i); assertNear(Math.log2(5), 2.321928094887362); diff --git a/js/src/tests/ecma_6/Statements/for-inof-coverinitname-destr-assign.js b/js/src/tests/ecma_6/Statements/for-inof-coverinitname-destr-assign.js new file mode 100644 index 000000000000..ba9e409599ff --- /dev/null +++ b/js/src/tests/ecma_6/Statements/for-inof-coverinitname-destr-assign.js @@ -0,0 +1,55 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const defaultValue = "default-value"; +const unreachable = () => { throw "unreachable"; }; + +// for-in statement, object destructuring. +var forIn; +for ({forIn = defaultValue} in {"": null}); +assertEq(forIn, defaultValue); + +forIn = undefined; +String.prototype.forIn = defaultValue; +for ({forIn = unreachable()} in {"": null}); +delete String.prototype.forIn; +assertEq(forIn, defaultValue); + +// for-in statement, array destructuring. +forIn = undefined; +for ([forIn = defaultValue] in {"": null}); +assertEq(forIn, defaultValue); + +forIn = undefined; +for ([forIn = unreachable()] in {"ABC": null}); +assertEq(forIn, "A"); + + +// for-of statement, object destructuring. +var forOf; +for ({forOf = defaultValue} of [{}]); +assertEq(forOf, defaultValue); + +forOf = undefined; +for ({forOf = unreachable()} of [{forOf: defaultValue}]); +assertEq(forOf, defaultValue); + +// for-of statement, array destructuring. +forOf = undefined; +for ([forOf = defaultValue] of [[]]); +assertEq(forOf, defaultValue); + +forOf = undefined; +for ([forOf = unreachable()] of [[defaultValue]]); +assertEq(forOf, defaultValue); + + +// for-statement, object destructuring. +assertThrowsInstanceOf(() => eval(` + for ({invalid = 0};;); +`), SyntaxError); + + +if (typeof reportCompare === "function") + reportCompare(true, true); diff --git a/js/src/tests/ecma_6/Syntax/escaped-strict-reserved-words-and-yield.js b/js/src/tests/ecma_6/Syntax/escaped-strict-reserved-words-and-yield.js new file mode 100644 index 000000000000..9d683bd97529 --- /dev/null +++ b/js/src/tests/ecma_6/Syntax/escaped-strict-reserved-words-and-yield.js @@ -0,0 +1,105 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const testCases = [ + // Label identifier. + id => `${id}: ;`, + + // Binding identifier. + id => `var ${id};`, + id => `let ${id};`, + id => `const ${id} = 0;`, + + // Binding identifier in binding pattern. + id => `var [${id}] = [];`, + id => `var [${id} = 0] = [];`, + id => `var [...${id}] = [];`, + id => `var {a: ${id}} = {};`, + id => `var {${id}} = {};`, + id => `var {${id} = 0} = {};`, + + id => `let [${id}] = [];`, + id => `let [${id} = 0] = [];`, + id => `let [...${id}] = [];`, + id => `let {a: ${id}} = {};`, + id => `let {${id}} = {};`, + id => `let {${id} = 0} = {};`, + + id => `const [${id}] = [];`, + id => `const [${id} = 0] = [];`, + id => `const [...${id}] = [];`, + id => `const {a: ${id}} = {};`, + id => `const {${id}} = {};`, + id => `const {${id} = 0} = {};`, + + // Identifier reference. + id => `void ${id};`, +]; + +const strictReservedWords = [ + "implements", + "interface", + "package", + "private", + "protected", + "public", +]; + +function escapeWord(s) { + return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1); +} + +for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) { + let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield); + + for (let testCase of testCases) { + eval(testCase(strictReservedWordOrYield)); + eval(testCase(escapedStrictReservedWordOrYield)); + + assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + ${testCase(strictReservedWordOrYield)} + `), SyntaxError); + + assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + ${testCase(escapedStrictReservedWordOrYield)} + `), SyntaxError); + } +} + +// |yield| is always a keyword in generator functions. +for (let testCase of testCases) { + let yield = "yield"; + let escapedYield = escapeWord("yield"); + + assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + ${testCase(yield)} + } + `), SyntaxError); + + assertThrowsInstanceOf(() => eval(String.raw` + function* g() { + ${testCase(escapedYield)} + } + `), SyntaxError); + + assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + ${testCase(yield)} + } + `), SyntaxError); + + assertThrowsInstanceOf(() => eval(String.raw` + "use strict"; + function* g() { + ${testCase(escapedYield)} + } + `), SyntaxError); +} + +if (typeof reportCompare === "function") + reportCompare(0, 0, "ok"); diff --git a/js/src/tests/ecma_6/extensions/for-in-with-assignments.js b/js/src/tests/ecma_6/extensions/for-in-with-assignments.js index 5b1443c1cc23..7eb0201eded4 100644 --- a/js/src/tests/ecma_6/extensions/for-in-with-assignments.js +++ b/js/src/tests/ecma_6/extensions/for-in-with-assignments.js @@ -68,6 +68,14 @@ with (0) /******************************************************************************/ +function* g1() { + for (var x = yield in {}) ; +} +var it = g1(); +assertEq(it.next().done, true); + +/******************************************************************************/ + if (typeof reportCompare === "function") reportCompare(true, true); diff --git a/js/src/tests/ecma_7/Math/Pow.js b/js/src/tests/ecma_7/Math/Pow.js index c7cba3391aef..634445fb30a5 100644 --- a/js/src/tests/ecma_7/Math/Pow.js +++ b/js/src/tests/ecma_7/Math/Pow.js @@ -53,6 +53,28 @@ assertEq(a**/**b**/c/**/**/**d**/e, 16); // Two stars separated should not parse as exp operator assertThrows(function() { return Reflect.parse("2 * * 3"); }, SyntaxError); +// Left-hand side expression must not be a unary expression. +for (let unaryOp of ["delete", "typeof", "void", "+", "-", "!", "~"]) { + assertThrowsInstanceOf(() => eval(unaryOp + " a ** 2"), SyntaxError); + assertThrowsInstanceOf(() => eval(unaryOp + " " + unaryOp + " a ** 2"), SyntaxError); +} + +// Test the other |delete| operators (DELETENAME and DELETEEXPR are already tested above). +assertThrowsInstanceOf(() => eval("delete a.name ** 2"), SyntaxError); +assertThrowsInstanceOf(() => eval("delete a[0] ** 2"), SyntaxError); + +// Unary expression lhs is valid if parenthesized. +for (let unaryOp of ["delete", "void", "+", "-", "!", "~"]) { + let a = 0; + eval("(" + unaryOp + " a) ** 2"); + eval("(" + unaryOp + " " + unaryOp + " a) ** 2"); +} +{ + let a = {}; + (delete a.name) ** 2; + (delete a[0]) ** 2; +} + // Check if error propagation works var thrower = { get value() { diff --git a/js/src/vm/HelperThreads.cpp b/js/src/vm/HelperThreads.cpp index b2d4b5a96644..0d62836a8c89 100644 --- a/js/src/vm/HelperThreads.cpp +++ b/js/src/vm/HelperThreads.cpp @@ -1237,12 +1237,12 @@ GlobalHelperThreadState::finishParseTask(JSContext* cx, ParseTaskKind kind, void mergeParseTaskCompartment(cx, parseTask, global, cx->compartment()); - if (!parseTask->finish(cx)) - return nullptr; - RootedScript script(cx, parseTask->script); releaseAssertSameCompartment(cx, script); + if (!parseTask->finish(cx)) + return nullptr; + // Report out of memory errors eagerly, or errors could be malformed. if (parseTask->outOfMemory) { ReportOutOfMemory(cx); diff --git a/js/xpconnect/src/XPCInlines.h b/js/xpconnect/src/XPCInlines.h index b730e994fd09..20c63c9729d1 100644 --- a/js/xpconnect/src/XPCInlines.h +++ b/js/xpconnect/src/XPCInlines.h @@ -451,17 +451,13 @@ XPCNativeSet::MatchesSetUpToInterface(const XPCNativeSet* other, inline JSObject* XPCWrappedNativeTearOff::GetJSObjectPreserveColor() const { - return mJSObject.getPtr(); + return mJSObject.unbarrieredGetPtr(); } inline JSObject* XPCWrappedNativeTearOff::GetJSObject() { - JSObject* obj = GetJSObjectPreserveColor(); - if (obj) { - JS::ExposeObjectToActiveJS(obj); - } - return obj; + return mJSObject; } inline @@ -475,7 +471,7 @@ inline void XPCWrappedNativeTearOff::JSObjectMoved(JSObject* obj, const JSObject* old) { MOZ_ASSERT(!IsMarked()); - MOZ_ASSERT(mJSObject == old); + MOZ_ASSERT(mJSObject.unbarrieredGetPtr() == old); mJSObject = obj; } diff --git a/js/xpconnect/src/XPCWrappedNative.cpp b/js/xpconnect/src/XPCWrappedNative.cpp index 912d3fcbe6b3..152abdf9ba91 100644 --- a/js/xpconnect/src/XPCWrappedNative.cpp +++ b/js/xpconnect/src/XPCWrappedNative.cpp @@ -940,7 +940,7 @@ void XPCWrappedNative::FlatJSObjectMoved(JSObject* obj, const JSObject* old) { JS::AutoAssertGCCallback inCallback(obj); - MOZ_ASSERT(mFlatJSObject == old); + MOZ_ASSERT(mFlatJSObject.unbarrieredGetPtr() == old); nsWrapperCache* cache = nullptr; CallQueryInterface(mIdentity, &cache); @@ -2165,7 +2165,7 @@ NS_IMETHODIMP XPCWrappedNative::DebugDump(int16_t depth) else XPC_LOG_ALWAYS(("mSet @ %x", mSet.get())); - XPC_LOG_ALWAYS(("mFlatJSObject of %x", mFlatJSObject.getPtr())); + XPC_LOG_ALWAYS(("mFlatJSObject of %x", mFlatJSObject.unbarrieredGetPtr())); XPC_LOG_ALWAYS(("mIdentity of %x", mIdentity.get())); XPC_LOG_ALWAYS(("mScriptableInfo @ %x", mScriptableInfo)); diff --git a/js/xpconnect/src/xpcprivate.h b/js/xpconnect/src/xpcprivate.h index ab4b47f0b2d8..398e59505bf7 100644 --- a/js/xpconnect/src/xpcprivate.h +++ b/js/xpconnect/src/xpcprivate.h @@ -1795,12 +1795,7 @@ public: * This getter clears the gray bit before handing out the JSObject which * means that the object is guaranteed to be kept alive past the next CC. */ - JSObject* - GetFlatJSObject() const - { - JS::ExposeObjectToActiveJS(mFlatJSObject); - return mFlatJSObject; - } + JSObject* GetFlatJSObject() const { return mFlatJSObject; } /** * This getter does not change the color of the JSObject meaning that the @@ -1811,7 +1806,9 @@ public: * being rooted (or otherwise signaling the stored value to the CC). */ JSObject* - GetFlatJSObjectPreserveColor() const {return mFlatJSObject;} + GetFlatJSObjectPreserveColor() const { + return mFlatJSObject.unbarrieredGetPtr(); + } XPCNativeSet* GetSet() const {return mSet;} @@ -1899,9 +1896,10 @@ public: GetProto()->TraceSelf(trc); else GetScope()->TraceSelf(trc); - if (mFlatJSObject && JS_IsGlobalObject(mFlatJSObject)) - { - xpc::TraceXPCGlobal(trc, mFlatJSObject); + + JSObject* obj = mFlatJSObject.unbarrieredGetPtr(); + if (obj && JS_IsGlobalObject(obj)) { + xpc::TraceXPCGlobal(trc, obj); } } diff --git a/layout/build/nsLayoutModule.cpp b/layout/build/nsLayoutModule.cpp index ee1a28274040..4790e6cc9722 100644 --- a/layout/build/nsLayoutModule.cpp +++ b/layout/build/nsLayoutModule.cpp @@ -1326,7 +1326,7 @@ static const mozilla::Module::CategoryEntry kLayoutCategories[] = { { "net-channel-event-sinks", NS_MIXEDCONTENTBLOCKER_CONTRACTID, NS_MIXEDCONTENTBLOCKER_CONTRACTID }, { "app-startup", "Script Security Manager", "service," NS_SCRIPTSECURITYMANAGER_CONTRACTID }, { "app-startup", "Push Notifier", "service," PUSHNOTIFIER_CONTRACTID }, - { "clear-origin-data", "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID }, + { "clear-origin-attributes-data", "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID }, { OBSERVER_TOPIC_IDLE_DAILY, "QuotaManagerService", QUOTAMANAGER_SERVICE_CONTRACTID }, #ifdef MOZ_WIDGET_GONK { "app-startup", "Volume Service", "service," NS_VOLUMESERVICE_CONTRACTID }, diff --git a/layout/reftests/backgrounds/reftest.list b/layout/reftests/backgrounds/reftest.list index 1019e1a1c78a..52bcddfbc72b 100644 --- a/layout/reftests/backgrounds/reftest.list +++ b/layout/reftests/backgrounds/reftest.list @@ -179,11 +179,11 @@ fuzzy(30,474) fuzzy-if(skiaContent,31,474) == background-tiling-zoom-1.html back skip-if(!cocoaWidget) == background-repeat-resampling.html background-repeat-resampling-ref.html -pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2617) == background-clip-text-1a.html background-clip-text-1-ref.html -pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2617) == background-clip-text-1b.html background-clip-text-1-ref.html -pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2617) == background-clip-text-1c.html background-clip-text-1-ref.html -pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2617) == background-clip-text-1d.html background-clip-text-1-ref.html -pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2617) == background-clip-text-1e.html background-clip-text-1-ref.html +pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2811) == background-clip-text-1a.html background-clip-text-1-ref.html +pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2811) == background-clip-text-1b.html background-clip-text-1-ref.html +pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2811) == background-clip-text-1c.html background-clip-text-1-ref.html +pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2811) == background-clip-text-1d.html background-clip-text-1-ref.html +pref(layout.css.background-clip-text.enabled,true) fuzzy-if(winWidget,102,2032) fuzzy-if(skiaContent,102,2811) == background-clip-text-1e.html background-clip-text-1-ref.html pref(layout.css.background-clip-text.enabled,false) != background-clip-text-1a.html background-clip-text-1-ref.html pref(layout.css.background-clip-text.enabled,true) == background-clip-text-2.html background-clip-text-2-ref.html diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 51b476ec4ebd..c950df2fed5e 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1562,8 +1562,8 @@ skip-if(B2G||Mulet) == 569006-1.html 569006-1-ref.html # Initial mulet triage: p == 572598-1.html 572598-ref.html == 574898-1.html 574898-ref.html # 574907 is a windows-only issue, result on other platforms depends on details of font support -random-if(!winWidget) fails-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)&&d2d) == 574907-1.html 574907-1-ref.html # Bug 1258240 -random-if(!winWidget) fails-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)&&d2d) == 574907-2.html 574907-2-ref.html # Bug 1258240 +random-if(!winWidget) fails-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)) == 574907-1.html 574907-1-ref.html # Bug 1258240 +random-if(!winWidget) fails-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)) == 574907-2.html 574907-2-ref.html # Bug 1258240 # 574907-3 only worked under directwrite, and even there it now depends on the rendering mode; marking as random for now random-if(!winWidget) fails-if(winWidget&&!dwrite) random-if(winWidget&&dwrite) != 574907-3.html 574907-3-notref.html == 577838-1.html 577838-1-ref.html diff --git a/layout/reftests/font-matching/reftest.list b/layout/reftests/font-matching/reftest.list index b9f1a1b11fb5..b223cb3ca2d7 100644 --- a/layout/reftests/font-matching/reftest.list +++ b/layout/reftests/font-matching/reftest.list @@ -46,7 +46,7 @@ random-if(cocoaWidget) != impact-bold.html impact.html # bug 539418 # localized font family names should always match just as English names do == localized-family-names-001.html localized-family-names-001-ref.html skip-if(Mulet) == localized-family-names-002.html localized-family-names-002-ref.html # MULET: Bug 1144079: Re-enable Mulet mochitests and reftests taskcluster-specific disables -fails-if(/^Windows\x20NT\x2010\.0/.test(http.oscpu)&&!d2d) == localized-family-names-003.html localized-family-names-003-ref.html # Bug 1258248 +== localized-family-names-003.html localized-family-names-003-ref.html == localized-family-names-004.html localized-family-names-004-ref.html # family names with escaped spaces shouldn't match the names without the spaces diff --git a/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list b/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list index 00ec381aaaaa..0649186f5d84 100644 --- a/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list +++ b/layout/reftests/w3c-css/submitted/text-decor-3/reftest.list @@ -3,7 +3,7 @@ # text-emphasis-style == text-emphasis-style-property-001.html text-emphasis-style-property-001-ref.html -fuzzy-if(gtkWidget,3,4) fuzzy-if(skiaContent,87,65) == text-emphasis-style-property-002.html text-emphasis-style-property-002-ref.html +fuzzy-if(gtkWidget,3,4) fuzzy-if(skiaContent,87,80) == text-emphasis-style-property-002.html text-emphasis-style-property-002-ref.html skip-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) == text-emphasis-style-property-003.html text-emphasis-style-property-003-ref.html skip-if(/^Windows\x20NT\x205\.1/.test(http.oscpu)) == text-emphasis-style-property-004.html text-emphasis-style-property-004-ref.html == text-emphasis-style-property-005.html text-emphasis-style-property-005-ref.html @@ -53,7 +53,7 @@ fuzzy-if(gtkWidget,3,4) == text-emphasis-color-property-002.html text-emphasis-c # text-emphasis == text-emphasis-property-001.html text-emphasis-style-property-001-ref.html -fuzzy-if(gtkWidget,3,4) fuzzy-if(skiaContent,87,65) == text-emphasis-property-002.html text-emphasis-style-property-002-ref.html +fuzzy-if(gtkWidget,3,4) fuzzy-if(skiaContent,87,80) == text-emphasis-property-002.html text-emphasis-style-property-002-ref.html fuzzy-if(gtkWidget,3,4) == text-emphasis-property-003.html text-emphasis-style-property-012-ref.html fuzzy-if(gtkWidget,3,4) == text-emphasis-property-003a.html text-emphasis-style-property-012-ref.html fuzzy-if(gtkWidget,3,4) == text-emphasis-property-003b.html text-emphasis-style-property-012-ref.html diff --git a/mobile/android/base/resources/drawable/handle_anchor_level.xml b/mobile/android/base/resources/drawable/handle_anchor_level.xml deleted file mode 100644 index 22945138d765..000000000000 --- a/mobile/android/base/resources/drawable/handle_anchor_level.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/mobile/android/base/resources/drawable/handle_focus_level.xml b/mobile/android/base/resources/drawable/handle_focus_level.xml deleted file mode 100644 index 40a512b3800a..000000000000 --- a/mobile/android/base/resources/drawable/handle_focus_level.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - diff --git a/mobile/android/components/FxAccountsPush.js b/mobile/android/components/FxAccountsPush.js index 91efb648a28f..e6054a2de615 100644 --- a/mobile/android/components/FxAccountsPush.js +++ b/mobile/android/components/FxAccountsPush.js @@ -136,7 +136,7 @@ FxAccountsPush.prototype = { let headers = null; if (data.message && data.enc && (data.enckey || data.cryptokey)) { - let headers = { + headers = { encryption_key: data.enckey, crypto_key: data.cryptokey, encryption: data.enc, diff --git a/netwerk/cache/nsApplicationCacheService.cpp b/netwerk/cache/nsApplicationCacheService.cpp index dfbf96c7f6a6..17012518d480 100644 --- a/netwerk/cache/nsApplicationCacheService.cpp +++ b/netwerk/cache/nsApplicationCacheService.cpp @@ -189,7 +189,7 @@ nsApplicationCacheService::EvictMatchingOriginAttributes(nsAString const &aPatte mozilla::OriginAttributesPattern pattern; if (!pattern.Init(aPattern)) { - NS_ERROR("Could not parse OriginAttributesPattern JSON in clear-origin-data notification"); + NS_ERROR("Could not parse OriginAttributesPattern JSON in clear-origin-attributes-data notification"); return NS_ERROR_FAILURE; } @@ -237,7 +237,7 @@ public: NS_IMETHOD Observe(nsISupports *aSubject, const char *aTopic, const char16_t *aData) override { - MOZ_ASSERT(!nsCRT::strcmp(aTopic, "clear-origin-data")); + MOZ_ASSERT(!nsCRT::strcmp(aTopic, "clear-origin-attributes-data")); nsresult rv; @@ -263,6 +263,6 @@ nsApplicationCacheService::AppClearDataObserverInit() nsCOMPtr observerService = services::GetObserverService(); if (observerService) { RefPtr obs = new AppCacheClearDataObserver(); - observerService->AddObserver(obs, "clear-origin-data", /*ownsWeak=*/ false); + observerService->AddObserver(obs, "clear-origin-attributes-data", /*ownsWeak=*/ false); } } diff --git a/netwerk/cache2/CacheObserver.cpp b/netwerk/cache2/CacheObserver.cpp index bd691fda394b..1eb76e8c5bc8 100644 --- a/netwerk/cache2/CacheObserver.cpp +++ b/netwerk/cache2/CacheObserver.cpp @@ -129,7 +129,7 @@ CacheObserver::Init() obs->AddObserver(sSelf, "profile-before-change", true); obs->AddObserver(sSelf, "xpcom-shutdown", true); obs->AddObserver(sSelf, "last-pb-context-exited", true); - obs->AddObserver(sSelf, "clear-origin-data", true); + obs->AddObserver(sSelf, "clear-origin-attributes-data", true); obs->AddObserver(sSelf, "memory-pressure", true); return NS_OK; @@ -552,10 +552,10 @@ CacheObserver::Observe(nsISupports* aSubject, return NS_OK; } - if (!strcmp(aTopic, "clear-origin-data")) { + if (!strcmp(aTopic, "clear-origin-attributes-data")) { NeckoOriginAttributes oa; if (!oa.Init(nsDependentString(aData))) { - NS_ERROR("Could not parse NeckoOriginAttributes JSON in clear-origin-data notification"); + NS_ERROR("Could not parse NeckoOriginAttributes JSON in clear-origin-attributes-data notification"); return NS_OK; } diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index b8812c8d02e9..2c5b3c77497b 100644 --- a/netwerk/protocol/http/HttpBaseChannel.cpp +++ b/netwerk/protocol/http/HttpBaseChannel.cpp @@ -2937,31 +2937,30 @@ HttpBaseChannel::SetupReplacementChannel(nsIURI *newURI, bool isTopLevelDoc = newLoadInfo->GetExternalContentPolicyType() == nsIContentPolicy::TYPE_DOCUMENT; - if (isTopLevelDoc) { - nsCOMPtr loadContext; - NS_QueryNotificationCallbacks(this, loadContext); - DocShellOriginAttributes docShellAttrs; - if (loadContext) { - loadContext->GetOriginAttributes(docShellAttrs); - } - MOZ_ASSERT(docShellAttrs.mFirstPartyDomain.IsEmpty(), - "top-level docshell shouldn't have firstPartyDomain attribute."); - - NeckoOriginAttributes attrs = newLoadInfo->GetOriginAttributes(); - - MOZ_ASSERT(docShellAttrs.mAppId == attrs.mAppId, - "docshell and necko should have the same appId attribute."); - MOZ_ASSERT(docShellAttrs.mUserContextId == attrs.mUserContextId, - "docshell and necko should have the same userContextId attribute."); - MOZ_ASSERT(docShellAttrs.mInIsolatedMozBrowser == attrs.mInIsolatedMozBrowser, - "docshell and necko should have the same inIsolatedMozBrowser attribute."); - MOZ_ASSERT(docShellAttrs.mPrivateBrowsingId == attrs.mPrivateBrowsingId, - "docshell and necko should have the same privateBrowsingId attribute."); - - attrs.InheritFromDocShellToNecko(docShellAttrs, true, newURI); - newLoadInfo->SetOriginAttributes(attrs); + nsCOMPtr loadContext; + NS_QueryNotificationCallbacks(this, loadContext); + DocShellOriginAttributes docShellAttrs; + if (loadContext) { + loadContext->GetOriginAttributes(docShellAttrs); } + // top-level docshell shouldn't have firstPartyDomain attribute. + MOZ_ASSERT_IF(isTopLevelDoc, docShellAttrs.mFirstPartyDomain.IsEmpty()); + + NeckoOriginAttributes attrs = newLoadInfo->GetOriginAttributes(); + + MOZ_ASSERT(docShellAttrs.mAppId == attrs.mAppId, + "docshell and necko should have the same appId attribute."); + MOZ_ASSERT(docShellAttrs.mUserContextId == attrs.mUserContextId, + "docshell and necko should have the same userContextId attribute."); + MOZ_ASSERT(docShellAttrs.mInIsolatedMozBrowser == attrs.mInIsolatedMozBrowser, + "docshell and necko should have the same inIsolatedMozBrowser attribute."); + MOZ_ASSERT(docShellAttrs.mPrivateBrowsingId == attrs.mPrivateBrowsingId, + "docshell and necko should have the same privateBrowsingId attribute."); + + attrs.InheritFromDocShellToNecko(docShellAttrs, isTopLevelDoc, newURI); + newLoadInfo->SetOriginAttributes(attrs); + bool isInternalRedirect = (redirectFlags & (nsIChannelEventSink::REDIRECT_INTERNAL | nsIChannelEventSink::REDIRECT_STS_UPGRADE)); diff --git a/netwerk/protocol/http/nsCORSListenerProxy.cpp b/netwerk/protocol/http/nsCORSListenerProxy.cpp index bd2e2484b75a..c2a624330588 100644 --- a/netwerk/protocol/http/nsCORSListenerProxy.cpp +++ b/netwerk/protocol/http/nsCORSListenerProxy.cpp @@ -602,6 +602,7 @@ nsCORSListenerProxy::CheckRequestApproved(nsIRequest* aRequest) } if (mWithCredentials || !allowedOriginHeader.EqualsLiteral("*")) { + MOZ_ASSERT(!nsContentUtils::IsExpandedPrincipal(mOriginHeaderPrincipal)); nsAutoCString origin; nsContentUtils::GetASCIIOrigin(mOriginHeaderPrincipal, origin); @@ -950,6 +951,12 @@ nsCORSListenerProxy::UpdateChannel(nsIChannel* aChannel, uri->GetUserPass(userpass); NS_ENSURE_TRUE(userpass.IsEmpty(), NS_ERROR_DOM_BAD_URI); + // If we have an expanded principal here, we'll reject the CORS request, + // because we can't send a useful Origin header which is required for CORS. + if (nsContentUtils::IsExpandedPrincipal(mOriginHeaderPrincipal)) { + return NS_ERROR_DOM_BAD_URI; + } + // Add the Origin header nsAutoCString origin; rv = nsContentUtils::GetASCIIOrigin(mOriginHeaderPrincipal, origin); diff --git a/netwerk/protocol/http/nsHttpAuthCache.cpp b/netwerk/protocol/http/nsHttpAuthCache.cpp index 1ce752ff3f35..be5cd17a7728 100644 --- a/netwerk/protocol/http/nsHttpAuthCache.cpp +++ b/netwerk/protocol/http/nsHttpAuthCache.cpp @@ -60,7 +60,7 @@ nsHttpAuthCache::nsHttpAuthCache() { nsCOMPtr obsSvc = services::GetObserverService(); if (obsSvc) { - obsSvc->AddObserver(mObserver, "clear-origin-data", false); + obsSvc->AddObserver(mObserver, "clear-origin-attributes-data", false); } } @@ -70,7 +70,7 @@ nsHttpAuthCache::~nsHttpAuthCache() ClearAll(); nsCOMPtr obsSvc = services::GetObserverService(); if (obsSvc) { - obsSvc->RemoveObserver(mObserver, "clear-origin-data"); + obsSvc->RemoveObserver(mObserver, "clear-origin-attributes-data"); mObserver->mOwner = nullptr; } } diff --git a/netwerk/test/unit/test_auth_jar.js b/netwerk/test/unit/test_auth_jar.js index 99817725b32a..e3050105e731 100644 --- a/netwerk/test/unit/test_auth_jar.js +++ b/netwerk/test/unit/test_auth_jar.js @@ -24,7 +24,7 @@ function run_test() { am.setAuthIdentity("http", "a.example.com", -1, "basic", "realm", "", "example.com", "user2", "pass2", false, app10); let attrs_inBrowser = JSON.stringify({ appId:1, inIsolatedMozBrowser:true }); - Services.obs.notifyObservers(null, "clear-origin-data", attrs_inBrowser); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_inBrowser); var domain = {value: ""}, user = {value: ""}, pass = {value: ""}; try { diff --git a/netwerk/test/unit/test_cache_jar.js b/netwerk/test/unit/test_cache_jar.js index 01416f2c8994..126e811f86e1 100644 --- a/netwerk/test/unit/test_cache_jar.js +++ b/netwerk/test/unit/test_cache_jar.js @@ -64,7 +64,7 @@ function run_all_tests() { let attrs_inBrowser = JSON.stringify({ appId:1, inIsolatedMozBrowser:true }); let attrs_notInBrowser = JSON.stringify({ appId:1 }); - Services.obs.notifyObservers(null, "clear-origin-data", attrs_inBrowser); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_inBrowser); for (let test of secondTests) { handlers_called = 0; @@ -73,8 +73,8 @@ function run_all_tests() { yield undefined; } - Services.obs.notifyObservers(null, "clear-origin-data", attrs_notInBrowser); - Services.obs.notifyObservers(null, "clear-origin-data", attrs_inBrowser); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_notInBrowser); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_inBrowser); for (let test of thirdTests) { handlers_called = 0; @@ -84,7 +84,7 @@ function run_all_tests() { } let attrs_userContextId = JSON.stringify({ userContextId: 1 }); - Services.obs.notifyObservers(null, "clear-origin-data", attrs_userContextId); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs_userContextId); for (let test of fourthTests) { handlers_called = 0; diff --git a/old-configure.in b/old-configure.in index e0ea552f485d..c25d1372c1b8 100644 --- a/old-configure.in +++ b/old-configure.in @@ -1095,6 +1095,10 @@ case "$target" in dnl If nothing, compiler sometimes causes C1041 error. CFLAGS="$CFLAGS -FS" CXXFLAGS="$CXXFLAGS -FS" + dnl VS2013+ supports -Gw for better linker optimizations. + dnl http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx + CFLAGS="$CFLAGS -Gw" + CXXFLAGS="$CXXFLAGS -Gw" # khuey says we can safely ignore MSVC warning C4251 # MSVC warning C4244 (implicit type conversion may lose data) warns # and requires workarounds for perfectly valid code. Also, GCC/clang diff --git a/security/manager/locales/en-US/chrome/pippki/pippki.properties b/security/manager/locales/en-US/chrome/pippki/pippki.properties index 518403d10d5e..fe7bc2e0797e 100644 --- a/security/manager/locales/en-US/chrome/pippki/pippki.properties +++ b/security/manager/locales/en-US/chrome/pippki/pippki.properties @@ -1,19 +1,21 @@ -# # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. CertPassPrompt=Please enter the Personal Security Password for the PSM Private Keys security device. -#These are for dialogs -#Download Cert dialog +# LOCALIZATION NOTE(certWithSerial): Used for semi-uniquely representing a cert. +# %1$S is the serial number of the cert in AA:BB:CC hex format. +certWithSerial=Certificate with serial number: %1$S + +# Download Cert dialog newCAMessage1=Do you want to trust “%S” for the following purposes? unnamedCA=Certificate Authority (unnamed) -#For editing cert trust +# For editing cert trust editTrustCA=The certificate “%S” represents a Certificate Authority. -#For Deleting Certificates +# For Deleting Certificates deleteSslCertConfirm3=Are you sure you want to delete these server exceptions? deleteSslCertImpact3=If you delete a server exception, you restore the usual security checks for that server and require it uses a valid certificate. deleteSslCertTitle3=Delete Server Certificate Exceptions @@ -33,14 +35,13 @@ deleteEmailCertTitle=Delete E-Mail Certificates deleteOrphanCertConfirm=Are you sure you want to delete these certificates? deleteOrphanCertTitle=Delete Certificates - -#PKCS#12 file dialogs +# PKCS#12 file dialogs chooseP12RestoreFileDialog2=Certificate File to Import chooseP12BackupFileDialog=File Name to Backup file_browse_PKCS12_spec=PKCS12 Files getPKCS12FilePasswordMessage=Please enter the password that was used to encrypt this certificate backup: -#Cert verification +# Cert verification certVerified=This certificate has been verified for the following uses: certNotVerified_CertRevoked=Could not verify this certificate because it has been revoked. certNotVerified_CertExpired=Could not verify this certificate because it has expired. @@ -51,7 +52,7 @@ certNotVerified_CAInvalid=Could not verify this certificate because the CA certi certNotVerified_AlgorithmDisabled=Could not verify this certificate because it was signed using a signature algorithm that was disabled because that algorithm is not secure. certNotVerified_Unknown=Could not verify this certificate for unknown reasons. -#Client auth +# Client auth clientAuthRemember=Remember this decision # LOCALIZATION NOTE(clientAuthNickAndSerial): Represents a single cert when the # user is choosing from a list of certificates. @@ -92,7 +93,7 @@ clientAuthIssuedBy=Issued by: %1$S # the selected cert is stored on. clientAuthStoredOn=Stored on: %1$S -#Page Info +# Page Info pageInfo_NoEncryption=Connection Not Encrypted pageInfo_Privacy_None1=The website %S does not support encryption for the page you are viewing. pageInfo_Privacy_None2=Information sent over the Internet without encryption can be seen by other people while it is in transit. @@ -109,11 +110,11 @@ pageInfo_MixedContent=Connection Partially Encrypted pageInfo_MixedContent2=Parts of the page you are viewing were not encrypted before being transmitted over the Internet. pageInfo_WeakCipher=Your connection to this website uses weak encryption and is not private. Other people can view your information or modify the website’s behavior. -#Cert Viewer +# Cert Viewer certDetails=Certificate Viewer: notPresent= -#Token Manager +# Token Manager password_not_set=(not set) failed_pw_change=Unable to change Master Password. incorrect_pw=You did not enter the correct current Master Password. Please try again. @@ -166,7 +167,7 @@ writeFileIsLocked=File is locked writeFileNoDeviceSpace=No space left on device writeFileUnknownError=Unknown error -#Add Security Exception dialog +# Add Security Exception dialog addExceptionBrandedWarning2=You are about to override how %S identifies this site. addExceptionInvalidHeader=This site attempts to identify itself with invalid information. addExceptionDomainMismatchShort=Wrong Site diff --git a/security/manager/pki/resources/content/certManager.js b/security/manager/pki/resources/content/certManager.js index cda5f18af2b0..36b257cd2e88 100644 --- a/security/manager/pki/resources/content/certManager.js +++ b/security/manager/pki/resources/content/certManager.js @@ -4,6 +4,8 @@ /* import-globals-from pippki.js */ "use strict"; +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; + const nsIFilePicker = Components.interfaces.nsIFilePicker; const nsFilePicker = "@mozilla.org/filepicker;1"; const nsIX509CertDB = Components.interfaces.nsIX509CertDB; @@ -409,8 +411,6 @@ function deleteCerts() var selTab = document.getElementById('certMgrTabbox').selectedItem; var selTabID = selTab.getAttribute('id'); - params.SetNumberStrings(numcerts + 1); - switch (selTabID) { case "mine_tab": case "websites_tab": @@ -423,16 +423,11 @@ function deleteCerts() return; } - params.SetInt(0, numcerts); - for (let t = 0; t < numcerts; t++) { - let treeItem = selected_tree_items[t]; - let cert = treeItem.cert; - if (!cert) { - params.SetString(t + 1, treeItem.hostPort); - } else { - params.SetString(t + 1, cert.commonName); - } + let array = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); + for (let treeItem of selected_tree_items) { + array.appendElement(treeItem, false); } + params.objects = array; window.openDialog('chrome://pippki/content/deletecert.xul', "", 'chrome,centerscreen,modal', params); diff --git a/security/manager/pki/resources/content/deletecert.js b/security/manager/pki/resources/content/deletecert.js index 731c2218d339..b70c991a9f73 100644 --- a/security/manager/pki/resources/content/deletecert.js +++ b/security/manager/pki/resources/content/deletecert.js @@ -4,25 +4,52 @@ /* import-globals-from pippki.js */ "use strict"; -const nsIX509Cert = Components.interfaces.nsIX509Cert; -const nsX509CertDB = "@mozilla.org/security/x509certdb;1"; -const nsIX509CertDB = Components.interfaces.nsIX509CertDB; -const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock; +const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components; -var certdb; +/** + * Param block to get passed in args and to set return values to. + * @type nsIDialogParamBlock + */ var gParams; +/** + * Returns the most appropriate string to represent the given nsICertTreeItem. + * @param {nsICertTreeItem} certTreeItem + * The item to represent. + * @returns {String} + * A representative string. + */ +function certTreeItemToString(certTreeItem) { + let cert = certTreeItem.cert; + if (!cert) { + return certTreeItem.hostPort; + } + + const attributes = [ + cert.commonName, + cert.organizationalUnit, + cert.organization, + cert.subjectName, + ]; + for (let attribute of attributes) { + if (attribute) { + return attribute; + } + } + + let bundle = document.getElementById("pippki_bundle"); + return bundle.getFormattedString("certWithSerial", [cert.serialNumber]); +} + function setWindowName() { - gParams = window.arguments[0].QueryInterface(nsIDialogParamBlock); + gParams = window.arguments[0].QueryInterface(Ci.nsIDialogParamBlock); - var typeFlag = gParams.GetString(0); - var numberOfCerts = gParams.GetInt(0); - - var bundle = document.getElementById("pippki_bundle"); - var title; - var confirm; - var impact; + let typeFlag = gParams.GetString(0); + let bundle = document.getElementById("pippki_bundle"); + let title; + let confirm; + let impact; switch (typeFlag) { case "mine_tab": @@ -54,17 +81,16 @@ function setWindowName() return; } - var confirReference = document.getElementById('confirm'); - var impactReference = document.getElementById('impact'); document.title = title; setText("confirm", confirm); let box = document.getElementById("certlist"); - for (let x = 0; x < numberOfCerts; x++) { - var listItem = document.createElement("richlistitem"); - var label = document.createElement("label"); - label.setAttribute("value", gParams.GetString(x + 1)); + for (let x = 0; x < gParams.objects.length; x++) { + let listItem = document.createElement("richlistitem"); + let label = document.createElement("label"); + let certTreeItem = gParams.objects.queryElementAt(x, Ci.nsICertTreeItem); + label.setAttribute("value", certTreeItemToString(certTreeItem)); listItem.appendChild(label); box.appendChild(listItem); } diff --git a/security/manager/ssl/ScopedNSSTypes.h b/security/manager/ssl/ScopedNSSTypes.h index a8d1fd805c3b..ce1c68081ce9 100644 --- a/security/manager/ssl/ScopedNSSTypes.h +++ b/security/manager/ssl/ScopedNSSTypes.h @@ -11,6 +11,7 @@ #define ScopedNSSTypes_h #include +#include #include "cert.h" #include "cms.h" @@ -101,7 +102,7 @@ struct name##DeletePolicy \ { \ void operator()(Type* aValue) { Deleter(aValue); } \ }; \ -typedef UniquePtr name; +typedef std::unique_ptr name; MOZ_TYPE_SPECIFIC_UNIQUE_PTR_TEMPLATE(UniquePK11Context, PK11Context, diff --git a/security/manager/ssl/nsPK11TokenDB.cpp b/security/manager/ssl/nsPK11TokenDB.cpp index d2f691857189..7743b7d5d23e 100644 --- a/security/manager/ssl/nsPK11TokenDB.cpp +++ b/security/manager/ssl/nsPK11TokenDB.cpp @@ -5,6 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "nsPK11TokenDB.h" +#include + #include "ScopedNSSTypes.h" #include "mozilla/Casting.h" #include "mozilla/Unused.h" @@ -49,9 +51,7 @@ nsPK11Token::refreshTokenInfo(const nsNSSShutDownPreventionLock& /*proofOfLock*/ // Set the Label field const char* ccLabel = mozilla::BitwiseCast(tokInfo.label); - // TODO(Bug 1305930): Stop using PL_strnlen() if/when all our supported - // platforms provide strnlen(). - mTokenLabel.Assign(ccLabel, PL_strnlen(ccLabel, sizeof(tokInfo.label))); + mTokenLabel.Assign(ccLabel, strnlen(ccLabel, sizeof(tokInfo.label))); mTokenLabel.Trim(" ", false, true); // Set the Manufacturer field @@ -59,7 +59,7 @@ nsPK11Token::refreshTokenInfo(const nsNSSShutDownPreventionLock& /*proofOfLock*/ mozilla::BitwiseCast(tokInfo.manufacturerID); mTokenManufacturerID.Assign( ccManID, - PL_strnlen(ccManID, sizeof(tokInfo.manufacturerID))); + strnlen(ccManID, sizeof(tokInfo.manufacturerID))); mTokenManufacturerID.Trim(" ", false, true); // Set the Hardware Version field @@ -78,7 +78,7 @@ nsPK11Token::refreshTokenInfo(const nsNSSShutDownPreventionLock& /*proofOfLock*/ const char* ccSerial = mozilla::BitwiseCast(tokInfo.serialNumber); mTokenSerialNum.Assign(ccSerial, - PL_strnlen(ccSerial, sizeof(tokInfo.serialNumber))); + strnlen(ccSerial, sizeof(tokInfo.serialNumber))); mTokenSerialNum.Trim(" ", false, true); return NS_OK; diff --git a/security/manager/ssl/nsPKCS11Slot.cpp b/security/manager/ssl/nsPKCS11Slot.cpp index 7703f35f6c66..780a7c4b282b 100644 --- a/security/manager/ssl/nsPKCS11Slot.cpp +++ b/security/manager/ssl/nsPKCS11Slot.cpp @@ -4,6 +4,8 @@ #include "nsPKCS11Slot.h" +#include + #include "mozilla/Casting.h" #include "mozilla/Logging.h" #include "mozilla/Telemetry.h" @@ -45,9 +47,7 @@ nsPKCS11Slot::refreshSlotInfo(const nsNSSShutDownPreventionLock& /*proofOfLock*/ // Set the Description field const char* ccDesc = mozilla::BitwiseCast(slotInfo.slotDescription); - // TODO(Bug 1305930): Stop using PL_strnlen() if/when all our supported - // platforms provide strnlen(). - mSlotDesc.Assign(ccDesc, PL_strnlen(ccDesc, sizeof(slotInfo.slotDescription))); + mSlotDesc.Assign(ccDesc, strnlen(ccDesc, sizeof(slotInfo.slotDescription))); mSlotDesc.Trim(" ", false, true); // Set the Manufacturer field @@ -55,7 +55,7 @@ nsPKCS11Slot::refreshSlotInfo(const nsNSSShutDownPreventionLock& /*proofOfLock*/ mozilla::BitwiseCast(slotInfo.manufacturerID); mSlotManufacturerID.Assign( ccManID, - PL_strnlen(ccManID, sizeof(slotInfo.manufacturerID))); + strnlen(ccManID, sizeof(slotInfo.manufacturerID))); mSlotManufacturerID.Trim(" ", false, true); // Set the Hardware Version field diff --git a/security/manager/ssl/tests/mochitest/browser/browser.ini b/security/manager/ssl/tests/mochitest/browser/browser.ini index 239e598b08a0..206911d23ad6 100644 --- a/security/manager/ssl/tests/mochitest/browser/browser.ini +++ b/security/manager/ssl/tests/mochitest/browser/browser.ini @@ -1,10 +1,12 @@ [DEFAULT] tags = psm -support-files = head.js +support-files = + head.js + *.pem [browser_bug627234_perwindowpb.js] [browser_certificateManagerLeak.js] [browser_certViewer.js] -support-files = *.pem [browser_clientAuth_connection.js] [browser_clientAuth_ui.js] +[browser_deleteCert_ui.js] diff --git a/security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js b/security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js index 99725fafff29..081521ca9b6c 100644 --- a/security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js +++ b/security/manager/ssl/tests/mochitest/browser/browser_bug627234_perwindowpb.js @@ -26,6 +26,14 @@ FakeSSLStatus.prototype = { }, }; +function whenNewWindowLoaded(aOptions, aCallback) { + let win = OpenBrowserWindow(aOptions); + win.addEventListener("load", function onLoad() { + win.removeEventListener("load", onLoad, false); + aCallback(win); + }, false); +} + // This is a template to help porting global private browsing tests // to per-window private browsing tests function test() { diff --git a/security/manager/ssl/tests/mochitest/browser/browser_certViewer.js b/security/manager/ssl/tests/mochitest/browser/browser_certViewer.js index b8a78da2c8cc..6aa7c5ada302 100644 --- a/security/manager/ssl/tests/mochitest/browser/browser_certViewer.js +++ b/security/manager/ssl/tests/mochitest/browser/browser_certViewer.js @@ -21,42 +21,42 @@ registerCleanupFunction(function() { }); add_task(function* () { - let cert = yield readCertificate("ca.pem", "CTu,CTu,CTu"); + let cert = yield readCertificate("ca.pem", "CTu,CTu,CTu", certificates); let win = yield displayCertificate(cert); checkUsages(win, ["SSL Certificate Authority"]); yield BrowserTestUtils.closeWindow(win); }); add_task(function* () { - let cert = yield readCertificate("ssl-ee.pem", ",,"); + let cert = yield readCertificate("ssl-ee.pem", ",,", certificates); let win = yield displayCertificate(cert); checkUsages(win, ["SSL Server Certificate", "SSL Client Certificate"]); yield BrowserTestUtils.closeWindow(win); }); add_task(function* () { - let cert = yield readCertificate("email-ee.pem", ",,"); + let cert = yield readCertificate("email-ee.pem", ",,", certificates); let win = yield displayCertificate(cert); checkUsages(win, ["Email Recipient Certificate", "Email Signer Certificate"]); yield BrowserTestUtils.closeWindow(win); }); add_task(function* () { - let cert = yield readCertificate("code-ee.pem", ",,"); + let cert = yield readCertificate("code-ee.pem", ",,", certificates); let win = yield displayCertificate(cert); checkUsages(win, ["Object Signer"]); yield BrowserTestUtils.closeWindow(win); }); add_task(function* () { - let cert = yield readCertificate("expired-ca.pem", ",,"); + let cert = yield readCertificate("expired-ca.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because it has expired."); yield BrowserTestUtils.closeWindow(win); }); add_task(function* () { - let cert = yield readCertificate("ee-from-expired-ca.pem", ",,"); + let cert = yield readCertificate("ee-from-expired-ca.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because the CA certificate " + @@ -65,7 +65,7 @@ add_task(function* () { }); add_task(function* () { - let cert = yield readCertificate("unknown-issuer.pem", ",,"); + let cert = yield readCertificate("unknown-issuer.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because the issuer is " + @@ -74,7 +74,7 @@ add_task(function* () { }); add_task(function* () { - let cert = yield readCertificate("md5-ee.pem", ",,"); + let cert = yield readCertificate("md5-ee.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because it was signed using " + @@ -84,7 +84,7 @@ add_task(function* () { }); add_task(function* () { - let cert = yield readCertificate("untrusted-ca.pem", "p,p,p"); + let cert = yield readCertificate("untrusted-ca.pem", "p,p,p", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because it is not trusted."); @@ -92,7 +92,8 @@ add_task(function* () { }); add_task(function* () { - let cert = yield readCertificate("ee-from-untrusted-ca.pem", ",,"); + let cert = yield readCertificate("ee-from-untrusted-ca.pem", ",,", + certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because the issuer is not " + @@ -109,7 +110,7 @@ add_task(function* () { certBlocklist.revokeCertBySubjectAndPubKey( "MBIxEDAOBgNVBAMMB3Jldm9rZWQ=", // CN=revoked "VCIlmPM9NkgFQtrs4Oa5TeFcDu6MWRTKSNdePEhOgD8="); // hash of the shared key - let cert = yield readCertificate("revoked.pem", ",,"); + let cert = yield readCertificate("revoked.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate because it has been revoked."); @@ -121,48 +122,12 @@ add_task(function* () { // keyCertSign, but it doesn't have a basicConstraints extension. This // shouldn't be valid for any usage. Sadly, we give a pretty lame error // message in this case. - let cert = yield readCertificate("invalid.pem", ",,"); + let cert = yield readCertificate("invalid.pem", ",,", certificates); let win = yield displayCertificate(cert); checkError(win, "Could not verify this certificate for unknown reasons."); yield BrowserTestUtils.closeWindow(win); }); -/** - * Helper for readCertificate. - */ -function pemToBase64(pem) { - return pem.replace(/-----BEGIN CERTIFICATE-----/, "") - .replace(/-----END CERTIFICATE-----/, "") - .replace(/[\r\n]/g, ""); -} - -/** - * Given the filename of a certificate, returns a promise that will resolve with - * a handle to the certificate when that certificate has been read and imported - * with the given trust settings. - * - * @param {String} filename - * The filename of the certificate (assumed to be in the same directory). - * @param {String} trustString - * A string describing how the certificate should be trusted (see - * `certutil -A --help`). - * @return {Promise} - * A promise that will resolve with a handle to the certificate. - */ -function readCertificate(filename, trustString) { - return OS.File.read(getTestFilePath(filename)).then(data => { - let decoder = new TextDecoder(); - let pem = decoder.decode(data); - let certdb = Cc["@mozilla.org/security/x509certdb;1"] - .getService(Ci.nsIX509CertDB); - let base64 = pemToBase64(pem); - certdb.addCertFromBase64(base64, trustString, "unused"); - let cert = certdb.constructX509FromBase64(base64); - certificates.push(cert); // so we remember to delete this at the end - return cert; - }, error => { throw error; }); -} - /** * Given a certificate, returns a promise that will resolve when the certificate * viewer has opened is displaying that certificate, and has finished diff --git a/security/manager/ssl/tests/mochitest/browser/browser_deleteCert_ui.js b/security/manager/ssl/tests/mochitest/browser/browser_deleteCert_ui.js new file mode 100644 index 000000000000..e30e0690fbc9 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/browser_deleteCert_ui.js @@ -0,0 +1,226 @@ +// -*- indent-tabs-mode: nil; js-indent-level: 2 -*- +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ +"use strict"; + +// Tests various aspects of the cert delete confirmation dialog. +// Among other things, tests that for each type of cert that can be deleted: +// 1. The various lines of explanation text are correctly set. +// 2. The implementation correctly falls back through multiple cert attributes +// to determine what to display to represent a cert. + +/** + * An array of tree items corresponding to TEST_CASES. + * @type nsIMutableArray + */ +var gCertArray = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); +var gImportedCerts = []; + +const FAKE_HOST_PORT = "Fake host and port"; + +/** + * @typedef {TestCase} + * @type Object + * @property {String} certFilename + * Filename of the cert, or null if we don't want to import a cert for + * this test case (i.e. we expect the hostPort attribute of + * nsICertTreeItem to be used). + * @property {String} expectedDisplayString + * The string we expect the UI to display to represent the given cert. + */ + +/** + * A list of test cases representing certs that get "deleted". + * @type TestCase[] + */ +const TEST_CASES = [ + { certFilename: null, + expectedDisplayString: FAKE_HOST_PORT }, + { certFilename: "has-cn.pem", + expectedDisplayString: "Foo" }, + { certFilename: "has-ou.pem", + expectedDisplayString: "Bar" }, + { certFilename: "has-o.pem", + expectedDisplayString: "Baz" }, + { certFilename: "has-non-empty-subject.pem", + expectedDisplayString: "C=US" }, + { certFilename: "has-empty-subject.pem", + expectedDisplayString: "Certificate with serial number: 0A" }, +]; + +/** + * Opens the cert delete confirmation dialog. + * + * @param {String} tabID + * The ID of the cert category tab the certs to delete belong to. + * @returns {Promise} + * A promise that resolves when the dialog has finished loading, with + * an array consisting of: + * 1. The window of the opened dialog. + * 2. The nsIDialogParamBlock passed to the dialog. + */ +function openDeleteCertConfirmDialog(tabID) { + let params = Cc["@mozilla.org/embedcomp/dialogparam;1"] + .createInstance(Ci.nsIDialogParamBlock); + params.SetString(0, tabID); + params.objects = gCertArray; + + let win = window.openDialog("chrome://pippki/content/deletecert.xul", "", "", + params); + return new Promise((resolve, reject) => { + win.addEventListener("load", function onLoad() { + win.removeEventListener("load", onLoad); + resolve([win, params]); + }); + }); +} + +registerCleanupFunction(() => { + let certdb = Cc["@mozilla.org/security/x509certdb;1"] + .getService(Ci.nsIX509CertDB); + for (let cert of gImportedCerts) { + certdb.deleteCertificate(cert); + } +}); + +add_task(function* setup() { + for (let testCase of TEST_CASES) { + let cert = null; + if (testCase.certFilename) { + cert = yield readCertificate(testCase.certFilename, ",,", gImportedCerts); + } + let certTreeItem = { + hostPort: FAKE_HOST_PORT, + cert: cert, + QueryInterface(iid) { + if (iid.equals(Ci.nsICertTreeItem)) { + return this; + } + + throw new Error(Cr.NS_ERROR_NO_INTERFACE); + } + }; + gCertArray.appendElement(certTreeItem, false); + } +}); + +/** + * Test helper for the below test cases. + * + * @param {String} tabID + * ID of the cert category tab the certs to delete belong to. + * @param {String} expectedTitle + * Title the dialog is expected to have. + * @param {String} expectedConfirmMsg + * Confirmation message the dialog is expected to show. + * @param {String} expectedImpact + * Impact the dialog is expected to show. + */ +function* testHelper(tabID, expectedTitle, expectedConfirmMsg, expectedImpact) { + let [win, params] = yield openDeleteCertConfirmDialog(tabID); + let certList = win.document.getElementById("certlist"); + + Assert.equal(win.document.title, expectedTitle, + `Actual and expected titles should match for ${tabID}`); + Assert.equal(win.document.getElementById("confirm").textContent, + expectedConfirmMsg, + `Actual and expected confirm message should match for ${tabID}`); + Assert.equal(win.document.getElementById("impact").textContent, + expectedImpact, + `Actual and expected impact should match for ${tabID}`); + + Assert.equal(certList.itemCount, TEST_CASES.length, + `No. of certs displayed should match for ${tabID}`); + for (let i = 0; i < certList.itemCount; i++) { + Assert.equal(certList.getItemAtIndex(i).label, + TEST_CASES[i].expectedDisplayString, + "Actual and expected display string should match for " + + `index ${i} for ${tabID}`); + } + + yield BrowserTestUtils.closeWindow(win); +} + +// Test deleting certs from the "Your Certificates" tab. +add_task(function* testDeletePersonalCerts() { + const expectedTitle = "Delete your Certificates"; + const expectedConfirmMsg = + "Are you sure you want to delete these certificates?"; + const expectedImpact = + "If you delete one of your own certificates, you can no longer use it to " + + "identify yourself."; + yield* testHelper("mine_tab", expectedTitle, expectedConfirmMsg, + expectedImpact); +}); + +// Test deleting certs from the "People" tab. +add_task(function* testDeleteOtherPeopleCerts() { + const expectedTitle = "Delete E-Mail Certificates"; + // ’ doesn't seem to work when embedded in the following literals, which is + // why escape codes are used instead. + const expectedConfirmMsg = + "Are you sure you want to delete these people\u2019s e-mail certificates?"; + const expectedImpact = + "If you delete a person\u2019s e-mail certificate, you will no longer be " + + "able to send encrypted e-mail to that person."; + yield* testHelper("others_tab", expectedTitle, expectedConfirmMsg, + expectedImpact); +}); + +// Test deleting certs from the "Servers" tab. +add_task(function* testDeleteServerCerts() { + const expectedTitle = "Delete Server Certificate Exceptions"; + const expectedConfirmMsg = + "Are you sure you want to delete these server exceptions?"; + const expectedImpact = + "If you delete a server exception, you restore the usual security checks " + + "for that server and require it uses a valid certificate."; + yield* testHelper("websites_tab", expectedTitle, expectedConfirmMsg, + expectedImpact); +}); + +// Test deleting certs from the "Authorities" tab. +add_task(function* testDeleteCACerts() { + const expectedTitle = "Delete or Distrust CA Certificates"; + const expectedConfirmMsg = + "You have requested to delete these CA certificates. For built-in " + + "certificates all trust will be removed, which has the same effect. Are " + + "you sure you want to delete or distrust?"; + const expectedImpact = + "If you delete or distrust a certificate authority (CA) certificate, " + + "this application will no longer trust any certificates issued by that CA."; + yield* testHelper("ca_tab", expectedTitle, expectedConfirmMsg, + expectedImpact); +}); + +// Test deleting certs from the "Other" tab. +add_task(function* testDeleteOtherCerts() { + const expectedTitle = "Delete Certificates"; + const expectedConfirmMsg = + "Are you sure you want to delete these certificates?"; + const expectedImpact = ""; + yield* testHelper("orphan_tab", expectedTitle, expectedConfirmMsg, + expectedImpact); +}); + +// Test that the right values are returned when the dialog is accepted. +add_task(function* testAcceptDialogReturnValues() { + let [win, params] = yield openDeleteCertConfirmDialog("ca_tab" /*arbitrary*/); + info("Accepting dialog"); + win.document.getElementById("deleteCertificate").acceptDialog(); + yield BrowserTestUtils.windowClosed(win); + + Assert.equal(params.GetInt(1), 1, + "1 should be returned to signal user accepted"); +}); + +// Test that the right values are returned when the dialog is canceled. +add_task(function* testCancelDialogReturnValues() { + let [win, params] = yield openDeleteCertConfirmDialog("ca_tab" /*arbitrary*/); + info("Canceling dialog"); + win.document.getElementById("deleteCertificate").cancelDialog(); + yield BrowserTestUtils.windowClosed(win); + + Assert.equal(params.GetInt(1), 0, + "0 should be returned to signal user canceled"); +}); diff --git a/security/manager/ssl/tests/mochitest/browser/has-cn.pem b/security/manager/ssl/tests/mochitest/browser/has-cn.pem new file mode 100644 index 000000000000..9160af332434 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-cn.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC0DCCAbqgAwIBAgIUBdYRNGqgoPy8QL2qxNIAIbGiUsowCwYJKoZIhvcNAQEL +MA0xCzAJBgNVBAMMAmNhMCIYDzIwMTQxMTI3MDAwMDAwWhgPMjAxNzAyMDQwMDAw +MDBaMDcxDDAKBgNVBAMMA0ZvbzEMMAoGA1UECwwDQmFyMQwwCgYDVQQKDANCYXox +CzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuohR +qESOFtZB/W62iAY2ED08E9nq5DVKtOz1aFdsJHvBxyWo4NgfvbGcBptuGobya+Kv +WnVramRxCHqlWqdFh/cc1SScAn7NQ/weadA4ICmTqyDDSeTbuUzCa2wO7RWCD/F+ +rWkasdMCOosqQe6ncOAPDY39ZgsrsCSSpH25iGF5kLFXkD3SO8XguEgfqDfTiEPv +JxbYVbdmWqp+ApAvOnsQgAYkzBxsl62WYVu34pYSwHUxowyR3bTK9/ytHSXTCe+5 +Fw6naOGzey8ib2njtIqVYR3uJtYlnauRCE42yxwkBCy/Fosv5fGPmRcxuLP+SSP6 +clHEMdUDrNoYCjXtjQIDAQABMAsGCSqGSIb3DQEBCwOCAQEAB1QaKkpRAhxoeSa6 +vfhiJS9a3kC+ChE/0zRqu/wVaNkxlmnq6rR5e0iZ7K2Xo7FDPxfC14UolaTFs7KH +bEA4XzCvctDD7J1MTtcGZKDjH8ua4unpm8Ux6cnXqy3SpHzirshxU/cxOm8JtjmI +89Xq1BQ34fck+wNkK894d3+uniMyy4WrAiVeQHWQ6cUnzqt+8THgWXoRQSvMgEcM +ItSIylwll9pILylS5p7wI1upXkZD0V72WR+Pp/XSP07MOR13MPkAjZxXP/8hGQRR +URtLhwGrVf5Ovc9JnFhv3CqkKR/sEcGooA3VcCafVnxyucj1bmXmbkgWCE+b/zMQ +cVSPvw== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/browser/has-cn.pem.certspec b/security/manager/ssl/tests/mochitest/browser/has-cn.pem.certspec new file mode 100644 index 000000000000..a4a0fcb5fa0f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-cn.pem.certspec @@ -0,0 +1,2 @@ +issuer:ca +subject:/CN=Foo/OU=Bar/O=Baz/C=US diff --git a/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem b/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem new file mode 100644 index 000000000000..faeccbf5aea5 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE----- +MIIChjCCAXCgAwIBAgIBCjALBgkqhkiG9w0BAQswDTELMAkGA1UEAwwCY2EwIhgP +MjAxNDExMjcwMDAwMDBaGA8yMDE3MDIwNDAwMDAwMFowADCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBALqIUahEjhbWQf1utogGNhA9PBPZ6uQ1SrTs9WhX +bCR7wcclqODYH72xnAabbhqG8mvir1p1a2pkcQh6pVqnRYf3HNUknAJ+zUP8HmnQ +OCApk6sgw0nk27lMwmtsDu0Vgg/xfq1pGrHTAjqLKkHup3DgDw2N/WYLK7AkkqR9 +uYhheZCxV5A90jvF4LhIH6g304hD7ycW2FW3ZlqqfgKQLzp7EIAGJMwcbJetlmFb +t+KWEsB1MaMMkd20yvf8rR0l0wnvuRcOp2jhs3svIm9p47SKlWEd7ibWJZ2rkQhO +NsscJAQsvxaLL+Xxj5kXMbiz/kkj+nJRxDHVA6zaGAo17Y0CAwEAATALBgkqhkiG +9w0BAQsDggEBAKAFuEA9TJ+o8myZ0AciYyCjsIcQhfPvL16vfhVmbr8IXudjeIQm +orBPLWOZWT/IVeLOYU+GecS86IFWdBjKLOMoPkZC3o6nQ95txGQrODN1uMQOQBc3 +0AMQFnKbGCgoN8VtAsn7zppipvc6FcG83fh8YnrtGa8r9LBd5r2lX3npvG8qmhWD +J+2heHQp8D3NfCzad+jQy4hUhHalbH5aTky3T/1UGfgr/cXsDAcZb09Wd5tzDVpS +CP6iZyumHdH24ta5yYTHEEKDtR+/YU987crD79DcBK+7K2k4feFEzLfPDzmbtM3G +ZadO9SSf9GWHUovurJJNJaIBMYpNGeq4nT4= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem.certspec b/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem.certspec new file mode 100644 index 000000000000..6346f7b83ad2 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-empty-subject.pem.certspec @@ -0,0 +1,3 @@ +issuer:ca +subject: +serialNumber:10 diff --git a/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem b/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem new file mode 100644 index 000000000000..58f0b49677b8 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICpjCCAZCgAwIBAgIUS5/RALAav3GqFmr/hG5FumIUs/gwCwYJKoZIhvcNAQEL +MA0xCzAJBgNVBAMMAmNhMCIYDzIwMTQxMTI3MDAwMDAwWhgPMjAxNzAyMDQwMDAw +MDBaMA0xCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAuohRqESOFtZB/W62iAY2ED08E9nq5DVKtOz1aFdsJHvBxyWo4NgfvbGcBptu +Gobya+KvWnVramRxCHqlWqdFh/cc1SScAn7NQ/weadA4ICmTqyDDSeTbuUzCa2wO +7RWCD/F+rWkasdMCOosqQe6ncOAPDY39ZgsrsCSSpH25iGF5kLFXkD3SO8XguEgf +qDfTiEPvJxbYVbdmWqp+ApAvOnsQgAYkzBxsl62WYVu34pYSwHUxowyR3bTK9/yt +HSXTCe+5Fw6naOGzey8ib2njtIqVYR3uJtYlnauRCE42yxwkBCy/Fosv5fGPmRcx +uLP+SSP6clHEMdUDrNoYCjXtjQIDAQABMAsGCSqGSIb3DQEBCwOCAQEArANWYwZp +g5Z9sRrvPIaEjgJO4fnTf5/3nECTFljJH7YjGzFhnEGk52aRGubowhTOxAtqK1lc +cA5QRMuQ/Qrr7xZOdGfoxoMnQXONcEQNobcWbxa0Z8VZrpanAhXevlk5Z/8it96g +uLtCmgz32L6J2FpsftHI38+IAGjbgZjyOnyr4jGwgltZUKV1YRGClnMQnI6N/8TH +UrESziJ6JmVWnIwvKWvtwy68gRLvSaJ+lD1KTrqOVris0yPcR+dWlXaHovegxwDB +gkhtFOYJePK8p7op+WAyKlM922UYBC4X2h/4QeySrC2LYauGFz3ZARO2ylCJ1CsJ +ypuqIXstbO0h3g== +-----END CERTIFICATE----- \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem.certspec b/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem.certspec new file mode 100644 index 000000000000..cc1b668a6354 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-non-empty-subject.pem.certspec @@ -0,0 +1,2 @@ +issuer:ca +subject:/C=US diff --git a/security/manager/ssl/tests/mochitest/browser/has-o.pem b/security/manager/ssl/tests/mochitest/browser/has-o.pem new file mode 100644 index 000000000000..92766355dd2f --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-o.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICtDCCAZ6gAwIBAgIUG62RAQRi0nQBf5QEVbVQ6tS4QOwwCwYJKoZIhvcNAQEL +MA0xCzAJBgNVBAMMAmNhMCIYDzIwMTQxMTI3MDAwMDAwWhgPMjAxNzAyMDQwMDAw +MDBaMBsxDDAKBgNVBAoMA0JhejELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQC6iFGoRI4W1kH9braIBjYQPTwT2erkNUq07PVoV2wk +e8HHJajg2B+9sZwGm24ahvJr4q9adWtqZHEIeqVap0WH9xzVJJwCfs1D/B5p0Dgg +KZOrIMNJ5Nu5TMJrbA7tFYIP8X6taRqx0wI6iypB7qdw4A8Njf1mCyuwJJKkfbmI +YXmQsVeQPdI7xeC4SB+oN9OIQ+8nFthVt2Zaqn4CkC86exCABiTMHGyXrZZhW7fi +lhLAdTGjDJHdtMr3/K0dJdMJ77kXDqdo4bN7LyJvaeO0ipVhHe4m1iWdq5EITjbL +HCQELL8Wiy/l8Y+ZFzG4s/5JI/pyUcQx1QOs2hgKNe2NAgMBAAEwCwYJKoZIhvcN +AQELA4IBAQBKExQp1zdXXkl60yJsRcUNBPbprmHDlYLFtAcAY7s8+IKn+6kWUgNG +1wrKsaoSJUxK8MO6ULSbK8Xb9djjZ5Xcy622cOe3wk3/AIwc8nhAE6d5mtCDzOGR +MWEn+wGsCtW+eWDTlefx/+D3zBNAsb7hyW54JKDjfRADN6VtFO4ca4Ybw92G6CRf +g452KvRl90oZ2cxXyxOP3qdMOpB5a9DkUVS39n7iWgv//f3qlo3eUlHHoeygJQOM +qca5cnQbYKhat2edgK5OY4eHCFOWXpxRy83/zNywLki4zozwXnTWSmuBpe2jZEev +nOCxqVD3xceDzZ3NNkFj+c7Q2IX0ykmf +-----END CERTIFICATE----- \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/browser/has-o.pem.certspec b/security/manager/ssl/tests/mochitest/browser/has-o.pem.certspec new file mode 100644 index 000000000000..f7cc3ffc739a --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-o.pem.certspec @@ -0,0 +1,2 @@ +issuer:ca +subject:/O=Baz/C=US diff --git a/security/manager/ssl/tests/mochitest/browser/has-ou.pem b/security/manager/ssl/tests/mochitest/browser/has-ou.pem new file mode 100644 index 000000000000..96654039c7e2 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-ou.pem @@ -0,0 +1,17 @@ +-----BEGIN CERTIFICATE----- +MIICwjCCAaygAwIBAgIUI7neyiHwgLifhsVz4PP5NKkCWqIwCwYJKoZIhvcNAQEL +MA0xCzAJBgNVBAMMAmNhMCIYDzIwMTQxMTI3MDAwMDAwWhgPMjAxNzAyMDQwMDAw +MDBaMCkxDDAKBgNVBAsMA0JhcjEMMAoGA1UECgwDQmF6MQswCQYDVQQGEwJVUzCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALqIUahEjhbWQf1utogGNhA9 +PBPZ6uQ1SrTs9WhXbCR7wcclqODYH72xnAabbhqG8mvir1p1a2pkcQh6pVqnRYf3 +HNUknAJ+zUP8HmnQOCApk6sgw0nk27lMwmtsDu0Vgg/xfq1pGrHTAjqLKkHup3Dg +Dw2N/WYLK7AkkqR9uYhheZCxV5A90jvF4LhIH6g304hD7ycW2FW3ZlqqfgKQLzp7 +EIAGJMwcbJetlmFbt+KWEsB1MaMMkd20yvf8rR0l0wnvuRcOp2jhs3svIm9p47SK +lWEd7ibWJZ2rkQhONsscJAQsvxaLL+Xxj5kXMbiz/kkj+nJRxDHVA6zaGAo17Y0C +AwEAATALBgkqhkiG9w0BAQsDggEBAGKpDaMHux0AWDSH/3scV6W+6ZFtsAH/kTw2 +zPfPad1z7xECUDzNaLjJYdTiXplBFoB9lFNmM2pb/Z98FZPLCK7wD36jLtSrBjLm +KlDKieE3aoHHe2RANz3fEod7jV/YVuZXLNQaMEMXAdXV1qfrMOuyiYgo+Crr/EMO +ApAQvOPxOR34Z7mBPnxVwn3w85zxrpcRzbg+UFJcr1yk0yKrlawSCB1CV/itIkCJ +sdpqub2wRy6w3nCwaCmp92bmDAOS9K4UG4tCvwKFihYLBx1MiVmUZC90nrXSynh8 +b1hdzFnKZxzoZgM7yNuqw06Xzx0eg8yqi4wLjj+uA3UdZHP7MAk= +-----END CERTIFICATE----- \ No newline at end of file diff --git a/security/manager/ssl/tests/mochitest/browser/has-ou.pem.certspec b/security/manager/ssl/tests/mochitest/browser/has-ou.pem.certspec new file mode 100644 index 000000000000..8879dabf5134 --- /dev/null +++ b/security/manager/ssl/tests/mochitest/browser/has-ou.pem.certspec @@ -0,0 +1,2 @@ +issuer:ca +subject:/OU=Bar/O=Baz/C=US diff --git a/security/manager/ssl/tests/mochitest/browser/head.js b/security/manager/ssl/tests/mochitest/browser/head.js index 1c042cd18b78..0d307d9c37a6 100644 --- a/security/manager/ssl/tests/mochitest/browser/head.js +++ b/security/manager/ssl/tests/mochitest/browser/head.js @@ -2,10 +2,41 @@ http://creativecommons.org/publicdomain/zero/1.0/ */ "use strict"; -function whenNewWindowLoaded(aOptions, aCallback) { - let win = OpenBrowserWindow(aOptions); - win.addEventListener("load", function onLoad() { - win.removeEventListener("load", onLoad, false); - aCallback(win); - }, false); +/** + * This function serves the same purpose as the one defined in head_psm.js. + */ +function pemToBase64(pem) { + return pem.replace(/-----BEGIN CERTIFICATE-----/, "") + .replace(/-----END CERTIFICATE-----/, "") + .replace(/[\r\n]/g, ""); +} + +/** + * Given the filename of a certificate, returns a promise that will resolve with + * a handle to the certificate when that certificate has been read and imported + * with the given trust settings. + * + * @param {String} filename + * The filename of the certificate (assumed to be in the same directory). + * @param {String} trustString + * A string describing how the certificate should be trusted (see + * `certutil -A --help`). + * @param {nsIX509Cert[]} certificates + * An array to append the imported cert to. Useful for making sure + * imported certs are cleaned up. + * @return {Promise} + * A promise that will resolve with a handle to the certificate. + */ +function readCertificate(filename, trustString, certificates) { + return OS.File.read(getTestFilePath(filename)).then(data => { + let decoder = new TextDecoder(); + let pem = decoder.decode(data); + let certdb = Cc["@mozilla.org/security/x509certdb;1"] + .getService(Ci.nsIX509CertDB); + let base64 = pemToBase64(pem); + certdb.addCertFromBase64(base64, trustString, "unused"); + let cert = certdb.constructX509FromBase64(base64); + certificates.push(cert); + return cert; + }, error => { throw error; }); } diff --git a/security/manager/ssl/tests/mochitest/browser/moz.build b/security/manager/ssl/tests/mochitest/browser/moz.build index 6477071b6689..49d7d5a11905 100644 --- a/security/manager/ssl/tests/mochitest/browser/moz.build +++ b/security/manager/ssl/tests/mochitest/browser/moz.build @@ -18,6 +18,11 @@ BROWSER_CHROME_MANIFESTS += ['browser.ini'] # 'ee-from-untrusted-ca.pem', # 'email-ee.pem', # 'expired-ca.pem', +# 'has-cn.pem', +# 'has-empty-subject.pem', +# 'has-non-empty-subject.pem', +# 'has-o.pem', +# 'has-ou.pem', # 'invalid.pem', # 'md5-ee.pem', # 'revoked.pem', diff --git a/security/sandbox/linux/SandboxFilter.cpp b/security/sandbox/linux/SandboxFilter.cpp index 03978594d13c..9af5ffde5a8b 100644 --- a/security/sandbox/linux/SandboxFilter.cpp +++ b/security/sandbox/linux/SandboxFilter.cpp @@ -595,6 +595,14 @@ public: CASES_FOR_stat: CASES_FOR_lstat: CASES_FOR_fstatat: + case __NR_chmod: + case __NR_link: + case __NR_mkdir: + case __NR_symlink: + case __NR_rename: + case __NR_rmdir: + case __NR_unlink: + case __NR_readlink: return Allow(); } } diff --git a/taskcluster/taskgraph/transforms/job/mozharness.py b/taskcluster/taskgraph/transforms/job/mozharness.py index 095db6b0b697..3dbbd0ff41c7 100644 --- a/taskcluster/taskgraph/transforms/job/mozharness.py +++ b/taskcluster/taskgraph/transforms/job/mozharness.py @@ -140,6 +140,9 @@ def mozharness_on_docker_worker_setup(config, job, taskdesc): env['TOOLTOOL_REPO'] = 'https://github.com/mozilla/build-tooltool' env['TOOLTOOL_REV'] = 'master' + # Retry if mozharness returns TBPL_RETRY + worker['retry-exit-status'] = 4 + docker_worker_setup_secrets(config, job, taskdesc) command = [ diff --git a/taskcluster/taskgraph/transforms/task.py b/taskcluster/taskgraph/transforms/task.py index e65bd619bf2b..a8b8a2d8f146 100644 --- a/taskcluster/taskgraph/transforms/task.py +++ b/taskcluster/taskgraph/transforms/task.py @@ -197,6 +197,10 @@ task_description_schema = Schema({ # the maximum time to run, in seconds 'max-run-time': int, + + # the exit status code that indicates the task should be retried + Optional('retry-exit-status'): int, + }, { Required('implementation'): 'generic-worker', @@ -348,6 +352,9 @@ def build_docker_worker_payload(config, task, task_def): if 'max-run-time' in worker: payload['maxRunTime'] = worker['max-run-time'] + if 'retry-exit-status' in worker: + payload['onExitStatus'] = {'retry': [worker['retry-exit-status']]} + if 'artifacts' in worker: artifacts = {} for artifact in worker['artifacts']: @@ -398,6 +405,9 @@ def build_generic_worker_payload(config, task, task_def): 'maxRunTime': worker['max-run-time'], } + if 'retry-exit-status' in worker: + raise Exception("retry-exit-status not supported in generic-worker") + transforms = TransformSequence() diff --git a/taskcluster/taskgraph/transforms/tests/all_kinds.py b/taskcluster/taskgraph/transforms/tests/all_kinds.py index 1c0be56b07de..b892059aed94 100644 --- a/taskcluster/taskgraph/transforms/tests/all_kinds.py +++ b/taskcluster/taskgraph/transforms/tests/all_kinds.py @@ -122,3 +122,12 @@ def split_chunks(config, tests): chunked['treeherder-symbol'] = join_symbol(group, symbol) yield chunked + + +@transforms.add +def set_retry_exit_status(config, tests): + """Set the retry exit status to TBPL_RETRY, the value returned by mozharness + scripts to indicate a transient failure that should be retried.""" + for test in tests: + test['retry-exit-status'] = 4 + yield test diff --git a/taskcluster/taskgraph/transforms/tests/make_task_description.py b/taskcluster/taskgraph/transforms/tests/make_task_description.py index f16ebae0a02d..7916289a6deb 100644 --- a/taskcluster/taskgraph/transforms/tests/make_task_description.py +++ b/taskcluster/taskgraph/transforms/tests/make_task_description.py @@ -146,6 +146,7 @@ def docker_worker_setup(config, test, taskdesc): worker['loopback-video'] = test['loopback-video'] worker['loopback-audio'] = test['loopback-audio'] worker['max-run-time'] = test['max-run-time'] + worker['retry-exit-status'] = test['retry-exit-status'] worker['artifacts'] = [{ 'name': prefix, diff --git a/taskcluster/taskgraph/transforms/tests/test_description.py b/taskcluster/taskgraph/transforms/tests/test_description.py index c0314dbaa7e5..e514479c0a09 100644 --- a/taskcluster/taskgraph/transforms/tests/test_description.py +++ b/taskcluster/taskgraph/transforms/tests/test_description.py @@ -130,6 +130,9 @@ test_description_schema = Schema({ {'by-test-platform': {basestring: int}}, ), + # the exit status code that indicates the task should be retried + Optional('retry-exit-status'): int, + # Whether to perform a gecko checkout. Required('checkout', default=False): bool, diff --git a/testing/mozharness/configs/marionette/prod_config.py b/testing/mozharness/configs/marionette/prod_config.py index 1a14445ab8e1..3a61661589ed 100644 --- a/testing/mozharness/configs/marionette/prod_config.py +++ b/testing/mozharness/configs/marionette/prod_config.py @@ -118,4 +118,5 @@ config = { "testsdir": "" } }, + "structured_output": True, } diff --git a/testing/mozharness/mozharness/base/log.py b/testing/mozharness/mozharness/base/log.py index 9646a5ccf0e2..2c18b50c334b 100755 --- a/testing/mozharness/mozharness/base/log.py +++ b/testing/mozharness/mozharness/base/log.py @@ -263,7 +263,7 @@ class OutputParser(LogMixin): pre-context-line setting in error_list.) """ - def __init__(self, config=None, log_obj=None, error_list=None, log_output=True): + def __init__(self, config=None, log_obj=None, error_list=None, log_output=True, **kwargs): """Initialization method for the OutputParser class Args: diff --git a/testing/mozharness/mozharness/mozilla/testing/errors.py b/testing/mozharness/mozharness/mozilla/testing/errors.py index a072b59e0242..95782db2bc66 100644 --- a/testing/mozharness/mozharness/mozilla/testing/errors.py +++ b/testing/mozharness/mozharness/mozilla/testing/errors.py @@ -98,7 +98,7 @@ TinderBoxPrintRe = { "harness_error": { 'full_regex': re.compile(r"(?:TEST-UNEXPECTED-FAIL|PROCESS-CRASH) \| .* \| (application crashed|missing output line for total leaks!|negative leaks caught!|\d+ bytes leaked)"), 'minimum_regex': re.compile(r'''(TEST-UNEXPECTED|PROCESS-CRASH)'''), - 'retry_regex': re.compile(r'''FAIL-SHOULD-RETRY''') + 'retry_regex': re.compile(r'''(FAIL-SHOULD-RETRY|No space left on device|DMError|Connection to the other side was lost in a non-clean fashion|program finished with exit code 80|INFRA-ERROR|twisted.spread.pb.PBConnectionLost)''') }, } diff --git a/testing/mozharness/scripts/marionette.py b/testing/mozharness/scripts/marionette.py index f90d42a46e15..7c5d6194af7d 100755 --- a/testing/mozharness/scripts/marionette.py +++ b/testing/mozharness/scripts/marionette.py @@ -19,7 +19,6 @@ from mozharness.base.script import PreScriptAction from mozharness.base.transfer import TransferMixin from mozharness.base.vcs.vcsbase import MercurialScript from mozharness.mozilla.blob_upload import BlobUploadMixin, blobupload_config_options -from mozharness.mozilla.buildbot import TBPL_SUCCESS, TBPL_WARNING, TBPL_FAILURE from mozharness.mozilla.gaia import GaiaMixin from mozharness.mozilla.testing.errors import LogcatErrorList from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options @@ -28,6 +27,8 @@ from mozharness.mozilla.structuredlog import StructuredOutputParser # TODO: we could remove emulator specific code after B2G ICS emulator buildbot # builds is turned off, Bug 1209180. + + class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMixin, GaiaMixin): config_options = [[ ["--application"], @@ -115,27 +116,27 @@ class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMix {"action": "store", "dest": "total_chunks", "help": "Number of total chunks", - } + } ], [ ["--this-chunk"], {"action": "store", "dest": "this_chunk", "help": "Number of this chunk", - } + } ], [ ["--e10s"], {"action": "store_true", "dest": "e10s", "default": False, "help": "Run tests with multiple processes. (Desktop builds only)", - } + } ], [ ["--allow-software-gl-layers"], {"action": "store_true", "dest": "allow_software_gl_layers", "default": False, "help": "Permits a software GL implementation (such as LLVMPipe) to use the GL compositor." - } + } ]] + copy.deepcopy(testing_config_options) \ + copy.deepcopy(blobupload_config_options) @@ -329,8 +330,9 @@ class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMix 'xml_output': os.path.join(dirs['abs_work_dir'], 'output.xml'), 'html_output': os.path.join(dirs['abs_blob_upload_dir'], 'output.html'), 'logcat_dir': dirs['abs_work_dir'], - 'emulator': 'x86' if os.path.isdir(os.path.join(dirs['abs_b2g-distro_dir'], 'out', - 'target', 'product', 'generic_x86')) else 'arm', + 'emulator': 'x86' if os.path.isdir( + os.path.join(dirs['abs_b2g-distro_dir'], 'out', + 'target', 'product', 'generic_x86')) else 'arm', 'symbols_path': self.symbols_path, 'homedir': os.path.join(dirs['abs_emulator_dir'], 'b2g-distro'), 'binary': self.binary_path, @@ -405,7 +407,7 @@ class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMix 'gecko.log')) if self.config.get("structured_output"): - config_fmt_args["raw_log_file"]= "-" + cmd.append("--log-raw=-") options_group = self._get_options_group(self.config.get('emulator'), self.config.get('gaiatest')) @@ -444,21 +446,15 @@ class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMix marionette_parser = self.parser_class(config=self.config, log_obj=self.log_obj, - error_list=self.error_list) - code = self.run_command(cmd, env=env, + error_list=self.error_list, + strict=False) + return_code = self.run_command(cmd, env=env, output_timeout=1000, output_parser=marionette_parser) level = INFO - if code == 0 and marionette_parser.passed > 0 and marionette_parser.failed == 0: - status = "success" - tbpl_status = TBPL_SUCCESS - elif code == 10 and marionette_parser.failed > 0: - status = "test failures" - tbpl_status = TBPL_WARNING - else: - status = "harness failures" - level = ERROR - tbpl_status = TBPL_FAILURE + tbpl_status, log_level = marionette_parser.evaluate_parser( + return_code=return_code) + marionette_parser.append_tinderboxprint_line("marionette") qemu = os.path.join(dirs['abs_work_dir'], 'qemu.log') if os.path.isfile(qemu): @@ -486,7 +482,7 @@ class MarionetteTest(TestingMixin, MercurialScript, BlobUploadMixin, TransferMix marionette_parser.print_summary('marionette') - self.log("Marionette exited with return code %s: %s" % (code, status), + self.log("Marionette exited with return code %s: %s" % (return_code, tbpl_status), level=level) self.buildbot_status(tbpl_status) diff --git a/testing/specialpowers/content/SpecialPowersObserverAPI.js b/testing/specialpowers/content/SpecialPowersObserverAPI.js index a2ef4609b359..28d1ff227a98 100644 --- a/testing/specialpowers/content/SpecialPowersObserverAPI.js +++ b/testing/specialpowers/content/SpecialPowersObserverAPI.js @@ -661,7 +661,7 @@ SpecialPowersObserverAPI.prototype = { attributes.inIsolatedMozBrowser = true; } this._notifyCategoryAndObservers(null, - "clear-origin-data", + "clear-origin-attributes-data", JSON.stringify(attributes)); let subject = { diff --git a/toolkit/components/contextualidentity/ContextualIdentityService.jsm b/toolkit/components/contextualidentity/ContextualIdentityService.jsm index 33e235620fc6..db937b538af7 100644 --- a/toolkit/components/contextualidentity/ContextualIdentityService.jsm +++ b/toolkit/components/contextualidentity/ContextualIdentityService.jsm @@ -198,7 +198,7 @@ _ContextualIdentityService.prototype = { return false; } - Services.obs.notifyObservers(null, "clear-origin-data", + Services.obs.notifyObservers(null, "clear-origin-attributes-data", JSON.stringify({ userContextId })); this._identities.splice(index, 1); diff --git a/toolkit/components/extensions/Extension.jsm b/toolkit/components/extensions/Extension.jsm index 75ce7b0ad305..73fe32c201d0 100644 --- a/toolkit/components/extensions/Extension.jsm +++ b/toolkit/components/extensions/Extension.jsm @@ -627,7 +627,7 @@ var UninstallObserver = { // Clear localStorage created by the extension let attrs = JSON.stringify({addonId: addon.id}); - Services.obs.notifyObservers(null, "clear-origin-data", attrs); + Services.obs.notifyObservers(null, "clear-origin-attributes-data", attrs); } if (!this.leaveUuid) { @@ -687,6 +687,10 @@ GlobalManager = { let schemaWrapper = { isChromeCompat, + get url() { + return context.uri.spec; + }, + get principal() { return context.principal; }, diff --git a/toolkit/components/thumbnails/BackgroundPageThumbs.jsm b/toolkit/components/thumbnails/BackgroundPageThumbs.jsm index 7af10e9d5ead..e94270b26174 100644 --- a/toolkit/components/thumbnails/BackgroundPageThumbs.jsm +++ b/toolkit/components/thumbnails/BackgroundPageThumbs.jsm @@ -438,7 +438,7 @@ Capture.prototype = { // Clear the data in the private container for thumbnails. let privateIdentity = ContextualIdentityService.getPrivateIdentity("userContextIdInternal.thumbnail"); - Services.obs.notifyObservers(null, "clear-origin-data", + Services.obs.notifyObservers(null, "clear-origin-attributes-data", JSON.stringify({ userContextId: privateIdentity.userContextId })); }; diff --git a/toolkit/content/aboutTelemetry.js b/toolkit/content/aboutTelemetry.js index dd636990d48c..70adf6a81413 100644 --- a/toolkit/content/aboutTelemetry.js +++ b/toolkit/content/aboutTelemetry.js @@ -1580,6 +1580,40 @@ var Scalars = { } }; +var KeyedScalars = { + /** + * Render the keyed scalar data - if present - from the payload in a simple key-value table. + * @param aPayload A payload object to render the data from. + */ + render: function(aPayload) { + let scalarsSection = document.getElementById("keyed-scalars"); + removeAllChildNodes(scalarsSection); + + if (!aPayload.processes || !aPayload.processes.parent) { + return; + } + + let keyedScalars = aPayload.processes.parent.keyedScalars; + const hasData = keyedScalars && Object.keys(keyedScalars).length > 0; + setHasData("keyed-scalars-section", hasData); + if (!hasData) { + return; + } + + const headingName = bundle.GetStringFromName("namesHeader"); + const headingValue = bundle.GetStringFromName("valuesHeader"); + for (let scalar in keyedScalars) { + // Add the name of the scalar. + let scalarNameSection = document.createElement("h2"); + scalarNameSection.appendChild(document.createTextNode(scalar)); + scalarsSection.appendChild(scalarNameSection); + // Populate the section with the key-value pairs from the scalar. + const table = KeyValueTable.render(keyedScalars[scalar], headingName, headingValue); + scalarsSection.appendChild(table); + } + } +}; + /** * Helper function for showing either the toggle element or "No data collected" message for a section * @@ -1956,6 +1990,7 @@ function displayPingData(ping, updatePayloadList = false) { // Show scalar data. Scalars.render(payload); + KeyedScalars.render(payload); // Show histogram data let hgramDiv = document.getElementById("histograms"); diff --git a/toolkit/content/aboutTelemetry.xhtml b/toolkit/content/aboutTelemetry.xhtml index 8049e3057812..de1f5cf8c1e6 100644 --- a/toolkit/content/aboutTelemetry.xhtml +++ b/toolkit/content/aboutTelemetry.xhtml @@ -144,6 +144,15 @@ +
+ +

&aboutTelemetry.keyedScalarsSection;

+ &aboutTelemetry.toggle; + &aboutTelemetry.emptySection; +
+
+
+

&aboutTelemetry.histogramsSection;

diff --git a/toolkit/content/license.html b/toolkit/content/license.html index 28d8faba3705..684bb56a1ead 100644 --- a/toolkit/content/license.html +++ b/toolkit/content/license.html @@ -4985,7 +4985,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Unicode License

This license applies to certain files in the directories - intl/icu and js/src/vm. + intl/icu, intl/tzdata, + and js/src/vm.

diff --git a/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd b/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd
index e885c3118e95..4a08de8caba2 100644
--- a/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd
+++ b/toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd
@@ -104,6 +104,10 @@ Ping
   Scalars
 ">
 
+
+
 
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index fdf04c100a9c..93f455cb6679 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -3445,11 +3445,13 @@ XREMain::XRE_mainInit(bool* aExitFlag)
       }
     }
 
+#ifdef MOZ_CRASHREPORTER
     if (cpuUpdateRevision > 0) {
       CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("CPUMicrocodeVersion"),
                                          nsPrintfCString("0x%x",
                                                          cpuUpdateRevision));
     }
+#endif
   }
 #endif
 
diff --git a/widget/cocoa/nsChildView.h b/widget/cocoa/nsChildView.h
index d7d5b590c75f..94bbc27c7ef3 100644
--- a/widget/cocoa/nsChildView.h
+++ b/widget/cocoa/nsChildView.h
@@ -356,7 +356,7 @@ public:
   NS_IMETHOD              DispatchEvent(mozilla::WidgetGUIEvent* aEvent,
                                         nsEventStatus& aStatus) override;
 
-  virtual bool            ComputeShouldAccelerate() override;
+  virtual bool            WidgetTypeSupportsAcceleration() override;
   virtual bool            ShouldUseOffMainThreadCompositing() override;
 
   NS_IMETHOD        SetCursor(nsCursor aCursor) override;
diff --git a/widget/cocoa/nsChildView.mm b/widget/cocoa/nsChildView.mm
index ef6508860435..78213b7841f8 100644
--- a/widget/cocoa/nsChildView.mm
+++ b/widget/cocoa/nsChildView.mm
@@ -1364,14 +1364,11 @@ NS_IMETHODIMP nsChildView::Invalidate(const LayoutDeviceIntRect& aRect)
 }
 
 bool
-nsChildView::ComputeShouldAccelerate()
+nsChildView::WidgetTypeSupportsAcceleration()
 {
   // Don't use OpenGL for transparent windows or for popup windows.
-  if (!mView || ![[mView window] isOpaque] ||
-      [[mView window] isKindOfClass:[PopupWindow class]])
-    return false;
-
-  return nsBaseWidget::ComputeShouldAccelerate();
+  return mView && [[mView window] isOpaque] &&
+         ![[mView window] isKindOfClass:[PopupWindow class]];
 }
 
 bool
diff --git a/widget/cocoa/nsCocoaWindow.mm b/widget/cocoa/nsCocoaWindow.mm
index e1599b1fe907..8541fef979ba 100644
--- a/widget/cocoa/nsCocoaWindow.mm
+++ b/widget/cocoa/nsCocoaWindow.mm
@@ -479,7 +479,7 @@ nsresult nsCocoaWindow::CreateNativeWindow(const NSRect &aRect,
     [mWindow setOpaque:NO];
   } else {
     // Make sure that regular windows are opaque from the start, so that
-    // nsChildView::ComputeShouldAccelerate returns true for them.
+    // nsChildView::WidgetTypeSupportsAcceleration returns true for them.
     [mWindow setOpaque:YES];
   }
 
diff --git a/widget/gtk/nsWindow.cpp b/widget/gtk/nsWindow.cpp
index 3d200b682cdf..67803c8db378 100644
--- a/widget/gtk/nsWindow.cpp
+++ b/widget/gtk/nsWindow.cpp
@@ -871,6 +871,12 @@ nsWindow::SetParent(nsIWidget *aNewParent)
     return NS_OK;
 }
 
+bool
+nsWindow::WidgetTypeSupportsAcceleration()
+{
+  return !IsSmallPopup();
+}
+
 void
 nsWindow::ReparentNativeWidget(nsIWidget* aNewParent)
 {
diff --git a/widget/gtk/nsWindow.h b/widget/gtk/nsWindow.h
index 50e82947ec96..de518eaa891d 100644
--- a/widget/gtk/nsWindow.h
+++ b/widget/gtk/nsWindow.h
@@ -363,6 +363,7 @@ public:
     LayoutDeviceIntPoint GdkEventCoordsToDevicePixels(gdouble x, gdouble y);
     LayoutDeviceIntRect GdkRectToDevicePixels(GdkRectangle rect);
 
+    virtual bool WidgetTypeSupportsAcceleration() override;
 protected:
     virtual ~nsWindow();
 
diff --git a/widget/nsBaseWidget.cpp b/widget/nsBaseWidget.cpp
index a0f92c6b4328..413b35439d69 100644
--- a/widget/nsBaseWidget.cpp
+++ b/widget/nsBaseWidget.cpp
@@ -936,12 +936,8 @@ bool nsBaseWidget::IsSmallPopup() const
 bool
 nsBaseWidget::ComputeShouldAccelerate()
 {
-  bool enabled = gfx::gfxConfig::IsEnabled(gfx::Feature::HW_COMPOSITING);
-#ifdef MOZ_WIDGET_GTK
-  return enabled && !IsSmallPopup();
-#else
-  return enabled;
-#endif
+  return gfx::gfxConfig::IsEnabled(gfx::Feature::HW_COMPOSITING) &&
+         WidgetTypeSupportsAcceleration();
 }
 
 bool
@@ -1359,8 +1355,12 @@ void nsBaseWidget::CreateCompositor(int aWidth, int aHeight)
 
   lf->SetShadowManager(shadowManager);
   lm->UpdateTextureFactoryIdentifier(textureFactoryIdentifier);
-  ImageBridgeChild::IdentifyCompositorTextureHost(textureFactoryIdentifier);
-  gfx::VRManagerChild::IdentifyTextureHost(textureFactoryIdentifier);
+  // Some popup or transparent widgets may use a different backend than the
+  // compositors used with ImageBridge and VR (and more generally web content).
+  if (WidgetTypeSupportsAcceleration()) {
+    ImageBridgeChild::IdentifyCompositorTextureHost(textureFactoryIdentifier);
+    gfx::VRManagerChild::IdentifyTextureHost(textureFactoryIdentifier);
+  }
   WindowUsesOMTC();
 
   mLayerManager = lm.forget();
diff --git a/widget/nsBaseWidget.h b/widget/nsBaseWidget.h
index 754730b4dd47..1e994c088534 100644
--- a/widget/nsBaseWidget.h
+++ b/widget/nsBaseWidget.h
@@ -272,7 +272,8 @@ public:
                             const mozilla::WidgetKeyboardEvent& aEvent,
                             DoCommandCallback aCallback,
                             void* aCallbackData) override { return false; }
-  virtual bool            ComputeShouldAccelerate();
+  bool                    ComputeShouldAccelerate();
+  virtual bool            WidgetTypeSupportsAcceleration() { return true; }
   virtual nsIMEUpdatePreference GetIMEUpdatePreference() override { return nsIMEUpdatePreference(); }
   NS_IMETHOD              OnDefaultButtonLoaded(const LayoutDeviceIntRect& aButtonRect) override { return NS_ERROR_NOT_IMPLEMENTED; }
   virtual already_AddRefed
diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp
index b96d304a9ad0..6d4698553bc5 100644
--- a/widget/windows/nsWindow.cpp
+++ b/widget/windows/nsWindow.cpp
@@ -7795,7 +7795,7 @@ void nsWindow::PickerClosed()
 }
 
 bool
-nsWindow::ComputeShouldAccelerate()
+nsWindow::WidgetTypeSupportsAcceleration()
 {
   // We don't currently support using an accelerated layer manager with
   // transparent windows so don't even try. I'm also not sure if we even
@@ -7804,12 +7804,8 @@ nsWindow::ComputeShouldAccelerate()
   // Also see bug 1150376, D3D11 composition can cause issues on some devices
   // on Windows 7 where presentation fails randomly for windows with drop
   // shadows.
-  if (mTransparencyMode == eTransparencyTransparent ||
-      (IsPopup() && DeviceManagerDx::Get()->IsWARP()))
-  {
-    return false;
-  }
-  return nsBaseWidget::ComputeShouldAccelerate();
+  return mTransparencyMode != eTransparencyTransparent &&
+         !(IsPopup() && DeviceManagerDx::Get()->IsWARP());
 }
 
 void
diff --git a/widget/windows/nsWindow.h b/widget/windows/nsWindow.h
index 185b72130a52..33c76f8b753d 100644
--- a/widget/windows/nsWindow.h
+++ b/widget/windows/nsWindow.h
@@ -261,7 +261,7 @@ public:
    * Misc.
    */
   virtual bool            AutoErase(HDC dc);
-  bool ComputeShouldAccelerate() override;
+  bool WidgetTypeSupportsAcceleration() override;
 
   void                    ForcePresent();
 
diff --git a/xpcom/base/nsCycleCollector.cpp b/xpcom/base/nsCycleCollector.cpp
index c92d5501e40e..80eb29aeff13 100644
--- a/xpcom/base/nsCycleCollector.cpp
+++ b/xpcom/base/nsCycleCollector.cpp
@@ -2724,7 +2724,7 @@ public:
   virtual void Trace(JS::TenuredHeap* aObject, const char* aName,
                      void* aClosure) const override
   {
-    AppendJSObjectToPurpleBuffer(*aObject);
+    AppendJSObjectToPurpleBuffer(aObject->unbarrieredGetPtr());
   }
 
   virtual void Trace(JS::Heap* aString, const char* aName,
diff --git a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
index dbe55d3336ba..eb06a389c1f7 100644
--- a/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
+++ b/xpcom/base/nsCycleCollectorTraceJSHelpers.cpp
@@ -72,8 +72,8 @@ void
 TraceCallbackFunc::Trace(JS::TenuredHeap* aPtr, const char* aName,
                          void* aClosure) const
 {
-  if (aPtr->getPtr()) {
-    mCallback(JS::GCCellPtr(aPtr->getPtr()), aName, aClosure);
+  if (*aPtr) {
+    mCallback(JS::GCCellPtr(aPtr->unbarrieredGetPtr()), aName, aClosure);
   }
 }
 
diff --git a/xpcom/build/XPCOMInit.cpp b/xpcom/build/XPCOMInit.cpp
index 1dda9e819964..55dc551610aa 100644
--- a/xpcom/build/XPCOMInit.cpp
+++ b/xpcom/build/XPCOMInit.cpp
@@ -802,6 +802,7 @@ NS_InitMinimalXPCOM()
   }
 
   AbstractThread::InitStatics();
+  SharedThreadPool::InitStatics();
 
   return NS_OK;
 }
diff --git a/xpcom/build/XPCOMModule.inc b/xpcom/build/XPCOMModule.inc
index 5513d9d9b156..5ac2885e2b31 100644
--- a/xpcom/build/XPCOMModule.inc
+++ b/xpcom/build/XPCOMModule.inc
@@ -52,7 +52,7 @@
     COMPONENT(ENVIRONMENT, nsEnvironment::Create)
 
     COMPONENT(THREADMANAGER, nsThreadManagerGetSingleton)
-    COMPONENT(THREADPOOL, nsThreadPoolConstructor)
+    COMPONENT_M(THREADPOOL, nsThreadPoolConstructor, Module::ALLOW_IN_GPU_PROCESS)
 
     COMPONENT(STRINGINPUTSTREAM, nsStringInputStreamConstructor)
     COMPONENT(MULTIPLEXINPUTSTREAM, nsMultiplexInputStreamConstructor)
diff --git a/xpcom/ds/nsISupportsArray.idl b/xpcom/ds/nsISupportsArray.idl
index f0fc0e851db7..2cc90186100f 100644
--- a/xpcom/ds/nsISupportsArray.idl
+++ b/xpcom/ds/nsISupportsArray.idl
@@ -58,8 +58,6 @@ interface nsISupportsArray : nsICollection {
   void DeleteLastElement(in nsISupports aElement);
   void DeleteElementAt(in unsigned long aIndex);
   
-  [notxpcom] boolean AppendElements(in nsISupportsArray aElements);
-  
   void Compact();
   
 
@@ -68,9 +66,6 @@ interface nsISupportsArray : nsICollection {
   [notxpcom] boolean MoveElement(in long aFrom,
                                  in long aTo);
 
-  [notxpcom] boolean InsertElementsAt(in nsISupportsArray aOther,
-                                      in unsigned long aIndex);
-
   [notxpcom] boolean RemoveElementsAt(in unsigned long aIndex,
                                       in unsigned long aCount);
 
diff --git a/xpcom/ds/nsSupportsArray.cpp b/xpcom/ds/nsSupportsArray.cpp
index eb75fc33ba55..4e6a7d772489 100644
--- a/xpcom/ds/nsSupportsArray.cpp
+++ b/xpcom/ds/nsSupportsArray.cpp
@@ -4,7 +4,9 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
+#include 
 #include 
+#include "mozilla/CheckedInt.h"
 #include "mozilla/MathAlgorithms.h"
 #include "nsSupportsArray.h"
 #include "nsSupportsArrayEnumerator.h"
@@ -92,9 +94,6 @@ nsQueryElementAt::operator()(const nsIID& aIID, void** aResult) const
   return status;
 }
 
-static const int32_t kGrowArrayBy = 8;
-static const int32_t kLinearThreshold = 16 * sizeof(nsISupports*);
-
 nsSupportsArray::nsSupportsArray()
 {
   mArray = mAutoArray;
@@ -113,9 +112,12 @@ nsSupportsArray::~nsSupportsArray()
   DeleteArray();
 }
 
-void
-nsSupportsArray::GrowArrayBy(int32_t aGrowBy)
+bool
+nsSupportsArray::GrowArrayBy(uint32_t aGrowBy)
 {
+  const uint32_t kGrowArrayBy = 8;
+  const uint32_t kLinearThreshold = 16 * sizeof(nsISupports*);
+
   // We have to grow the array. Grow by kGrowArrayBy slots if we're smaller
   // than kLinearThreshold bytes, or a power of two if we're larger.
   // This is much more efficient with most memory allocators, especially
@@ -124,15 +126,24 @@ nsSupportsArray::GrowArrayBy(int32_t aGrowBy)
     aGrowBy = kGrowArrayBy;
   }
 
-  uint32_t newCount = mArraySize + aGrowBy;  // Minimum increase
-  uint32_t newSize = sizeof(mArray[0]) * newCount;
+  CheckedUint32 newCount(mArraySize);
+  newCount += aGrowBy;  // Minimum increase
+  CheckedUint32 newSize(sizeof(mArray[0]));
+  newSize *= newCount;
 
-  if (newSize >= (uint32_t)kLinearThreshold) {
+  if (!newSize.isValid()) {
+    return false;
+  }
+
+  if (newSize.value() >= kLinearThreshold) {
     // newCount includes enough space for at least kGrowArrayBy new slots.
     // Select the next power-of-two size in bytes above that if newSize is
     // not a power of two.
-    if (newSize & (newSize - 1)) {
-      newSize = 1u << mozilla::CeilingLog2(newSize);
+    if (newSize.value() & (newSize.value() - 1)) {
+      newSize = UINT64_C(1) << mozilla::CeilingLog2(newSize.value());
+      if (!newSize.isValid()) {
+        return false;
+      }
     }
 
     newCount = newSize / sizeof(mArray[0]);
@@ -141,8 +152,8 @@ nsSupportsArray::GrowArrayBy(int32_t aGrowBy)
   // XXX PR_Realloc(), etc
   nsISupports** oldArray = mArray;
 
-  mArray = new nsISupports*[newCount];
-  mArraySize = newCount;
+  mArray = new nsISupports*[newCount.value()];
+  mArraySize = newCount.value();
 
 #if DEBUG_SUPPORTSARRAY
   if (oldArray == mArray) { // can't happen without use of realloc
@@ -165,6 +176,8 @@ nsSupportsArray::GrowArrayBy(int32_t aGrowBy)
       delete[] oldArray;
     }
   }
+
+  return true;
 }
 
 nsresult
@@ -351,9 +364,17 @@ NS_IMETHODIMP_(bool)
 nsSupportsArray::InsertElementAt(nsISupports* aElement, uint32_t aIndex)
 {
   if (aIndex <= mCount) {
-    if (mArraySize < (mCount + 1)) {
+    CheckedUint32 newCount(mCount);
+    newCount += 1;
+    if (!newCount.isValid()) {
+      return false;
+    }
+
+    if (mArraySize < newCount.value()) {
       // need to grow the array
-      GrowArrayBy(1);
+      if (!GrowArrayBy(1)) {
+        return false;
+      }
     }
 
     // Could be slightly more efficient if GrowArrayBy knew about the
@@ -381,51 +402,6 @@ nsSupportsArray::InsertElementAt(nsISupports* aElement, uint32_t aIndex)
   return false;
 }
 
-NS_IMETHODIMP_(bool)
-nsSupportsArray::InsertElementsAt(nsISupportsArray* aElements, uint32_t aIndex)
-{
-  if (!aElements) {
-    return false;
-  }
-  uint32_t countElements;
-  if (NS_FAILED(aElements->Count(&countElements))) {
-    return false;
-  }
-
-  if (aIndex <= mCount) {
-    if (mArraySize < (mCount + countElements)) {
-      // need to grow the array
-      GrowArrayBy(countElements);
-    }
-
-    // Could be slightly more efficient if GrowArrayBy knew about the
-    // split, but the difference is trivial.
-    uint32_t slide = (mCount - aIndex);
-    if (0 < slide) {
-      ::memmove(mArray + aIndex + countElements, mArray + aIndex,
-                slide * sizeof(nsISupports*));
-    }
-
-    for (uint32_t i = 0; i < countElements; ++i, ++mCount) {
-      // use GetElementAt to copy and do AddRef for us
-      if (NS_FAILED(aElements->GetElementAt(i, mArray + aIndex + i))) {
-        return false;
-      }
-    }
-
-#if DEBUG_SUPPORTSARRAY
-    if (mCount > mMaxCount &&
-        mCount < (int32_t)(sizeof(MaxElements) / sizeof(MaxElements[0]))) {
-      MaxElements[mCount]++;
-      MaxElements[mMaxCount]--;
-      mMaxCount = mCount;
-    }
-#endif
-    return true;
-  }
-  return false;
-}
-
 NS_IMETHODIMP_(bool)
 nsSupportsArray::ReplaceElementAt(nsISupports* aElement, uint32_t aIndex)
 {
diff --git a/xpcom/ds/nsSupportsArray.h b/xpcom/ds/nsSupportsArray.h
index d6b3161cae50..e0200f2d23c4 100644
--- a/xpcom/ds/nsSupportsArray.h
+++ b/xpcom/ds/nsSupportsArray.h
@@ -113,19 +113,10 @@ public:
     return (RemoveElementAt(aIndex) ? NS_OK : NS_ERROR_FAILURE);
   }
 
-  MOZ_MUST_USE NS_IMETHOD_(bool)
-  AppendElements(nsISupportsArray* aElements) override
-  {
-    return InsertElementsAt(aElements, mCount);
-  }
-
   NS_IMETHOD Compact(void) override;
 
   MOZ_MUST_USE NS_IMETHOD Clone(nsISupportsArray** aResult) override;
 
-  MOZ_MUST_USE NS_IMETHOD_(bool)
-  InsertElementsAt(nsISupportsArray* aOther, uint32_t aIndex) override;
-
   MOZ_MUST_USE NS_IMETHOD_(bool)
   RemoveElementsAt(uint32_t aIndex, uint32_t aCount) override;
 
@@ -134,7 +125,7 @@ public:
 protected:
   void DeleteArray(void);
 
-  void GrowArrayBy(int32_t aGrowBy);
+  bool GrowArrayBy(uint32_t aGrowBy);
 
   nsISupports** mArray;
   uint32_t mArraySize;